STM32中断优先级与相关使用概念

上传人:宝路 文档编号:24898833 上传时间:2017-12-08 格式:PDF 页数:8 大小:145.06KB
返回 下载 相关 举报
STM32中断优先级与相关使用概念_第1页
第1页 / 共8页
STM32中断优先级与相关使用概念_第2页
第2页 / 共8页
STM32中断优先级与相关使用概念_第3页
第3页 / 共8页
STM32中断优先级与相关使用概念_第4页
第4页 / 共8页
STM32中断优先级与相关使用概念_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《STM32中断优先级与相关使用概念》由会员分享,可在线阅读,更多相关《STM32中断优先级与相关使用概念(8页珍藏版)》请在金锄头文库上搜索。

1、STM32中断优先级相关概念与使用笔记 上海 华东师范大学 通信工程系 ma-chao 一、基本概念 1ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于cortex_m3 内核的部分。STM32 采用了 cortex_m3 内核,所以这部分仍旧保留使用,但 STM32并没有使用 cortex_m3 内核全部的东西(如内存保护单元 MPU 等),因此它的 NVIC 是cortex_m3 内核的 NVIC 的子集。 2STM32 目前支持的中断共为

2、 84 个(16 个内核+68 个外部) ,和 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位,见后面解释)。参考最新 101xx-107xx STM32 Reference manual, RM0008。 3以下主要对“外部中断通道”进行说明。 对于 cortex_m3 内核所支持的 240 个外部中断,我在这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。因此,下面关于中断优先级的概念都是针对“中断通道”的。当该中断通道

3、的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。 4 STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有效),每4 个通道的 8 位中断优先级控制字 (PRI_n) 构成一个 32 位的优先级寄存器 (Priority Register) 。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVI

4、C寄存器中的一个重要部分。 5对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式: 编 号 分配情况 7 0:4 无抢先式优先级,16 个子优先级 6 1:3 2 个抢先式优先级,8 个子优先级 5 2:2 4 个抢先式优先级,4 个子优先级 4 3:1 8 个抢先式优先级,2 个子优先级 3/2/1/0 4:0 16 个抢先式优先级,无子优先级 6在一个系统中,通常只使用上面 5 种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个 32 位寄存器 AIRC(Applicat i

5、on Interrupt and Reset Control Register)的第10:8这 3 个位中。这 3 个bit 位有专门的称呼:PRIGROUP(具体写操作后面介绍) 。比如你将 0x05(即上表中的编号)写到 AIRC 的10:8中,那么也就规定了你的系统中只有 4 个抢先式优先级,相同的抢先式优先级下还可以有 4个不同级别的子优先级。 7AIRC 中 PRIGROUP 的值规定了设置和确定每个外部中断通道优先级的格式。例如,在上面将 0x05 写入了 AIRC 中 PRIGROUP,也就规定了当前系统中只能有 4 个抢先式优先级,相同的抢先式优先级下还可以有 4 个不同级别的

6、子优先级,他们分别为: 位7:6 位5:4 位3:0 00 0 号抢先优先级 00 0 号子优先级 无效 01 1 号抢先优先级 01 1 号子优先级 无效 10 2 号抢先优先级 10 2 号子优先级 无效 11 3 号抢先优先级 11 3 号子优先级 无效 8如果在你的系统中使用了 TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而TIME2 中断必须优先响应,而且当系统在执行 EXIT0 中断服务时也必须打断(抢先、嵌套),就必须设置 TIME2 的抢先优先级比 EXTI0 的抢先优先级要高(数目小) 。假定 EXTI0 为 2 号抢先优先级,那么 TIME2 就必须

7、设置成 0 或 1 号抢先优先级。这些工作需要在 AIRC 中的PRIGROUP 设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。 9具体优先级的确定和嵌套规则。ARM corte x_m3(STM32)规定 a/ 只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。 b/ 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但 STM32 首先响应子优先级高的中断。 c/ 当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32 首先响应中断通道所对应的中断向量地址低的那个中断(见 ROM0008,表52) 。 具体一

8、点: 0 号抢先优先级的中断,可以打断任何中断抢先优先级为非 0 号的中断;1 号抢先优先级的中断,可以打断任何中断抢先优先级为 2、3、4 号的中断;构成中断嵌套。 如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待),就看它们 2 个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。 10上电 Reset 后,寄存器 AIRC 中 PRI GROUP10:8的值为 0(编号 0) ,因此此时系统使用 16 个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字 PRI_n 也都是 0,所以根据上面的定义可以得出,此时 68

9、个外部中断通道的抢先优先级都是 0 号,没有子优先级的区分。故此时不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应。 注意:此时内部中断的抢先优先级也都是 0 号,由于它们的中断向量地址比外部中断向量地址都低,所以它们的优先级比外部中断通道高,但如果此时正在执行一个外部中断服务,它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。 了解以上基本概念还是不够的,还要了解具体中断的控制有那些途径,中断服务程序如何正确的编写。下面的描述主要以 TIME2 通道为例。 二、中

10、断控制 1对于 STM32 讲,外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) 、输入捕获、输出匹配、DMA 申请等。所有 TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢? (题外话:STM32中的一个通用定时计数器,就比8 位控制器(如AVR,MCS-51 就更不必说了)中 TIME要复杂多了。学过AVR 的,可能对输入捕获、输出匹配等还有概念,但如果你学的标准架构的

11、MCS-51,那么上手 32 位可能困难就更多了。所以我一直推荐学习8位机应该认真的从AVR 开始。尽管51 有很大的市场,价格也相对便宜,但从长远的眼光看问题,从后续掌握 32 位的使用,考虑到学生的可持续发展,AVR应该是比较好的选择。) 2cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。它们包括有: z 中断优先级控制字:PRI_n(上面提到的) z 中断允许设置位:在 ISER 寄存器中 z 中断允许清除位:在 ICER 寄存器中 z 中断悬挂 Pending(排队等待)位置位:在 ISPR寄存器中(类似于置中断通道标志位) z

12、中断悬挂 Pending(排队等待)位清除:在 ICPR寄存器中(用于清除中断通道标志位) z 正在被服务(活动)的中断(Active)标志位:在 IABR 寄存器中, (只读,可以知道当前内核正在处理哪个中断通道) 因此,与 TIME2 中断通道相关的,在 NVIC 中有13个 bits,它们是 PRI_28( IP28),的 8 个 bits(只用高4 位);加上中断通道允许,中断通道清除(相当禁止中断) ,中断通道Pending 置位(我的理解是中断请求发生了,但当前有其它中断服务在执行,你的中断级别又不能打断别人,所以 Pending 等待,这个应该由硬件自动置位的) ,中断 Pend

13、ing 位清除(可以通过软件将本次中断请求、且尚处在 Pending 状态,取消掉),正在被服务的中断(Active)标志位,各 1 个bit。 上面的控制字和控制位都是分布在 NVIC 的寄存器组中的,可惜在 STM32 手册中竟然不给出任何的解释和说明。 3作为外围设备 TIME2本身也包括更具体的,管理自己不同中断的中断控制器(位) ,它们主要是自身各个不同类型中断的允许控制位,和各自相应的中断标志位(这个在 STM32 的手册中有详细的说明了) 。 4在弄清楚2、3 两点的基础上,我们可以全程、全面和综合的来了解 TIME2 的中断过程,以及如何控制的。 a/ 初始化过程 首先要设置寄

14、存器 AIRC 中 PRIGROUP 的值, 规定系统中的抢先优先级和子优先级的个数(在 4 个bits 中占用的位数) ; 设置 TIME2本身的寄存器,允许相应的中断,如允许 UIE(TI ME2_DIER的第0位) 设置 TIME2中断通道的抢先优先级和子优先级(IP28 ,在NVIC 寄存器组中) 设置允许 TIME2 中断通道。在 NVIC 寄存器组的 ISER 寄存器中的一位。 b/ 中断响应过程 当 TIME2 的 UIE 条件成立(更新,上溢或下溢) ,硬件将 TIME2 本身寄存器中 UIE 中断标志置位,然后通过 TIME2 中断通道向内核申请中断服务。 此时内核硬件将 T

15、IME2 中断通道的 Pending 标志置位(相当与中断通道标志置位) ,表示 TIME2 有中断申请。 如果当前有中断在处理,TIME2 的中断级别不够高,那么就保持 Pending 标志,当然用户可以在软件中通过写 ICPR 寄存器中相应的位把本次中断清除掉。 当内核有空,开始响应 TIME2 的中断,进入 TIME2 的中断服务。此时硬件将 IABR 寄存器中相应的标志位置位,表示 TIME2中断正在被处理。同时硬件清除 TI ME2 的Pending标志位。 c/ 执行 TIME2 的中断服务程序 所有 TIME2的中断事件,都是在一个 TIME2 中断服务程序中完成的,所以进入中断

16、程序后,中断程序需要首先判断是哪个 TIME2 的具体事件的中断,然后转移到相应的服务代码段去。 注意不要忘了把该具体中断事件的中断标志位清除掉,硬件是不会自动清除 TIME2寄存器中具体的中断标志位的。 如果 TIME2本身的中断事件多于 2个,那么它们服务的先后次序就由用户编写的中断服务决定了。换句话说,对于 TIME2本身的多个中断的优先级,系统是不能设置的。所以用户在编写服务程序时,应该根据实际的情况和要求,通过软件的方式,将重要的中断优先处理掉。 当然你也可以每次中断服务只处理其中的一个,然后再次进入中断,处理下一个。 d/ 中断返回 内核执行完中断服务后,便进入中断返回过程,在这个过程中需要: 硬件将 IABR寄存器中相应的标志位清另,表示该中断处理完成 如果 TIME2 本身还有中断标志位置位,表示 TIME2 还有中断在申请,则重新将 TIME2的 Pending标志置为 1,等待再次进入 TIME2 的中断服务。 以上中断过程在ARM

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号