Arm 在NVIC\U PR寄存器中设置中断优先级

Arm 在NVIC\U PR寄存器中设置中断优先级,arm,interrupt,cortex-m,Arm,Interrupt,Cortex M,我相信我已经理解了中断的概念以及如何初始化它,但我已经在不同的地方看到过,在优先级位之前,他们会首先根据F位选择NVIC_PR寄存器。例如,在结尾处有一行: NVIC_PRI7_R = (NVIC_PRI7_R & 0xFF00FFFF) | 0x00A00000 其目的是将端口F中断的优先级设置为5(通过将前3位[23:21]设置为该值;因此.1010.或0xA表示a值5)。那么,为什么我不能这样做呢 NVIC_PRI7_R |= 0x00A00000 &0xFF00FFFF在这里

我相信我已经理解了中断的概念以及如何初始化它,但我已经在不同的地方看到过,在优先级位之前,他们会首先根据F位选择NVIC_PR寄存器。例如,在结尾处有一行:

NVIC_PRI7_R = (NVIC_PRI7_R & 0xFF00FFFF) | 0x00A00000
其目的是将端口F中断的优先级设置为5(通过将前3位
[23:21]
设置为该值;因此.1010.或0xA表示a值5)。那么,为什么我不能这样做呢

NVIC_PRI7_R |= 0x00A00000

&0xFF00FFFF
在这里做什么?为什么要在清除优先级位之前或之前清除位[23:16][23:21]?
[20:16]
之间的位无论如何都不会被使用。

如果位
[23:21]
都已被设置为1,那么
NVIC\u PRI7\u R |=0x00A00000
不会执行任何操作,它不会将它们设置为您想要的值,它们都保持为1,这就是为什么在应用遮罩之前清除它们的原因。带有
0xFF00FFFF
&
确保只修改
[23:16]
位,其余的保持原样。

如果位
[23:21]
都已设置为1,那么
NVIC_PRI7_R |=0x00A00000
什么也不做,它不会将它们设置为您想要的值,它们都保持为1,这就是为什么你在使用口罩之前要清除它们。带有
0xFF00FFFF
&
确保只修改
[23:16]
位,其余的保持原样。

如果
[23:21]
已设置为1,无论
NVIC_PRI7_R|=0x00A00000
是否会导致位的任何实际更改,都不会影响最终结果-即
[23:21]
将是1,这就是问题所在(除非这里有某种边缘触发?)。第二,如果我们要明确地清除
NVIC\u PRI7\u R
寄存器,我不应该这样做:
NVIC\u PRI7\u R&0x00000000
?或者,如果我要保持其他位不受影响并只清除
[23:21]
,那不应该是
NVIC\u PRI7\u R&0xff0fffffff
来清除
[23:21]
,而不是清除
[23:16]
的双零位吗?如果您想通过将这些位设置为101来将优先级设置为5,但它们已经是111了,然后你就得到了优先级7,这在你的应用程序中可能是个问题,也可能不是。你是对的,如果你只对这3位感兴趣,你可以
&0xff1ffff
,而不必进一步研究数据表。我不知道为什么链接文章建议
&0xFF00FFFF
如果
[23:21]
已经设置为1,不管NVIC_PRI7_R |=0x00A00000是否导致位的任何实际变化对最终结果都无关紧要,也就是说,
[23:21]
将是1,这就是所有问题(除非这里有某种边缘触发?)。第二,如果我们要明确地清除
NVIC\u PRI7\u R
寄存器,我不应该这样做:
NVIC\u PRI7\u R&0x00000000
?或者,如果我要保持其他位不受影响并只清除
[23:21]
,那不应该是
NVIC\u PRI7\u R&0xff0fffffff
来清除
[23:21]
,而不是清除
[23:16]
的双零位吗?如果您想通过将这些位设置为101来将优先级设置为5,但它们已经是111了,然后你就得到了优先级7,这在你的应用程序中可能是个问题,也可能不是。你是对的,如果你只对这3位感兴趣,你可以
&0xff1ffff
,而不必进一步研究数据表。我不知道链接文章为什么建议
&0xFF00FFFF