在NVIC_PR寄存器中设置中断的优先级

问题描述

我相信我已经了解了中断的概念以及如何对其进行初始化,但是我看到了在各个地方,它们会先对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]被修改,其余部分保持原样。