1.什么是中断
打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。
2.中断向量表
2.1 系统中断
其中,系统中断表 及对应的说明 如下图所示:
我们可以按住 Ctrl 点击中断向量表中的 ISR 函数名,可以进入该函数,可以发现,这些系统函数虽然都定义了,但是没有编写其工作方式,即函数体。
例如:按如下操作:
第1 步:
第2步:
此就是滴答中断函数:(其他找到 中断函数的方法 都一样)
如果用户需要对中断内容进行定义,就要在对应的中断函数内编写对应的中断执行代码。
其中,SysTick是个非常有用的定时中断,它能精确产生 1ms 的定时供用户使用。
2.2 外部可屏蔽中断(82个可屏蔽中断)
NVIC采用4位二进制数设置中断优先级,分为 抢占优先级 和 次优先级。
1.抢占优先级 和 次优先级 相同的情况下,自然优先级越高,就先执行;
2.次优先级 相同的情况下,即使次优先级 高的中断正在执行,抢占优先级 高 的中断也可以打断它,并先执行;
3.次优先级 高的中断不能打断 次优先级 低的中断;
注意:中断优先级别设置非常重要,但该工作都可以在CUBEMX中可视化完成,比较简单。
在CUBEMX中设置NVIC方法如下:
中断的相关函数所在位置:
3.外部中断的使用
3.1 23个EXIT外部中断线(16个GPIO线关联,7个外部事件关联)
STM32F407有23个外部中断,其中16个与GPIO引脚相挂钩(如下图所示),另外7个EXIT线与其他外设产生的事件信号相关联。
外部中断EXIT线共用及ISR函数情况:
另外7个EXIT线连接的对应事件信号:
3.2 跟GPIO相关的EXIT外部中断线函数
4.外部中断按键示例
要求:以外部中断方式检测按键按下,并控制LED的亮灭
第1步:导入先前建立的.ioc文件,就可以在原来的MX配置文件中继续添加功能了
第2步:输入新的工程文件名
第3步:将引脚从原来的“输入模式”修改为 “外部中断”模式
按键引脚修改完成以后的前后对比:
修改以前:
修改以后:
然后设置NVIC优先级:
第4步:保存,点击生成代码:
第5步 生成代码分析
main.c主程序分析:
main.h 对引脚号、端口的宏定义:
在文件 stm32f4xx_it.c中,自动生成了4个ISR的代码框架,如下图所示:
按CTRL键,进入到该函数
HAL_GPIO_EXTI_IRQHandler()
中,这些ISR最终都要调用回调函数
HAL_GPIO_EXTI_Callback()
如下图所示:
因此,我们只需要重新实现 该 回调函数 的功能, 就可以完成中断的任务了。
第6步 编写用户功能代码
在其中调用外部中断软中断的宏函数:
在gpio.c中,用户沙箱中重新编写该“回调函数”:
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == Key_Up_Pin) //上按键 按下,两LED灯翻转
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(500);
}
else if(GPIO_Pin == Key_Right_Pin) //右上按键 按下,LED2灯翻转
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(1000);
}
else if(GPIO_Pin == KeyDown_Pin) //下上按键 按下,上按键产生软中断,两LED灯翻转
{
__HAL_GPIO_EXTI_GENERATE_SWIT(Key_Up_Pin);
HAL_Delay(1000);
}
else if(GPIO_Pin == KeyLeft_Pin) //左上按键 按下,LED1灯翻转
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_Delay(1000);
}
}
/* USER CODE END 2 */
还需要对以下系统函数调整语句位置:
最后实现功能:文章来源:https://www.toymoban.com/news/detail-849702.html
- 按下 上按键,两个LED输出翻转;
- 按下 下按键,产生EXTI0软中断,模拟 上按键 按下;
- 按下 右按键,LED2输出翻转;
- 按下 左按键,LED1输出翻转;
中断优先级测试:
文章来源地址https://www.toymoban.com/news/detail-849702.html
- 按下 左按键 后,再快速按下右按键 ,LED2不会立刻翻转,需要等待1000ms后再变化。
- 按下 下按键,产生EXTI0软中断,执行1000ms的延时后,再进入 上按键 产生的中断,实现两LED翻转。
到了这里,关于2.外部中断方式检测按键输入并控制LED示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!