野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16823|回复: 0

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

[复制链接]
发表于 2020-3-23 19:48:20 | 显示全部楼层 |阅读模式
本帖最后由 坚强的土豆 于 2020-3-23 19:56 编辑

在学习嵌套向量中断控制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[]数组可以直接进行位操作?







NVIC寄存器数组

NVIC寄存器数组

NVIC_Type结构体定义

NVIC_Type结构体定义

ISER[]外部中断通道映射

ISER[]外部中断通道映射
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 06:52 , Processed in 0.029533 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表