本文开发环境:
- MCU型号:STM32F051R8T6
- IDE环境: MDK 5.25
- 代码生成工具:STM32CubeMx 5.2.0
- HAL库版本:v1.9.0(STM32Cube MCU Package for STM32F0 Series)
本文内容:
外部中断简介
这里的外部指的是单片机以外,所以通过IO的输入来获取中断,典型的外部中断有按键和一些传感器工作状态的输出等。外部中断有事件和中断两种类型,简单来说中断类型是将中断递给NVIC,让CPU去即响应这种中断。而事件模式则是递给其他的外设处理,参考博客:《EXTI中断和事件的区别》,《STM32的“外部中断”和“事件”区别和理解》
初始化IO口为外部中断
通用初始化
通用初始化指的是系统时钟(RCC)的配置,调试口(SW/JTAG)使能等等,每一个工程都需要的配置,详见:STM32CubeMx 初始化和读/写 IO口操作
外部中断配置
本文使用的开发板PA0连接了一个按键在PA0引脚处,所以以PA0为例演示外部中断的配置:
- 将IO口配置为中断模式,在PA0引脚处右键,弹出的选项菜单中选择“GPIO_EXTI0”,如下图所示:
- 配置IO的中断,本文将PA0口配置为外部中断模式,上拉输入,双边沿触发,具体操作如下:
- 配置NVIC,注意这里有2步,就是NVIC中断使能后,还需要在 “Code generation” 中选择生成代码,具体操作如下:
(这一步可能是非必须的)
示例程序
当我们配置好外部中断以后,一旦发生外部中断,程序就会调用外部中断回调函数,所以我们需要在回调函数中写入代码,如下图所示:
..
... ...
#include "usart.h"
... ...
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
uint8_t str[7] = "EXTI0rn";
HAL_UART_Transmit(&huart1,str,7,0x200);
}
}
这里使用了串口来验证程序是否进入了中断,回调函数是不需要用户声明的,CubeMx工程已经做了相关操作,直接重写即可,这段代码可以添加在mian.c函数中,也可以添加在 gpio.c 中或其他文件中。
下载验证
程序编写完成以后,就可以编译下载,验证功能:
注意,由于是上下边缘触发,所以按下和抬起,都会触发一次中断,由于本例程没有做按键消抖,所以有时候会发现按下一次,触发几次的情况。
本文开发环境:
- MCU型号:STM32F051R8T6
- IDE环境: MDK 5.25
- 代码生成工具:STM32CubeMx 5.2.0
- HAL库版本:v1.9.0(STM32Cube MCU Package for STM32F0 Series)
本文内容:
外部中断简介
这里的外部指的是单片机以外,所以通过IO的输入来获取中断,典型的外部中断有按键和一些传感器工作状态的输出等。外部中断有事件和中断两种类型,简单来说中断类型是将中断递给NVIC,让CPU去即响应这种中断。而事件模式则是递给其他的外设处理,参考博客:《EXTI中断和事件的区别》,《STM32的“外部中断”和“事件”区别和理解》
初始化IO口为外部中断
通用初始化
通用初始化指的是系统时钟(RCC)的配置,调试口(SW/JTAG)使能等等,每一个工程都需要的配置,详见:STM32CubeMx 初始化和读/写 IO口操作
外部中断配置
本文使用的开发板PA0连接了一个按键在PA0引脚处,所以以PA0为例演示外部中断的配置:
- 将IO口配置为中断模式,在PA0引脚处右键,弹出的选项菜单中选择“GPIO_EXTI0”,如下图所示:
- 配置IO的中断,本文将PA0口配置为外部中断模式,上拉输入,双边沿触发,具体操作如下:
- 配置NVIC,注意这里有2步,就是NVIC中断使能后,还需要在 “Code generation” 中选择生成代码,具体操作如下:
(这一步可能是非必须的)
示例程序
当我们配置好外部中断以后,一旦发生外部中断,程序就会调用外部中断回调函数,所以我们需要在回调函数中写入代码,如下图所示:
..
... ...
#include "usart.h"
... ...
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
uint8_t str[7] = "EXTI0rn";
HAL_UART_Transmit(&huart1,str,7,0x200);
}
}
这里使用了串口来验证程序是否进入了中断,回调函数是不需要用户声明的,CubeMx工程已经做了相关操作,直接重写即可,这段代码可以添加在mian.c函数中,也可以添加在 gpio.c 中或其他文件中。
下载验证
程序编写完成以后,就可以编译下载,验证功能:
注意,由于是上下边缘触发,所以按下和抬起,都会触发一次中断,由于本例程没有做按键消抖,所以有时候会发现按下一次,触发几次的情况。
举报