中断的几个概念:
中断的执行流程
EXTI(外部中断)
NVIC
NVIC管理中断,赋予中断优先级的作用
一个外设有多个中断通道,而NVIC是对对应得中断通道(EXTILineX对应ChannelX)进行优先级排序。然后自己根据中断的优先级,一次只告诉CUP执行一个中断。形象一点的比喻是医生看病,外面的排队的病人就是中断,而医生是CUP,因为医生是处理病情的(主程序),为了节约医生的时间和经历,由NVIC(助理)来为这些病人(中断)排序,也由NVIC(助理)叫号(将中断信号发给CPU)。
NVIC优先级分组:
中断优先级分为抢占优先和响应优先。
抢占优先:可以打断低一级的中断,进行循环嵌套。相当于医生在看病,突然外面来了一个快要不行的病人,医生停下当前病人(中断)去看更危险的1病人(中断)
响应优先级:优先排队,一定要等高优先级的中断响应完才能响应。(病人排队,不能插队)
在STM32里面,中断不讲究先来后到,而是讲究优先级。
优先级:抢占>响应
相同性质的优先级,数字小的优先级高
Tips:在一个工程里面,只有一个NVIC分组,因此在一个工程里面,如有其他中断,则优先级分组必须相同。
中断的基本机构:
AFIO中断引脚选择:
每个GPIO口既可以做定时器口还可以做中断触发源,还有ADC采集之类的(功能复用)
(每个功能的要求都不一样所以,这也是为什么使用GPIO口要对GPIO口初始化,输入输出方式,响应速度等)
而AFIO的作用就是将GPIO口赋予一个特定的功能,这里赋予的是:中断引脚的选择
利用代码:
GPIO_EXTILineConfig(_,_)
来将指定的GPIO口连到(复用到)EXTI中断线路上
相同的Pin口不能同时用作中断
EXIT边沿检测及其控制
对中断进行初始化,包括中断线路的选择,中断触发方式,中断模式(事件or软件),以及中断线路的开启(PVD,RTC,USB,ETH还没学,所以这里没写,见谅)
需要注意的是 IO口和中断线路是一一对应的(包括NVIC的Channel),因此在中断的初始化里面,也是对特定的EXTILine进行初始化配置的。也就是说,每一条中断线路都需要单独配置(复杂,但是因为复杂,可以有更多可能性和组合方式以同时应对不同的需求)
然后就是NVIC的配置
在进行NVIC配置时要先对NIVC进行优先级分组(每个工程只能有一个分组)
NVIC初始化包括
对于的Channel线路的选择(NVIC_InitStructure.NVIC_IRQChannel=;
(这个和前面的GIPO口EXTILine也是一一对应的)
中断允许--------(NVIC_InitStructure.NVIC_IRQChannelCmd= ;
响应优先级排序-----------(NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= ;
抢占优先级排序------------(NVIC_InitStructure.NVIC_IRQChannelSubPriority= ;
最后就是中断函数,中断函数名也和GPIO,EXTILine Channel一一对应
要注意的是,中断函数里里面,在程序的最后需要对中断标志位清零,否则程序会一直进入中断,从而死机。同理,如果启动了中断而没有中断函数(或者不对中断标志位清零)程序依然会卡死
同时中断函数是无参无返回值的,如果要读取中断函数里面的数据需要再用一个函数
外部中断配置的流程
(打通上图的各个环节)
- 开启GPIO和AFIO的时钟
- 初始化GPIO口 注意配置为上拉模式
- AFIO中断线路的选择 来将指定的GPIO口连到(复用到)EXTI中断线路上
- EXTI的初始化配置
- NVIC优先级分组
- NVIC配置
- 中断函数
代码部分:
开启时钟
配置GPIO
AFIO中断线路的选择
中断线配置
配置NIVC分组
配置NVIC
中断函数