打印

请教下NVIC寄存器数组IESR[]的配置问题,谢谢。

[复制链接]
347|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小的人呀|  楼主 | 2020-4-3 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在学习嵌套向量中断控制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[]数组可以直接进行位操作?

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

399

主题

399

帖子

0

粉丝