在使用中,除了在STM32CubeMX中配置之外,还需要自己在代码中做一些配置,学习并理解HAL库,也是必须掌握的。
本文介绍常用的和GPIO操作相关的库函数。
新建好项目,并在MDK中打开代码文件,找到stm32f1xx_hal_gpio.h,GPIO操作相关库函数在这个文件中可以看到。
打开stm32f1xx_hal_gpio.h 后, 发现一共定义有8个函数:
/* Initialization and de-initialization functions *****************************/
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
/* IO operation functions *****************************************************/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
分别说明如下:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
功能:使引脚恢复成默认的状态,即各个寄存器复位时的值
实例:HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:对应引脚写0或1
实例:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,0);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:对应引脚电平翻转
实例:HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。
实例:HAL_GPIO_LockPin(GPIOA, GPIO_PIN_9);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
功能: 外部中断服务函数,清除中断标志位
实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_6);
函数中用到的 GPIO_InitTypeDef 结构体定义说明:
typedef struct
{
uint32_t Pin; // 选择引脚
uint32_t Mode; // 设置引脚模式
uint32_t Pull; // 引脚是否上拉或下拉
uint32_t Speed; // 设置引脚速度
} GPIO_InitTypeDef;