在学习嵌套向量中断控制NVIC的时候,在NVIC的配置上,遇到个问题,非常不解,想请教下坛里的大神。
在《STM32F10xxx Cortex-M3编程手册-英文版》中,提到了NVIC的几个寄存器组。
同时,在内核外设的头文件core_cm3.h中,定义了NVIC_Type结构体,
可以看到,NVIC_Type结构体以寄存器数组的形式,共定义了8个32位的寄存器数组。
以中断使能寄存器数组uint32_t ISER[]为例,
每个寄存器的一个位,可以对应一个外部中断通道。
8个32位寄存器,可以对应8*32=256个外部中断通道。
但实际上,stm32f103对 cortex-M3内核进行了裁剪,只用到了60个外部中断源,所以实际上只用到了3个寄存器数组。
即 ISER[0] ISER[1] ISER[2]。
它们跟外部中断源的映射关系,如下图。
如果想使能某个外部中断通道,只需要将对应的位置1即可。
而在固件库文件misc.c中的NVIC结构体初始化函数void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中,使能外部通道的指令是
/* Enable the Selected IRQ Channels --------------------------------------*/
NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
以使能外部中断编号为50的中断通道为例,它对应的位应该是ISER[1]的第18位。
上述指令,就可以简化为
NVIC->ISER[1] = (uint32_t)0x01 <<18);
从这条指令来看,应该是对ISER[1]整体赋值。
实际的执行效果是想只对ISER[1]的第18位进行置位,而不影响其他位。
但是,单独对一个位进行操作的话,应该是采用 |= 运算才对,= 运算应该是对寄存器整体赋值,这不就影响这个寄存器的其他位了吗?
或者另外一种可能,ISER[]数组可以直接进行位操作? |