问题描述
我相信我已经了解了中断的概念以及如何对其进行初始化,但是我看到了在各个地方,它们会先对F位进行AND(选择)NVIC_PR寄存器,然后再对优先级位进行“或”运算。例如,在TM4C123 GPIO Port Interrupt Programming中,此行的结尾:
NVIC_PRI7_R = (NVIC_PRI7_R & 0xFF00FFFF) | 0x00A00000
目的是将端口F中断的优先级设置为5(通过将前3位[23:21]
设置为该值;因此将.1010或0xA表示为5的值)。那么,为什么我不能这样做呢?
NVIC_PRI7_R |= 0x00A00000
& 0xFF00FFFF
在这里做什么?为什么要在对优先级位[23:21]
进行或运算之前清除位[23:16]? [20:16]
之间的位始终不会使用。
解决方法
如果[23:21]
位已经全部设置为1,那么NVIC_PRI7_R |= 0x00A00000
不会执行任何操作,不会将它们设置为所需的值,它们都保持为1,这就是为什么要在清除它们之前戴上口罩。 &
和0xFF00FFFF
确保只有位[23:16]
被修改,其余部分保持原样。