STM32 HAL库函数学习 GPIO篇
1、void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, const GPIO_InitTypeDef *pGPIO_Init)
GPIO外设属于是任何芯片的最基础功能 ,STM32各个系列的GPIO初始化都是一致的,有不同的是部分系列在IO复用使用了单独一个成员属性Alternate 来表明这个IO的具体复用功能,但是一些旧系列并没有这个属性,因此在编写程序时需要注意本系列单片机是否存在这个属性。
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE(); //使能需要使用的GPIO组的时钟__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5; //选择使用的GPIO管脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //选择使用的模式GPIO_InitStruct.Pull = GPIO_NOPULL; //选择上下拉模式GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //选择GPIO的速度HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}
2、void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
GPIO的复位配置函数,函数传参同上。值得注意的是STM32调用此函数之后对应的GPIO口的配置被恢复到未配置之前的状态也就是模拟输入模式,这也是STM32所有的IO上电或者复位后的初始化模式。
3、GPIO_PinState HAL_GPIO_ReadPin(const GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取IO口的电平状态函数,此函数不区分GPIO的输入输出模式,电平状态都可以直接读取。
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4) == GPIO_PIN_SET){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);}
4、void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
GPIO口的输出电平设置,只能使用在GPIO口为输出模式的情况下。
//设置(输出)高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//设置(输出)低电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
5、void HAL_GPIO_WriteMultipleStatePin(GPIO_TypeDef *GPIOx, uint16_t PinReset, uint16_t PinSet)
同组GPIO多个IO同时控制函数,本函数可以对同一组的IO口两种电平状态同时输出。相当于控制多个IO设置高电平和设置低电平一条函数完成。前提是必须同一个GPIO组。并非所有的系列都可以使用本函数。
HAL_GPIO_WriteMultipleStatePin(GPIOB,GPIO_PIN_4,GPIO_PIN_5);
//设置GPIOB4低电平 设置GPIOB5高电平
//相当于
//设置PB5(输出)高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//设置PB4(输出)低电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
优点是是一条语句可以替代多条语句,IO口可以通过或运算组合,另外本函数操作属于原子操作,无法被中断打断,这在有操作系统和实时控制行业中非常有用。
6、void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIO口翻转目前电平状态的函数,属于经常使用的重点函数。常用在控制LED灯闪烁的场景。
void HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
//让PB4输出当前电平状态相反的电平
7、HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIO口配置锁死函数。其目的是为了防止在配置好IO口后在程序中其他地方再次修改IO的配置造成故障,使用本函数后当前的IO模式不能被修改,除非程序复位后才能修改。
HAL_GPIO_LockPin(GPIOB,GPIO_PIN_4);
//GPIOB4 的当前的配置无法被修改
8、void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
外部中断请求处理函数,首先配置GPIO的模式为上升沿或者下降沿监测,GPIO口作为中断口使用的时候不属于复用功能。随后设置外部中断线的优先级并启动本中断。STM32 中一旦开启了中断即必须有对应的中断服务函数,否则可能会造成死机。
在HAL_GPIO_EXTI_IRQHandler函数中会调用一个回调函数来完成最终的中断处理,因为不同系列调用的回调函数不一致,因此需要打开本函数内部找到具体调用哪一个回调函数。例如在H5系列中回调函数区分上升沿和下降沿,按照需要调用。
__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Pull = GPIO_PULLDOWN;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);HAL_NVIC_SetPriority(EXTI0_IRQn,0,1); //设置优先级HAL_NVIC_EnableIRQ(EXTI0_IRQn); //开启外部中断void EXTI0_IRQHandler() //中断服务函数
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//响应中断请求函数
}void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin){case GPIO_PIN_0://具体任务实现break;}
}
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{}