STM32 NVIC 的理解

最近在研究STM32中断的嵌套的问题,终于找到一个好理解的方法,也许是我太笨,记录下来!

STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下
/* Preemption Priority Group -------------------------------------------------*/
#define NVIC_PriorityGroup_0          ((u32)0x700) /* 0 bits for pre-emption priority
                                                      4 bits for subpriority */
#define NVIC_PriorityGroup_1          ((u32)0x600) /* 1 bits for pre-emption priority
                                                      3 bits for subpriority */
#define NVIC_PriorityGroup_2          ((u32)0x500) /* 2 bits for pre-emption priority
                                                      2 bits for subpriority */
#define NVIC_PriorityGroup_3          ((u32)0x400) /* 3 bits for pre-emption priority
                                                      1 bits for subpriority */
#define NVIC_PriorityGroup_4          ((u32)0x300) /* 4 bits for pre-emption priority
                                                      0 bits for subpriority */

形象化的理解是:

你是上帝,
造了43个人,这么多人要分社会阶级和社会阶层了;
因为“阶级”的词性比较重;"阶层"比较中性,
所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;

如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15

另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;

又有1个人SPI1_IRQChannel,设定如下
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别1,可取0-15

SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。

如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。

每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别1,可取0-7
还需要指定他的阶层:
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0,可取0-1

另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
如果他们两个同时想做事,因为前者的阶层高,所以前者优先。

还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

USART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。

以下的类推。

转载地址:http://bbs.ednchina.com/BLOG_ARTICLE_3000747.HTM

时间: 2024-08-02 12:20:31

STM32 NVIC 的理解的相关文章

[STM32].NVIC嵌套中断向量的理解

转自:http://www.21ic.com/embed/jiaocheng/sheji/201209/5634.html 一.STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级. 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套.

stm32 NVIC中断管理实现[直接操作寄存器]

本文转自:http://www.ichanging.org/stm32_NVIC.html cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断.stm32只有84个中断,包括16个内核中断和68个可屏蔽中断.stm32f103上只有60个中断,f107上才有68个中断. 中断是stm32很基础的一个功能,学会使用中断,才可以更好的使用其他的外设.理解stm32的中断,必须要先从stm32的中断优先级分组是怎么回事.要理解优先级分组,就要先理解什么是先占优先级,和次占优

STM32 NVIC配置详解

例程:  /* Configure one bit for preemption priority */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */  NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn;  NVIC_InitStructure.NVIC_IRQCha

(二)STM32中中断优先级理解

很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级”这样翻译其实是不对的,很容易让人误解.为了便于大家理解,有必要先解释两个概念: 抢占式优先级/响应优先级: STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级. 具有高抢占式优

STM32 NVIC

这个概念查了半天也没弄清楚,后来看正点原子资料里的一篇文章弄明白了.现将理解的加以纪录,以备忘. 首先说一下优先级分组  这个概念应该是直译的英文.这个词本身就不对.准确的说是组织形式.分组给人感觉同时有好多人,分成好多组,大家选一组..实质上分组的形式.也就是怎么分,分的方式,所以你只能选一种,这并非让我们选一个分组,而是选一个分组的方法. 以嵌入式而言,这个选的过程,肯定就是一个对寄存器赋值的过程. 首先,给出CORTEX-M3权威指南里的一个图,这个图原汁原味! 这个图的意思是如果 赋值为

STM32 GPIO模式理解

stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出 如图是GPIO的结构原理图: 1.模拟输入 从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器

【STM32】手册理解

CRC(循环冗余校验)用于核实数据传输或者数据储存的正确性和完整性,它会根据固定的生成多项式得到任一32位全字的CRC计算结果. 电源 工作电压在2.0-3.6V PVD(可编程电压监测器):用来执行紧急关闭任务. BKP(备份寄存器):管理防侵入检测,存储RTC校验值.检测到信号跳变后会产生一个侵入事件,会清除掉数据备份寄存器内容.RTC校准(Real-Time Clock). 其他的内容用到在补充吧. 时钟

关于stm32定时器的理解

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 表面意思是输出控制极性为高,但是意思是定时器输入0,不反相,输出0: 输出控制极性为低,定时器输入0,反相输出1: CC1E控制开关. #define TIM_OCPolarity_High                ((uint16_t)0x0000)#define TIM_OCPolarity_Low                 ((uint16_t)0x0002) 定

STM32的NVIC理解

STM32有43个channel的settable的中断源:AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits.这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 #define NVIC_PriorityGroup_0 ((u32)0x700) #define NVIC_PriorityGroup_1 ((u32)0x600) #define NVIC_PriorityG