一、基本概念
1.ARM cortex_m3内核支撑256个中止(16个内核+240外部)和可编程256级中止优先级的设置,与其相关的中止操控和中止优先级操控寄存器(NVIC、SYSTICK等)也都归于cortex_m3内核的部分。STM32选用了cortex_m3内核,所以这部分依旧保存运用,但STM32并没有运用cortex_m3内核悉数的东西(如内存保护单元MPU等),因而它的NVIC是cortex_m3内核的NVIC的子集。
2.STM32现在支撑的中止共为84个(16个内核+68个外部),和16级可编程中止优先级的设置(仅运用中止优先级设置8bit中的高4位,见后边解说)。《参阅最新101xx-107xx STM32 Reference manual, RM0008》。
3.以下主要对“外部中止通道”进行阐明。
关于cortex_m3内核所支撑的240个外部中止,我在这里运用了“中止通道”这个概念,因为虽然每个中止对应一个外围设备,但该外围设备一般具有若干个可以引起中止的中止源或中止事情。而该设备的一切的中止都只能经过该指定的“中止通道”向内核请求中止。因而,下面关于中止优先级的概念都是针对“中止通道”的。当该中止通道的优先级确认后,也就确认了该外围设备的中止优先级,并且该设备所能产生的一切类型的中止,都享有相同的通道中止优先级。至于该设备自身产生的多个中止的履行次序,则取决于用户的中止服务程序。
4. STM32可以支撑的68个外部中止通道,现已固定的分配给相应的外部设备。每个中止通道都具有自己的中止优先级操控字节PRI_n(8位,但在STM32中只运用4位,高4位有用),每4个通道的8位中止优先级操控字(PRI_n)构成一个32位的优先级寄存器(Priority Register)。68个通道的优先级操控字至少构成17个32位的优先级寄存器,它们是NVIC寄存器中的一个重要部分。
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(Application Interrupt and Reset Control Register)
的第[10:8]这3个位中。这3个bit位有专门的称号:PRIGROUP(详细写操作后边介绍)。比方你将0x05(即上表中的编号)写到AIRC的[10:8]中,那么也就规矩了你的体系中只要4个抢先式优先级,相同的抢先式优先级下还可以有4个不同等级的子优先级。
7.AIRC中PRIGROUP的值规矩了设置和确认每个外部中止通道优先级的格局。例如,在上面将0x05写入了AIRC中PRIGROUP,也就规矩了当时体系中只能有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同等级的子优先级,他们分别为:
位[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就有必要设置成0或1号抢先优先级。这些工作需要在AIRC中的PRIGROUP设置完结,确认了整个体系所具有的优先级个数后,再分别对每个中止通道(设备)进行设置。
9.详细优先级的确认和嵌套规矩。ARM cortex_m3(STM32)规矩
a/ 只能高抢先优先级的中止可以打断低抢先优先级的中止服务,构成中止嵌套。
b/ 当2(n)个相同抢先优先级的中止呈现,它们之间不能构成中止嵌套,但STM32首要呼应子优先级高的中止。
c/ 当2(n)个相同抢先优先级和相同子优先级的中止呈现,STM32首要呼应中止通道所对应的中止向量地址低的那个中止(见ROM0008,表52)。
详细一点:
0号抢先优先级的中止,可以打断任何中止抢先优先级为非0号的中止;1号抢先优先级的中止,可以打断任何中止抢先优先级为2、3、4号的中止;……;构成中止嵌套。
假如两个中止的抢先优先级相同,谁先呈现,就先呼应谁,不构成嵌套。假如一同呈现(或挂在那里等候),就看它们2个谁的子优先级高了,假如子优先级也相同,就看它们的中止向量方位了。
10.上电Reset后,寄存器AIRC中PRIGROUP[10:8]的值为0(编号0),因而此刻体系运用16个抢先优先级,无子优先级。别的因为一切外部中止通道的优先级操控字PRI_n也都是0,所以依据上面的界说可以得出,此刻68个外部中止通道的抢先优先级都是0号,没有子优先级的区别。故此刻不会产生任何的中止嵌套行为,谁也不能打断当时正在履行的中止服务。当多个中止呈现后,则看它们的中止向量地址:地址越低,中止等级越高,STM32优先呼应。
留意:此刻内部中止的抢先优先级也都是0号,因为它们的中止向量地址比外部中止向量地址都低,所以它们的优先级比外部中止通道高,但假如此刻正在履行一个外部中止服务,它们也有必要排队等候,仅仅可以插队,当正在履行的中止完结后,它们可以优先得到履行。
了解以上基本概念仍是不行的,还要了解详细中止的操控有那些途径,中止服务程序怎么正确的编写。下面的描绘主要以TIME2通道为例。
二、中止操控
1.关于STM32讲,外部中止通道方位28(35号优先级)是给外部设备TIME2的,但TIME2自身可以引起中止的中止源或事情有好多个,比方更新事情(上溢/下溢)、输入捕获、输出匹配、DMA请求等。一切TIME2的中止事情都是经过一个TIME2的中止通道向STM32内核提出中止请求,那么STM32中怎么处理和操控TIME2和它很多的、不同的、中止请求呢?
(题外话:STM32中的一个通用守时计数器,就比8位操控器(如AVR,MCS-51就更不用说了)中TIME要杂乱多了。学过AVR的,或许对输入捕获、输出匹配等还有概念,但假如你学的规范架构的MCS-51,那么上手32位或许困难就更多了。所以我一向引荐学习8位机应该仔细的从AVR开端。虽然51有很大的商场,价格也相对廉价,但从久远的眼光看问题,从后续把握32位的运用,考虑到学生的可持续发展,AVR应该是比较好的挑选。)
2.cortex_m3内核关于每一个外部中止通道都有相应的操控字和操控位,用于独自的和总的操控该中止通道。它们包含有:
STM32中止优先级相关概念与运用笔记
一、基本概念1.ARMcortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/257417.html