GPIO 相 关 的 函 数 和 定 义 分 布 在 HAL 库 文 件 stm32f4xx_hal_gpio.c 和 头 文 件
stm32f4xx_hal_gpio.h 文件中。
++++++++++++++++++++++++++++++++++
在 HAL 库开发中, 操作四个配置寄存器初始化 GPIO 是通过 GPIO 初始化函数完成:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
通常在cubemx中,会生成初始化代码,调用这个函数。
typedef struct
{
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
uint32_t Alternate;
}GPIO_InitTypeDef;
初始化 GPIO 的常用格式是:
GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10; //PF9,10
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
在MDK 中是通过宏定义来定义的,我们只需要选择对应的宏即可:
#define GPIO_MODE_INPUT 0x00000000U
#define GPIO_MODE_OUTPUT_PP 0x00000001U
#define GPIO_MODE_OUTPUT_OD 0x00000011U
……省略部分宏定义
#define GPIO_MODE_EVT_RISING_FALLING 0x10320000U
#define GPIO_NOPULL 0x00000000U
#define GPIO_PULLUP 0x00000001U
#define GPIO_PULLDOWN 0x00000002U
#define GPIO_SPEED_FREQ_LOW 0x00000000U
#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U
#define GPIO_SPEED_FREQ_HIGH 0x00000002U
#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U
+++++++++++++++++++++++++++++++++++++++++++
在 HAL 库 中 设 置 ODR 寄 存 器 的 值 来 控 制 IO 口 的 输 出 状 态 是 通 过 函 数
HAL_GPIO_WritePin 来实现的:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,GPIO_PinState PinState)
实例如下:
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
+++++++++++++++++++++++++++++++++++++++++++
读取某个 IO 的电平,库函数相关函数为:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
比如我们要读取 GPIOF.5 的输入电平,
HAL_GPIO_ReadPin (GPIOF, GPIO_Pin_5);
+++++++++++++++++++++++++++++++++++++++++++++
GPIO 相关的函数我们先讲解到这里。虽然 IO 操作步骤很简单,这里我们还是做个概括性
的总结,操作步骤为:
1) 使能 IO 口时钟。调用函数为__HAL_RCC_GPIOF_CLK_ENABLE();
2) 初始化 IO 参数。调用函数 HAL_GPIO_Init();
3) 操作 IO。
++++++++++++++++++++++++++++++++++++++++++++++
如果在cubemx中,为GPIO添加了user label,
那么在main.h中,就会出现类似于如下的宏定义:
#define beep_Pin GPIO_PIN_8
#define beep_GPIO_Port GPIOF
#define led1_Pin GPIO_PIN_9
#define led1_GPIO_Port GPIOF
#define led2_Pin GPIO_PIN_10
#define led2_GPIO_Port GPIOF
这样,我们就可以改写之前的代码,例如:
//HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(led1_GPIO_Port ,led1_Pin ,GPIO_PIN_SET);