嵌入式学习---GPIO工作模式配置

1.配置流程

(1)时钟使能

(2)结构体赋值

(3)写入寄存器

2.配置说明

2.1需要先明确使能的时钟属于哪一组GPIO,然后调用HAL函数库中的使能函数进行使能。

__GPIOA_CLK_ENABLE();                   //使能GPIOA时钟

2.2结构体赋值

在HAL库中stm32f7xx_hal.gpio.h文件中,可以看到GPIO_InitTypeDef结构体定义,如下:

typedef struct
{
uint32_t Pin; //指定 IO 口
uint32_t Mode; //模式设置
uint32_t Pull; //上下拉设置
uint32_t Speed; //速度设置
uint32_t Alternate;//复用映射配置
}GPIO_InitTypeDef;

赋值说明

(1)Pin:指定IO口

(2)Mode:模式设置,输入输出模式一共有以下8种

GPIO_Mode_AIN             /*模拟输入,特点:应用ADC模拟输入,或者低功耗下省电*/

GPIO_Mode_IN_FLOATING     /*浮空输入,特点:浮空输入一般多用于外部按键输入,IO的电平状态是不确定
的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的*/

GPIO_Mode_IPD             /*下拉输入,特点:默认低电平*/

GPIO_Mode_IPU             /*上拉输入,特点:默认高电平*/

GPIO_Mode_Out_OD          /*开漏输出,特点:IO输出0接GND,IO输出1,悬空;接上拉电阻才可以输出高
电平,上升沿速度慢。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);可以将多个开漏输出的
Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。*/

GPIO_Mode_Out_PP          /*推挽输出,特点:可以输出高,低电平,导通损耗小,效率高,读输入值是未
知的*/

GPIO_Mode_AF_OD           /*复用开漏输出,特点:可以理解为GPIO口被用作第二功能时的配置情况(即并
非作为通用IO口使用),如:片内外设功能(TX1,MOSI,MISO.SCK.SS)*/

GPIO_Mode_AF_PP           /*复用推挽输出,特点:可以理解为GPIO口被用作第二功能时的配置情况(即并
非作为通用IO口使用),如:片内外设功能(I2C的SCL,SDA)*/

(3)Pull:作为输入引脚时指定

(4)Speed:引脚速度,GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。

高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。例如:

① USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省电也噪声小。

② I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度。

③ SPI接口,若使用18M或9M波特率,需要选用50M的GPIO的引脚速度。
(5)Alternate:引脚复用映射

①复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚)

STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。

②重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功 能的引出脚位是可通过程序改变到其他的引脚上!

直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。

如:USART1: 0: 没有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。

通过参照datasheet上的引脚映射说明,来配置相应复用功能。

3.写入寄存器

在结构体赋值完成后,调用HAL库中函数将结构体中的值写入到寄存器。

HAL_GPIO_Init(GPIOG,&GPIO_Initure);             //写入寄存器

4.举例

//普通输出引脚
void GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;       
    __GPIOA_CLK_ENABLE();//开启GPIOA时钟
    
    GPIO_Initure.Pin   = GPIO_PIN_10;           //PA10 
    GPIO_Initure.Mode  = GPIO_MODE_OUTPUT_PP;   //推挽输出
    GPIO_Initure.Pull  = GPIO_PULLUP;           //上拉
    GPIO_Initure.Speed = GPIO_SPEED_HIGH;       //高速

    HAL_GPIO_Init(GPIOA, &GPIO_Initure);        //初始化
}

//SPI复用
void SPI1_Gpio_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;       
    __GPIOG_CLK_ENABLE();//开启GPIOG时钟
    
    GPIO_Initure.Pin=SPI1_MISO_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_Initure.Pull=GPIO_NOPULL;                  //无上下拉
    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速    
    GPIO_Initure.Alternate=GPIO_AF5_SPI1;           //复用为SPI1
    HAL_GPIO_Init(GPIOG,&GPIO_Initure);             //初始化
}
//外部中断
void EXIT_init(void) 
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOD_CLK_ENABLE();                //开启GPIOD时钟

    GPIO_Initure.Pin  = SPI1_INTR_PIN;              //PD8
    GPIO_Initure.Speed = GPIO_SPEED_HIGH;        //高速
    GPIO_Initure.Mode = GPIO_MODE_IT_RISING;     //上升沿沿触发
    GPIO_Initure.Pull = GPIO_PULLDOWN;           //下拉
    HAL_GPIO_Init(SPI1_INTR_PORT,&GPIO_Initure);

    //中断线0
    //HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);        //抢占优先级为2,子优先级为0
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);              //使能中断线0
}

部分参照:http://www.openedv.com/posts/list/32730.htm

猜你喜欢

转载自blog.csdn.net/qq_28086285/article/details/82724658
今日推荐