STM32 之 NVIC(中断向量、优先级) 简述
一、背景
需要使用STM32的CAN进行通信,经过一系列配置后,已可正常收发,还剩下一个CAN通信的错误处理。可错
误中断使能寄存器已经配置使能了,出错后就是无法进入"CAN1_SCE_IRQHandler"中断。(让CAN通信出错的的
办法很简单,将"CAN_H"与"CAN_L"直接短接,然后让其发送数据,正常情况下,就会触发错误中断了,发送错
误寄存器会瞬间加至"",如果继续发,每发一次,发送错误计数器会+,直到256,然后CAN节点即会进入离
线状态,也就是"Bus off"状态)。
一步一步查,才发现,"CAN1_SCE_IRQn"的M3内核中断没有开,也就是NVIC相关配置。对于NVIC还真没太明
白,幸好有老司机左栋在。( 虽然对这个称谓他还是是拒绝的:) )跟左栋学了很多,非常感谢。 二、正文
对于NVIC(Nested Vectored Interrupt Controller),中文一般翻译为嵌套向量中断控制器,
其为M3内核层次概念,相关寄存器配置需要使用到Cotex-M3数据手册,ST的用户手册涉及的较少,还好有ST的库
函数,此次则暂不深究NVIC,仅对NVIC的概念以及其相对应的库函数使用做个简述。
STM32是基于Cotex-M3内核的MCU,Cotex-M3有两个优先级概念:
--->抢占优先级(主优先级)
--->响应优先级(次优先级)
其实际的层次概念如下图:

如图所示,抢占优先级高的任务出现后,会打断抢占优先级低的任务,即所谓的中断嵌套。例如:
--->抢占优先级为N的中断任务正在运行,此时,抢占优先级为2的中断产生,则MCU会将抢断优先级为N的任务
暂时停止,先响应执行中断优先级为2的任务,待该任务完成后,再来完成抢占优先级为N的任务。
--->若是抢占优先级为2的中断正在运行,又有新的抢占优先级为2的中断产生,则新产生的中断会等待当前中
任务完成后,再执行新产生的中断。
--->若是抢占优先级相同的任务同时产生,则次优先级高的中断先执行。
--->若是抢占优先级,次优先级均相同的中断同时产生,则根据该中断在中断向量表的顺序来执行中断任务。
以上的任务全是由Cotex-M3内核的NVIC(中断控制器)来完成。在中断控制器中,Cotex-M3定义了1个字节
(8位)的寄存器来定义抢占优先级和响应优先级的分配方式。具体定义如下:
--->最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
--->最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
--->最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
--->最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
--->最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
--->最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
--->最高7位用于指定抢占式优先级,最低1位用于指定响应优先级
这么一大串,开始我也很懵逼,经过左栋老司机指点后,才弄明白。
之前已经说明,此寄存器一共有8位,若最高1位用于指定抢占式优先级,最低7位用于指定响应优先级,代
表的意思就是,抢占优先级只有2^=2个,每个抢占优先级对应的指定响应优先级有2^ = 个。其他的则以
此类推。
STM32则没有全部使用8位,而只使用了4位,所以其定义了5种优先级分组,具体如下:
--->#define NVIC_PriorityGroup_0 ((uint32_t)0x700)
/* 0 bits for pre-emption priority
* 4 bits for subpriority */
// 有2^0 = 1 个抢占优先级, 2^4 = 16个响应优先级
--->#define NVIC_PriorityGroup_1 ((uint32_t)0x600)
/* 1 bits for pre-emption priority
* 3 bits for subpriority */
// 有2^1 = 2 个抢占优先级, 2^3 = 8 个响应优先级
--->#define NVIC_PriorityGroup_2 ((uint32_t)0x500)
/* 2 bits for pre-emption priority
* 2 bits for subpriority */
// 有2^2 = 4 个抢占优先级, 2^2 = 4 个响应优先级
--->#define NVIC_PriorityGroup_3 ((uint32_t)0x400)
/* 3 bits for pre-emption priority
* 1 bits for subpriority */
// 有2^3 = 8 个抢占优先级, 2^1 = 2 个响应优先级
--->#define NVIC_PriorityGroup_4 ((uint32_t)0x300)
/* 4 bits for pre-emption priority
* 0 bits for subpriority */
// 有2^4 = 16个抢占优先级, 2^0 = 1 个响应优先级 ST已提供了库函数"void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)"来设置
抢占优先级以及响应优先级组类型,参数"NVIC_PriorityGroup"既是上面提及的5个宏定义。
ST同时提供了库函数"void NVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)",该库函数会根据
结构体"NVIC_InitStruct"内的内容完成NVIC的配置,其具体定义如下:
typedef struct
{
// 定义哪个中断(譬如有"USART1_IRQn","USB_LP_CAN1_RX0_IRQn"等等)
uint8_t NVIC_IRQChannel;
// 该中断的抢占优先级是多少
uint8_t NVIC_IRQChannelPreemptionPriority;
// 该中断的响应优先级是多少
uint8_t NVIC_IRQChannelSubPriority;
// 该值代表是否生效该设置(ENABLE, DISABLE)
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef; 至此,记录完毕 记录时间:2016年9月10日
记录地点:深圳WZ
STM32 之 NVIC(中断向量、优先级) 简述的更多相关文章
- stm32之NVIC
非本人原创,转载自http://blog.csdn.net/denghuanhuandeng/article/details/8350392 STM32的NVIC理解 例程: /* Configur ...
- STM32——NVIV:嵌套中断向量控制器
STM32有43个channel的settable的中断源:AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits.这4个b ...
- STM32中断控制及优先级设置
M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占:bit=0表示非抢占即子优先级:所以共有5中方案分组: 分组 Bit7 Bit6 Bit5 Bit4 说明: 第0组 ...
- stm32的NVIC是什么?
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器. 对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的.8位的话 ...
- 关于STM32的抢占式优先级说明。——Arvin
关于STM32的中断设置.--Arvin 中断 STM32 很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()配置优先级分组方式,会很不理解,尤其是看 ...
- 【转】STM32中的抢占优先级、响应优先级概念
STM32(Cortex-M3)中有两个优先级的概念--抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级. 具有高抢占式优先级的中断可以在具 ...
- 【STM32】NVIC中断优先级管理
(1)NVIC中断优先级分组 1>,CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且 具有256级的可编程中断设置. 2>,STM32F4并没有使用CM4的内核 ...
- Spring Cloud配置文件加载优先级简述
Spring Cloud中配置文件的加载机制与其它的Spring Boot应用存在不一样的地方:如它引入了bootstrap.properties的配置文件,同时也支持从配置中心中加载配置文件等:本文 ...
- 给初学者的STM32(Cortex-M3)中断原理及编程方法介绍 [原创www.cnblogs.com/helesheng]
本人编著的<基于STM32的嵌入式系统原理及应用>(ISBN:9787030697974)刚刚在科学出版社出版.这本书花费了半年以上的时间,凝聚了笔者作为高校教师和嵌入式工程师的一些经验, ...
随机推荐
- git本地分支
1. 新建并切换到该分支 $ git checkout -b iss53 Switched to a new branch 'iss53' 相当于: $ git branch iss53$ git c ...
- UOJ #149 [NOIP 2015] 子串
传送门 Solution DP+滚动数组. DP状态 \(dp[i][j][k]\): \(A\)的第\(i\)个字符和\(B\)的第\(j\)个字符匹配且该字符在第\(k\)个子串中的方案数. 转移 ...
- 数据结构1 线段树查询一个区间的O(log N) 复杂度的证明
线段树属于二叉树, 其核心特征就是支持区间加法,这样就可以把任意待查询的区间$[L, R]$分解到线段树的节点上去,再把这些节点的信息合并起来从而得到区间$[L,R]$的信息. 下面证明在线段树上查询 ...
- Android 使用 DownloadManager 管理系统下载任务的方法,android管理系统
从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager ...
- HD1269迷宫城堡(有向图 && 划分连通块)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- BZOJ4522: [Cqoi2016]密钥破解
pollard's rho模板题. 调参调到160ms无能为力了,应该是写法问题,不玩了. #include<bits/stdc++.h> using namespace std; typ ...
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式及apr配置
转: http://www.oschina.net/question/54100_16195omcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志. ...
- Random类
Random类是随机数产生类,可以指定一个随机数的范围,然后任意产生在此范围中的数字. //================================================= // F ...
- PyCharm 教程(五)断点 调试
PyCharm 教程(五)断点 调试 PyCharm 作为IDE,断点调试是必须有的功能.否则,我们还真不如用纯编辑器写的快. [运行]和[调试]前的设置,详见前面的文章,helloword. 1,设 ...
- Window 中安装python多版本环境
由于python 3 已是目前稳定,且是将来版本版本.新学者可以直接从python3入手学习.但是目前还有很多企业级应用使用的是python 2,可能还得要维护.所以,我们在本地windows中可以安 ...