STM32 NVIC

这个概念查了半天也没弄清楚,后来看正点原子资料里的一篇文章弄明白了。现将理解的加以纪录,以备忘。

首先说一下优先级分组  这个概念应该是直译的英文。这个词本身就不对。准确的说是组织形式。分组给人感觉同时有好多人,分成好多组,大家选一组。。实质上分组的形式。也就是怎么分,分的方式,所以你只能选一种,这并非让我们选一个分组,而是选一个分组的方法。

以嵌入式而言,这个选的过程,肯定就是一个对寄存器赋值的过程。

首先,给出CORTEX-M3权威指南里的一个图,这个图原汁原味!

这个图的意思是如果

赋值为0   则8位里面第0位是亚优先级 1~7位是抢占优先级   128级抢断式优先级  每个抢断优先级里2个平等优先级   以下类推

0           [7:1] [0:0]==>  128   2

1           [7:2] [1:0]==>   64    4

2           [7:3] [2:0]==>    32   8

3           [7:4] [3:0]==>    16   16

4           [7:5] [4:0]==>      8   32

5           [7:6] [5:0]==>      4   64

6           [7:7] [6:0]==>      2   128

7           [     ] [7:0]==>      1   256

根本不存在分组,只是要我们选哪种分组模式而已,这个词很容易让人产生误会!!!

从图里可以看出 至少有一个亚优先级,也即平等优先级,也即平等优先级至少占1位

上面是CORTEX-M3自己规定的东西,但是STM32说了,它搞不定这么复杂的东西,它说它只用4位表示优先级,不用8位

按道理说,它应该设计成如下左边这样, 实际设计成了右边这样

4           [3:0] [     ]==>    16     1

0           [3:1] [0:0]==>      8   2                                        3           [3:1] [0:0]==>      8     2

1           [3:2] [1:0]==>      4   4                                        2           [3:2] [1:0]==>      4     4

2           [3:3] [2:0]==>      2   8                                        1           [3:3] [2:0]==>      2     8

3           [     ] [3:0]==>      1   16                                      0           [     ] [3:0]==>      1     16

它打破了至少有1位平等优先级的约定,实际上这样才好,这是很可取的一点。

STM32设计成这样,它们有解释权,CORTEX-M3规定7号分组方式无抢断优先级位  6号分组方式1个抢断优先级位。

STM解释为0号分组方式无抢断优先级位 1号分组方式1个抢断优先级位。

我们再看实际情况,CORTEX-M3里面7号分组方式的时候3位全1。

对应的STM32 0号分组方式时3位全1。这中间就差了一个取反。

所以正点原子有如下代码

 1 void MY_NVIC_PriorityGroupConfig( u8 NVIC_Group )
 2 {
 3     u32 temp, temp1;
 4     temp1 = ( ~NVIC_Group ) & 0x07; //取后三位
 5     temp1 <<= 8;
 6     temp = SCB->AIRCR; //读取先前的设置
 7     temp &= 0X0000F8FF; //清空先前分组
 8     temp |= 0X05FA0000; //写入钥匙
 9     temp |= temp1;
10     SCB->AIRCR = temp; //设置分组
11 }

中间这个取反,向上STM32自圆其说,向下暗合CORTEX-M3规范。这应该也是STM32库函数里的东西,具体没看过,不作评论。

这篇文章仅为个人备忘,至少能解释的通。但错误难免。

时间: 2024-08-01 22:44:21

STM32 NVIC的相关文章

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 NVIC 的理解

最近在研究STM32中断的嵌套的问题,终于找到一个好理解的方法,也许是我太笨,记录下来! STM32有43个channel的settable的中断源:AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits.这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下/* Preemption Priority Group ---------------------------------

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

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

STM32 之 NVIC(中断向量、优先级) 简述

一.背景 需要使用STM32的CAN进行通信,经过一系列配置后,已可正常收发,还剩下一个CAN通信的错误处理.可错 误中断使能寄存器已经配置使能了,出错后就是无法进入"CAN1_SCE_IRQHandler"中断.(让CAN通信出错的的 办法很简单,将"CAN_H"与"CAN_L"直接短接,然后让其发送数据,正常情况下,就会触发错误中断了,发送错 误寄存器会瞬间加至"128",如果继续发,每发一次,发送错误计数器会+8,直到2

stm32之NVIC

非本人原创,转载自http://blog.csdn.net/denghuanhuandeng/article/details/8350392 STM32的NVIC理解 例程:  /* Configure one bit for preemption priority */   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */  NVIC_Ini

stm32的NVIC是什么?

NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器.    对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的.8位的话就可以设置2^8 =256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整.比如ST的STM32F1xx和F4xx只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套.    对于这个NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优

STM32中EXTI和NVIC的关系

(1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册>Cortex-M3的向量中断统一由NVIC管理. (2)EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制.它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,ethernet wakeup),以及软件中断.其输出最终被映射

【STM32】NVIC中断优先级管理

(1)NVIC中断优先级分组 1>,CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且 具有256级的可编程中断设置. 2>,STM32F4并没有使用CM4的内核的全部东西,而只是用了它的一部分. 3>,STM32F40xx/STM32F41xx的92 个中断里面,包括10个内核中断和82个可屏蔽中 断,具有16级可编程中断优先级,而我们经常用的就是这82个可屏蔽中断. 特别说明: 一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如为分组2,设置 好