使用HAL库开发STM32(基于F4):GPIO口基础使用与外部中断

目的

对于MCU来说GPIO口的使用是最基础的内容,仅使用GPIO口和延时等,就可以完成很多功能了。

GPIO口基础使用

基础说明

STM32的GPIO口可以工作在以下八种模式:

  • Input floating(浮空输入)
    默认情况下GPIO口处于浮空输入模式;
  • Input pull-up(上拉输入)
    基本数字输入使用;
  • Input-pull-down(下拉输入)
    基本数字输入使用;
  • Analog(模拟)
    一般用于ADC或DAC功能复用;
  • Output open-drain with pull-up or pull-down capability(具有上拉或下拉功能的开漏输出)
    基本输出使用,一般为了输出5V高电平的时候可以用该模式,然后外部上拉电阻到5V(注意只有Datasheet中I/O structure为FT的引脚才耐5V电压);
  • Output push-pull with pull-up or pull-down capability(具有上拉或下拉功能的推挽输出)
    基本输出使用;
  • Alternate function push-pull with pull-up or pull-down capability(具有上拉或下拉功能的复用功能推挽)
    用于其它外设复用;
  • Alternate function open-drain with pull-up or pull-down capability(具有上拉或下拉功能的复用功能开漏)
    用于其它外设复用;

初始化设置

使用STM32Cube来初始化设置IO口是比较方便的,毕竟初始化代码都会自动生成,当然我们也可以自己编写初始化代码,参考下面软件生成的初始化代码:

//以下代码将PA2口初始化设置为推挽输出模式
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0}; //声明GPIO初始化数据结构

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA口时钟

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); //设置初始为低电平

  /*Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2; //设置2口
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //设置为推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //设置为低速
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化设置
}

输出与控制

输出模式算是最常用的功能,最常见的被用来接个LED做指示灯。
在这里插入图片描述

  • GPIO口设置为输出的时候模式可以配置为推挽输出或是开漏输出;
  • GPIO output level指端口初始输出状态;
  • Maximum output speed影响输出电平转换时的变化速度,速度越快变换越快,同时速度越快越容易因过冲问题对电信号产生干扰;
    在这里插入图片描述
    在编写程序时可以使用下面两个函数来改变IO口输出状态:
  • HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState)
    向指定IO口写值, GPIO_PIN_SET 为高(1), GPIO_PIN_RESET 为低(0);
  • HAL_GPIO_TogglePin(GPIOx, GPIO_Pin)
    翻转指定IO口输出值;

读取端口值

输入模式也比较常用,比如外接按钮、开关等,可以在输入模式下读取端口值来确认这些器件的状态。
在这里插入图片描述
输入模式下通过 HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) 函数来读取指定端口值,该函数返回 GPIO_PIN_SETGPIO_PIN_RESET

GPIO口与外部中断

STM32每一个IO口都可以设置外部中断,但有点限制,比如PA2设置了外部中断那么PB2、PC2、PD2……等等这些都无法设置外部中断了。所以在IO口上的外部中断最多可以设置0~15号共16个。IO口上的外部中断可以被配置成电平上升沿、下降沿、上升下降沿触发。
下面使用按钮进行外部中断使用演示,按照下图将按钮接到PA1脚,图中电容用于消除按钮操作时的电平抖动:在这里插入图片描述
按照下图进行初始化配置:
在这里插入图片描述
上图中设置了PA1脚外部中断,配置为上升下降沿均触发中断,并且将PA1设置为上拉模式,这样根据上面电路按钮未按下时端口为高电平,按钮按下时端口变为低电平。(为了方便测试这里我还启用了Debug引脚,下图就是实际调试效果)
在这里插入图片描述
上图中在软件自动生成的代码以外只添加了 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 函数,该函数就是IO口外部中断的回调函数,使用外部中断时除了配置以外我们只需要编写此函数就行。在上面例子中我在中断回调函数中读取了PA1的端口值,在调试中追踪该值。可以看到在按下和松开按钮时该值会被改变,说明中断被正确执行。

总结

GPIO口的基础使用比较简单,更多内容可以参考官方Datasheet、Reference manual、《UM1725 User Manual - Description of STM32F4 HAL and LL drivers》。

发布了66 篇原创文章 · 获赞 176 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Naisu_kun/article/details/102892103