前节回顾
上节完成了串口中断实验,通过串口与单片机通信,实现了信息的传送,在其中使能的中断,不过仅仅使用到了一个通信端口,试想一下,如果程序中有多个通信端口同时触发会如何?那么就会导致程序的结构的混乱,因此,在本小节引入中断方式,有效的规避此类问题。通过一个示例来了解STM32中中断是如何工作的,详细中断内容参照中断详解。
主要内容介绍
本节是通过配置两个中断口,来基本了解中断的工作方式,初步对中断有一个概念性的理解。STM32中的中断优先级有三种。一,抢占优先级:抢占优先级越低,优先权越高。二、响应优先级:响应优先级越高,中断优先权越低。三、如果前面二者都相同的情况下,那么比较外设的中断号,因为每一个外设都有一个中断号,并且是唯一的。IRQ中断号越小,优先级越高。这里有个问题是如何查看?
答案在这里:stm32f407xx.h
,打开文件可以看到很多枚举的内容。每个中断对应一个中断编号,优先级从上往下依次递减。这里仅做简单介绍。本节主要通过两个中断配置用按键控制LED灯,实现低优先级的按键点亮,高优先级的中断可以打断,高优先级的中断点亮,低优先级的中断无法打断。
工程配置
打开开发板原理图,找到按键连接的引脚。配置引脚PE3,PE4为中断模式。
分别配置PE3(KEY1)为上升沿捕获,PE4(KEY0)为下降沿捕获,这两种捕获方式后续会解释。
在这之后,也要使能LED灯端口,之前第一节已经详细说明了。教程链接,配置完成之后我们还需要做最关键的一步是使能中断并且分配中断优先级,这里将中断3设置为1,中断4设置为2,表示中断3的优先级高于中断4。
整体工程配置完成之后,就可以生成CubMx文件了。
系统代码编写
打开stm32f4xxit.c
文件,STM32CubMx生成的需要使用文件都在这里面,我们找到中断3和中断4的函数:
右击HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
点击go to definition跳转到如下界面,我们可以看到中断函数的回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin);;
我们在这里要做的就是重构回调函数,把这个虚函数void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
复制到main.c
在主函数中对它进行重构。
重构代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY0_Pin)//判断参数中的GPIO是否为按键KEY0
{
HAL_Delay(10);//延时函数消除抖动
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_SET)
//因为初始化配置为上拉模式,判断是否读取到高电平
{
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
//点亮LED0
while(1);
//进入死循环为了和KEY1中断做比较,查看是否能打破中断
}
}
if(GPIO_Pin == KEY1_Pin)//判断参数中的GPIO是否为中断按键KEY1
{
HAL_Delay(10);//延时函数消除抖动
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_SET)
//因为初始化配置为上拉模式,判断是否读取到高电平
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
//点亮LED0
while(1);
//进入死循环为了和KEY0中断做比较,查看是否能打破中断
}
}
}
系统分析
由于设置了多种参数现在对各种参数进行说明,由图可知,PE4的优先级高于PE3,言外之意中断PE4能够打断中断PE3,而中断PE3无法打断中断PE4。
程序验证
下载实验程序到开发板,发生的现象是:
整体现象是LED0与LED1同时点亮。
整体现象是LED1同时点亮。
结语
本小节主要介绍了STM32中的中断的基础知识以及应用。通过中断3、中断4实现了对NVIC(嵌套向量中断控制器)的理解。从基础例程配置到最后的代码实现,步步为营,稳扎稳打,进一步熟悉了软件的使用。
码字不易,点个赞呗~