- 什么是中断?
简介:让CPU打断正常运行的程序,转而去处理紧急的事情(程序),就叫中断
中断执行机制,可简单概括为三步:
- 中断请求:外设产生中断请求(GPIO外部中断,定时器中断等)
- 响应中断:CPU停止执行当前程序,转而去执行中断处理程序
- 推出中断:执行完毕,返回被打断的程序处,继续往下执行
- 外部中断介绍
检测GPIO口电平变化,当检测到指定的电平变化时,可触发外部中断,执行中断服务函数
-支持的触发方式:上升沿/下降沿/双边沿/软件出发
-所有GPIO口都支持,但相同Pin不能同时使用外部中断
- 实验原理分析
- 实战环节
目的:使用外部中断线,实现KEY_UP控制BEEP响停,KEY1控制LED1翻转,KEY0控制LED0翻转。
能学到:1.使用外部中断的方式来检测按键的状态
接着,开始我们的实践操作!!!
首先上一节在main函数中写的按键代码跟这节一样,为什么要用外部中断呢?因为外部中断响应快,不用写在main中,随时都可以响应。
把对应按键的IO口设置为GPIO_EXTI;
下图:第一个:上升沿触发
第二个:下降沿触发
第三个:双边沿触发
下面三个是软件触发
根据上面的原理,设置好对应的中断模式和对应的GPIO初始模式。
接下来:配置中断优先级(数字越小中断级越高)
Preemption Priority:抢占优先级
Sub Priority:响应优先级
Priority Group:中断分组(也就是NVIC的中断分组)
中断分组这里我们选择4bits for pre-emptic:四个位都给抢占优先级使用。
抢占优先级:高优先级中断可以抢占低优先级中断,然后去执行
那么什么是响应优先级:就是说当我们的抢占优先级数值相等,响应优先级数值越小越优先响应(不是说响应优先级数字大的正在执行去打断,也不是抢占,而是优先响应)
下面如下图配置(方便理解):
中断函数放在了stm32f1xx_it.c中,在这里需要我们编辑的函数就是viod HAL_GPIO_Callback(uint16_t GPIO_Pin),前面的_weak是需要我们自定义的意思
然后把这个函数到main.c中定义一下,内容根据本节课目的写一下如下图。
这样编译运行之后,你会发现按键没有消抖,LED有时候不是很灵
然后像下图这样消抖,运行之后你会发现按键怎么按,LED都没有响应,这样呢我们就需要考虑中断优先级的问题了,刚刚我们配置的这个外部中断优先级是2,然后滴答定时器是15,这个HAL_Delay函数实际就是滴答定时器提供的。所以2的优先级是比较高的,那么在高的优先级里面呢,高优先级正在执行,低优先级是没得执行的。就会导致一直卡在这里
所以我们需要把Time base:System tick timer(滴答定时器)配置为1或者0
然后再编辑就可以了。