兄弟,其实这事儿没你想的那么玄乎,我给你用大白话梳理一下
先说结论:
- 这颗芯片的 NVIC 只实现了 2 个优先级位,所以一共就 0、1、2、3 四档。
- 例程里写的 0×0F 最后只用到了最高那俩 bit,等于给自己设了“优先级 3(最低)”。你随便写 0×04、0xFF,结果都一样。
怎么来的?
• ARM 设计的时候给每个中断留了 8 个优先级 bit,但厂商可以裁剪,多出来的位硬件直接忽略。
• CMSIS 里用一个宏 __NVIC_PRIO_BITS 告诉库“我一共实现了几位”。
你打开 core_cm0.h 会看到:#define __NVIC_PRIO_BITS 2。
• NVIC_SetPriority() 内部会把你给的数字左移 8-2=6 位,多余的位自然就被“挤”掉了,只剩高两位写进寄存器。
所以才会出现“示例给 0×0F,但实际上是 3”的现象。
个人用法建议
// 别整花活,直接写 0~3,自己好读
NVIC_EnableIRQRequest(EINTD_IRQn, 0); // 最高
NVIC_EnableIRQRequest(EINTD_IRQn, 1); // 次高
NVIC_EnableIRQRequest(EINTD_IRQn, 2); // 次低
NVIC_EnableIRQRequest(EINTD_IRQn, 3); // 最低
这颗 M0 就 4 档优先级,例程写成 0×0F 只是看着吓人,硬件只认前两位。放心用吧