[技术问答]

关于NVIC

[复制链接]
871|4
手机看帖
扫描二维码
随时随地手机跟帖
shen_hao|  楼主 | 2017-11-23 10:52 | 显示全部楼层 |阅读模式
今天研究nu-bricks的程序时发现,这个函数用法好奇怪:
NVIC_SetPriority (TMR2_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
我没有用过这个函数,但对这个函数还是有所了解的:这是我保存的资料:CortexM4 内核中定义256个中断优先级,8 bit;通过设置PRIGROUP位将这8bit分成Grouppriority Subpriority, 低于或等于Group priority的中断不能嵌套;同一Group priority中断同时被触发时,由Subpriority决定优先权;M451的优先级只有16个,也就是4bit;你可以将64个中断通过寄存器NVIC_IPRx设置在这16个级别中;下级或同级的中断不能嵌套,同一级中断同时被触发时,由中断编号决定优先级;


问题:__NVIC_PRIO_BITS值为4,优先级范围是0-15的话,这个就是7,不明白为什么要这样写?点进去,查看定义,就更看不懂了。因为在手册上没有看到具体的寄存器。
把问题再简单化,按照正常的思维,设置的数值就是对应的优先级,这是合理的,对吧???我也不想细究这东西



shen_hao|  楼主 | 2017-11-23 12:41 | 显示全部楼层
在网上看到一个解释:
关键在参数 (1<<__NVIC_PRIO_BITS) - 1);这个参数即占先优先级值,其中—NVIC_PRIO_BITS是stm32.h中的宏定义,库函数默认为4,表示用4位表示占先优先级,因为m3内核只有4位用来表示占先优先级和响应优先级,那么响应优先级就剩下0位了,也就是没有响应优先级之分,

按照上式计算若NVIC_PRIO_BITS为4则占先优先级为15,即最低优先级值

依次可类推,即 (1<<__NVIC_PRIO_BITS) - 1);表示的是可用的最低优先级(1<<4为16,—1为15),将后面那个红色的1改为其他值即可改变此模块占先优先级

进入NVIC_SetPriority函数可解释上述观点:

NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);

<< (8 - __NVIC_PRIO_BITS)) 即表示占先优先级的寄存器的那几位,priority为占先优先级,即上面带过来的实参 (1 <<_NVIC_PRIO_BITS)-1

使用特权

评论回复
shen_hao|  楼主 | 2017-11-23 13:13 | 显示全部楼层
shen_hao 发表于 2017-11-23 12:41
在网上看到一个解释:
关键在参数 (1

我明白了。这个寄存器arm设置的是8bit,也就说可以设置0-255个中断,但这样太多,供货商一般会减少数量。新唐和ST都是采用了4bit,也就说一共16个等级。

我上面的疑惑:因为arm推荐移除lsb(为什么不移除msb,可以画个图试试就明白了),也就是说,如果只用4bit,只保留msb  4bit,所以当设定优先级的时候,
应当NVIC_SetPriority (TMR2_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

以上都来自ARM Cortex-M3权威指南,纯手打

使用特权

评论回复
dongnanxibei| | 2017-11-24 20:49 | 显示全部楼层
楼主厉害了,分析的头头是道,出处都搞清楚了。学习了。

使用特权

评论回复
yiyigirl2014| | 2017-11-26 16:55 | 显示全部楼层
NVIC这个还是挺深奥的,单片机的高级用法

使用特权

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

本版积分规则

79

主题

230

帖子

2

粉丝