打印
[牛人杂谈]

M0的中断优先级

[复制链接]
1644|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
M0+的优先级只有四个即0,1,2,3,4,其中0的优先级是最高的

使用特权

评论回复
沙发
xuanhuanzi|  楼主 | 2019-5-8 23:10 | 只看该作者
第一个是NVICIPR一共有8个寄存器,而每个寄存器管理4个IRQ中断,乘法口诀算一下,我们就明白了为啥M0+的IRQ中断源最多只支持32个了,再加上16个内核中断,加法口诀再算一下,也就是说M0+最多就是48个中断源,所以M0+算是比较好搞的了,一会儿讲M4就该头疼了,呵呵;第二个问题是优先级寄存器里面的配置值越低表明相应的中断优先级越高;第三个问题是每个PRIxx的8位中只有最高两位[7:6]有效,也就是说实际上M0+的优先级只有四个即0,1,2,3,4,其中0的优先级是最高的;第四个问题,为啥我放到最后说呢,因为这是比较容易忽略的问题,即word-accessible,也就是说这几个寄存器都只能按字操作,切记不要为了显示我们的编程技巧而使用指向字节的指针只对某个单独中断的优先级进行配置。至于嵌套的问题,对M0+是比较简单的,即只要相应中断的优先级比较高即可随时抢占比它优先级低的中断服务。至于内核中断,其中断优先级则由SCB模块的SCB_SHPR寄存器来管理如下图所示,实际上我们平时常用的就是systemtick中断,其优先级配置同NVIC,这里就不赘述了。另外,我这里提一下,即如果我们不对优先级进行配置的话,则默认相应中断源的向量号越低其优先级越高,不过如前面我提到的,我是强烈建议在多中断的情况最好把每个用到的中断优先级都根据实际需求进行相应配置,避免潜在的风险。

使用特权

评论回复
板凳
xuanhuanzi|  楼主 | 2019-5-8 23:11 | 只看该作者
ARM早已在CMSIS库里的头文件中把这部分函数API给出来了(core_cm4.h和core_cm0plus.h),而我之所以不闲麻烦的还是把这个写出来,还是我这个知其然也要知其所以然的思想在作怪了。不过最后,我还是给出M0+和M4的中断优先级配置的两个配置供广大博友参考吧

使用特权

评论回复
地板
xuanhuanzi|  楼主 | 2019-5-8 23:11 | 只看该作者
M0+

NVIC_SetPriority(PORTA_IRQn, 1);

NVIC_SetPriority(PORTB_IRQn, 2);

M4+

NVIC_SetPriorityGrouping(0x03);

NVIC_SetPriority(PORTA_IRQn, NVIC_EncodePriority(0x03,1, 2));

NVIC_SetPriority(PORTB_IRQn, NVIC_EncodePriority(0x03, 2, 2));

使用特权

评论回复
5
643757107| | 2019-5-8 23:55 | 只看该作者
这个是数越小越高级

使用特权

评论回复
6
yiyigirl2014| | 2019-5-11 00:29 | 只看该作者
越小的数字越优先级高。

使用特权

评论回复
7
xinpian101| | 2019-5-12 23:50 | 只看该作者
受教了。

使用特权

评论回复
8
zhuomuniao110| | 2019-5-15 00:11 | 只看该作者
原来数字越小等级越高啊

使用特权

评论回复
9
734774645| | 2019-5-19 11:57 | 只看该作者
受教了。

使用特权

评论回复
10
734774645| | 2019-5-19 12:07 | 只看该作者

使用特权

评论回复
11
xuanhuanzi|  楼主 | 2019-5-19 17:06 | 只看该作者
一共47种。

使用特权

评论回复
12
RAYINGPX| | 2020-4-18 17:04 | 只看该作者
NVIC_SetPriority(UART0_IRQn, 1);  m029lan中本来想设为优先为1的, 为什么我这样设置,实际成了64呢?

使用特权

评论回复
13
xuanhuanzi|  楼主 | 2020-4-19 22:54 | 只看该作者
RAYINGPX 发表于 2020-4-18 17:04
NVIC_SetPriority(UART0_IRQn, 1);  m029lan中本来想设为优先为1的, 为什么我这样设置,实际成了64呢? ...

定位到这个函数的文件夹,看看原函数怎么解释的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

172

主题

2181

帖子

3

粉丝