STM32 HAL库函数学习 GPIO篇

1、void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, const GPIO_InitTypeDef *pGPIO_Init)

GPIO外设属于是任何芯片的最基础功能 ,STM32各个系列的GPIO初始化都是一致的,有不同的是部分系列在IO复用使用了单独一个成员属性Alternate 来表明这个IO的具体复用功能,但是一些旧系列并没有这个属性,因此在编写程序时需要注意本系列单片机是否存在这个属性。

cpp 复制代码
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的输入输出模式,电平状态都可以直接读取。

cpp 复制代码
    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口为输出模式的情况下。

cpp 复制代码
//设置(输出)高电平
		  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组。并非所有的系列都可以使用本函数。

cpp 复制代码
		 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灯闪烁的场景。

cpp 复制代码
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模式不能被修改,除非程序复位后才能修改。

cpp 复制代码
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系列中回调函数区分上升沿和下降沿,按照需要调用。

cpp 复制代码
  __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)
{
    
}
相关推荐
2301_803652742 分钟前
tiktoken学习
学习
小赵哦5 分钟前
TMS320F28388D使用sysconfig配置IPC
单片机·dsp开发
许有杨3 小时前
智能门禁的项目
单片机·嵌入式硬件
快乐肚皮4 小时前
Redisson学习专栏(三):高级特性与实战(Spring/Spring Boot 集成,响应式编程,分布式服务,性能优化)
spring boot·学习·spring·redisson·高级特性
学渣676564 小时前
vscode开发stm32,main.c文件中出现很多报错影响开发解决日志
c语言·vscode·stm32
Rousson4 小时前
硬件学习笔记--64 MCU的ARM核架构发展及特点
笔记·单片机·学习
FAREWELL000755 小时前
Unity基础学习(十二)Unity 物理系统之范围检测
学习·unity·c#·游戏引擎·范围检测
fengye2071615 小时前
板凳-------Mysql cookbook学习 (九)
android·学习·mysql
qq_393828226 小时前
万兴PDF手机版
windows·学习·pdf·软件需求·安全架构
爱意随风起风止意难平7 小时前
004 flutter基础 初始文件讲解(3)
学习·flutter