STM32F0x HAL库学习笔记(8)外部中断的配置

本文开发环境:

  • MCU型号:STM32F051R8T6
  • IDE环境: MDK 5.25
  • 代码生成工具:STM32CubeMx 5.2.0
  • HAL库版本:v1.9.0(STM32Cube MCU Package for STM32F0 Series)

本文内容:

  1. STM32CubeMx 配置外部中断

外部中断简介

这里的外部指的是单片机以外,所以通过IO的输入来获取中断,典型的外部中断有按键和一些传感器工作状态的输出等。外部中断有事件和中断两种类型,简单来说中断类型是将中断递给NVIC,让CPU去即响应这种中断。而事件模式则是递给其他的外设处理,参考博客:《EXTI中断和事件的区别》《STM32的“外部中断”和“事件”区别和理解》

初始化IO口为外部中断

通用初始化

通用初始化指的是系统时钟(RCC)的配置,调试口(SW/JTAG)使能等等,每一个工程都需要的配置,详见:STM32CubeMx 初始化和读/写 IO口操作

外部中断配置

本文使用的开发板PA0连接了一个按键在PA0引脚处,所以以PA0为例演示外部中断的配置:

  1. 将IO口配置为中断模式,在PA0引脚处右键,弹出的选项菜单中选择“GPIO_EXTI0”,如下图所示:
    STM32F0x HAL库学习笔记(8)外部中断的配置
  2. 配置IO的中断,本文将PA0口配置为外部中断模式,上拉输入,双边沿触发,具体操作如下:
    STM32F0x HAL库学习笔记(8)外部中断的配置
  3. 配置NVIC,注意这里有2步,就是NVIC中断使能后,还需要在 “Code generation” 中选择生成代码,具体操作如下:
    STM32F0x HAL库学习笔记(8)外部中断的配置
    STM32F0x HAL库学习笔记(8)外部中断的配置

示例程序

当我们配置好外部中断以后,一旦发生外部中断,程序就会调用外部中断回调函数,所以我们需要在回调函数中写入代码,如下图所示:

... ...
#include "usart.h"
... ...
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
	{
		uint8_t str[7] = "EXTI0\r\n";
		HAL_UART_Transmit(&huart1,str,7,0x200);
	}
}

这里使用了串口来验证程序是否进入了中断,回调函数是不需要用户声明的,CubeMx工程已经做了相关操作,直接重写即可,这段代码可以添加在mian.c函数中,也可以添加在 gpio.c 中或其他文件中。

下载验证

程序编写完成以后,就可以编译下载,验证功能:
STM32F0x HAL库学习笔记(8)外部中断的配置
注意,由于是上下边缘触发,所以按下和抬起,都会触发一次中断,由于本例程没有做按键消抖,所以有时候会发现按下一次,触发几次的情况。