STM32L431微控制器GPIO系列代码实战运用与HAL库操作指南

在STM32CUBEIDE的图形配置中,可以看到,GPIO有4种可以配置的选项,分别是GPIO_INPUT,GPIO_OUTPUT,GPIO_ANALOG和GPIO_EXTIx。

1.GPIO_input

这个功能比较简单,就是配置一个GPIO的输入引脚,用来检测输入信号是否是高低电平,需要配置的功能也很少,只需要配置是否是否需要上下拉电阻。

所用到的函数为:GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
举例:if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
该代码就是判断,GPIOA的GPIO_PIN_0是否高电平

2. GPIO_Output

GPIO常见的功能,输出功能。主要就是用来输出高低电平,例如驱动LED灯,或者是驱动三极管。

2.1 GPIO output level

这个配置主要是用到设置该引脚的默认输出是高电平还是低电平

2.2 GPIO mode

这个配置有两种选项可以进行配置

第一个是推挽输出,可以理解为单片机内部输出电压,驱动外部电路。一般的LED灯控制都是通过该引脚模式进行控制的。
第二个是开漏输出,该引脚只有断路和接地这两个状态,所以需要上拉电阻来进行外部供电驱动外部电路。开漏输出引脚很特别,可以检测引脚的高低电平,所以在模拟I2C电路上,普遍使用这个配置。

2.3 GPIO Pull-up/Pull-down

配置引脚的上下拉电阻

2.4 Maximun output speed

配置引脚的输出速度,按照默认的就行。目前还不知道在哪个项目中需要配置该选项

2.5 常用函数

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
这个函数用来写入引脚驱动高低电平的。
举例:HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_SET);
说明:将GPIOA的0脚1脚配置为高电平

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
这个函数是用来翻转某个引脚的电平的。
举例:HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);
说明:将GPIOA的0脚的电平翻转

3.GPIO_Analog

暂时还没有用到过

4.GPIO_EXITx

GPIO的中断配置,一般有上升沿、下降沿中断触发和上升沿、下降沿事件触发

一般是用来检测按键输入从而触发中断来进行一些相关操作的

4.1 GPIO mode


1.External Interrupt Mode with Rising edde trigger detection
该模式只检测引脚上升沿信号,从而触发中断信号
2.External Interrupt Mode with Falling edde trigger detection
该模式只检测引脚下降沿信号,从而触发中断信号
3.External Interrupt Mode with Rising/Falling edde trigger detection
该模式检测引脚上升沿下降沿信号,从而触发中断信号
4.External Event Mode with Rising edde trigger detection
该模式只检测引脚上升沿信号,从而触发事件
5.External Event Mode with Falling edde trigger detection
该模式只检测引脚下降沿信号,从而触发事件
6.External Event Mode with Rising/Falling edde trigger detection
该模式检测引脚上升沿下降沿信号,从而触发中断信号
6个模式中,使用比较多的应该是前面3个,后面3个的与事件相关,暂时没有用到

4.2 GPIO Pull-up/Pull-down

配置引脚的上下拉电阻

4.3 需要注意的东西

在图形配置界面,需要在GPIO窗口配置好后,再去NVIC中,打开中断,否则无法进入到中断中

如果不在图形窗口中配置,则需要在以下的地方,添加一些东西,比如需要添加中断3

  1. 在stm32l4xx_it.c中,添加函数:
void EXTI3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI3_IRQn 0 */
  /* USER CODE END EXTI3_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  /* USER CODE BEGIN EXTI3_IRQn 1 */
  /* USER CODE END EXTI3_IRQn 1 */
}
  1. 在stm32l4xx_it.h中,添加函数:
    void EXTI3_IRQHandler(void);
  2. 在gpio.c中,添加函数:此添加的函数,在图形界面配置过也需要添加
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_3)
	{
		//添加需要的函数,该判断只能判断是哪个PIN脚触发,具体是GPIOA还是GPIOB,需要再自行进行编写判断函数
	}
	
}
  1. GPIO的初始化:
 __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);
  1. 说明:
    并不是所有的引脚都是EXTIx的形式,目前是这几个:EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10
    按需添加外部中断

作者:小陈的学习手册

物联沃分享整理
物联沃-IOTWORD物联网 » STM32L431微控制器GPIO系列代码实战运用与HAL库操作指南

发表回复