摘要
这一章,主要讲解STM32单片机外部中断的应用,实现以外部中断的形式,通过一个按键改变LED灯的工作状态。工程可以在前一章的GPIO输入与输出的基础上修改。复制GPIO_InOut的工程,修改文件夹名为EXIT。
配置工程
新建工程,可参考 STM32CubeMX系列教程0:创建工程
安装环境,可参考 STM32开发环境安装
修改引脚模式
打开已经复制并修改好的工程目录,双击打开GPIO_InOut.ioc。
将KEY所在的引脚PC13配置为GPIO_EXIT模式。因为在第13脚,所以事EXIT13,又叫做中断线13。
配置GPIO
打开GPIO设置,选中外部中断引脚,我这里事PC13。因我这里PC13是经过按键接地,所以这里应该配置为下降沿中断,并且开启上拉。
①上升沿 触发外部中断
②下降沿 触发触发外部中断
③上升沿/下降沿 都触发外部中断
如果单片机系统中,按键没有设置外部的上拉或者下拉电阻,则需要在单片机中开启单片机内部的上拉或者下拉电阻。如果有外部上拉,则不需要,选择浮空即可,我这里需要开启上拉。
开启外部中断
在NVIC(嵌套向量中断控制器)中,勾选EXIT Line\[15:10\] interrupt
使能PA13中断,[15:10]表示开启从10~15的6条中断线。13就包含其中。
①中断优先级分组
②抢占优先级
③响应优先级
中断优先级分组
简单讲解一下优先级分组。STM32以4个比特位表示中断的抢占优先级和响应优先级。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有23 个 ,也就是8个优先级),1位用于响应优先级(优先级有21=2个优先级)。
中断优先级
简单介绍一下NVIC(嵌套向量中断控制器)。NVIC就是控制中断响应的。主要由三个参数,一个是中断使能,一个是抢占优先级,还有一个就是响应优先级。(优先级数值越小,优先级别越高)
中断使能很好理解,就是是否开启中断,如果开启中断,则满足中断触发条件时程序会跳到中断服务程序运行,否则不响应中断主程序继续运行。
抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。例如A中断触发,正在运行A中断的服务程序,此时B中断也触发,如果B中断的抢占优先级比A的高,则程序会打断A的中断服务程序,去运行B的中断服务程序,即中断嵌套。等B的中断服务程序运行完后继续运行A的中断服务程序。如果B的抢占优先级没有高过A的抢占优先级,则程序不会打断A的中断服务程序,而是待定A的中断服务程序运行完成后才运行B的中断服务程序。
响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。如果几个抢占优先相同的中断同时触发,那么响应优先级高的最先运行。
判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,响应优先高的中断优先级别高。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。中断向量表到单片机数据手册中查看。
生成工程
配置好STM32CubeMX后,生成工程,打开工程。
编写用户程序
打开新生成的keil工程,找到main(void)函数,删除while语句中上一章写的代码。
编写中断回调函数
①打开工程库文件目录;
②打开gpio库文件的函数目录,
③找到HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),双击,即可跳转到函数所在行。
函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)这个函数,就是HAL库为用户提供的外部中断回调函数入口。我们复制这个函数名,包括参数一起复制。回到main.c文件,在文件最下方,在 USER CODE BEGIN 4 与 USER CODE END 4 之间重建中断回调函数。在函数体中输入中断处理函数。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_13) //判断中断来自哪一条中断线
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); //对LED灯所在的IO口取反
}
}
编译下载程序
程序编译完成并下载后,通过按键触发外部中断,改变LED灯的工作状态。
STM32单片机程序下载方法有多种,有需要请跳转
STM32程序下载0:STM32CubeProgrammer安装
STM32程序下载1:通过keil-ST-Link方式下载
STM32程序下载2:通过STM32CubePro-ST-Link下载
STM32程序下载3:通过STM32CubePro-UART下载
STM32程序下载4:通过STM32CubePro-USB下载
选择你所需要的下载方法。
注意
如果发现按下按键后,有时灯的状态会发生改变,有时又不会发生改变,这是正常现象,因为机械按键在断开与闭合时,在电路中会产生一些抖动,这些抖动可能会重复触发外部中断,看似只按了一次按键,然而触发了多次中断,致使LED发生了多次翻转。
按键消抖有两种方法,一种是软件消抖,可以通过延时解决,但是在外部中断中,极不推荐使用延时函数,因为延时会占用CPU大量时间在中断中,会极大地降低单片机的实时性。另一种消抖方式为硬件消抖,也是按键消抖最好的方式,在按键的两端之间,并联一个电容,通过电容的方式消除电路中端抖动。推荐。