1. 将硬件环境设置为宏定义,方便硬件环境修改:
设置包含三项:GPIO端口、GPIO引脚号和GPIO端口时钟。示例如下
#define LED1_PIN GPIO_Pin_10
#define LED1_GPIO_PORT GPIOH
#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH
#define LED2_PIN GPIO_Pin_11
#define LED2_GPIO_PORT GPIOH
#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOH
#define LED3_PIN GPIO_Pin_11
#define LED3_GPIO_PORT GPIOD
#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOD
其中GPIO_Pin_10 /GPIO_Pin_11、GPIOH / GPIOD 、RCC_AHB1Periph_GPIOH / RCC_AHB1Periph_GPIOD这些都是STM32库中的宏定义。
2. 开启GPIO外设时钟
RCC_AHB1PeriphClockCmd (LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
将要使用的GPIO端口时钟全部开启。
3. 初始化GPIO
3.1定义一个GPIO初始化结构体对象
GPIO_InitTypeDefGPIO_InitStructure;
3.2通过该结构体对象设置GPIO工作模式
a. 选择要控制的引脚:
GPIO_InitStructure.GPIO_Pin =LED1_PIN;
b. 设置引脚输入、输出出模式:
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//设置引脚为输出模式
c. 设置引脚输出类型:
GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;//设置引脚为推挽模式
d. 设置引脚上拉模式:
GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;//设置引脚为上拉
e. 设置引脚速率:
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_2MHz; //设置引脚速率为2Mhz
3.3 调用库函数使用上面的初始化结构体对象,初始化GPIO
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
以上,一个端口的初始配置即已完成。
如果有多个GPIO需要初始化,则根据端口工作模式可归类一起初始化。
如LED2_PIN和LED3_PIN工作方式与LED1_PIN一样,则初始化LED2_PIN和LED3_PIN可以在上面的基础上,如下设置:
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin =LED2_PIN;
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin =LED3_PIN;
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
即,只要重新给初始化结构体的pin脚成员变量赋新值,然后调用初始化库函数GPIO_Init即可(注意,函数第一个参数GPIO端口要对应改变)。步骤3.2下的b、c、d、e可省略。
如果端口工作模式不一样时,可多定义几个初始化结构体,将相同模式的归为一类,步骤3.2中统一设置,避免重复编写代码。
参考《零死角玩转STM32-F49挑战者》例程如下: