当前位置: 代码迷 >> 驱动开发 >> 嵌套的向量式间断控制器(NVIC)
  详细解决方案

嵌套的向量式间断控制器(NVIC)

热度:393   发布时间:2016-04-28 09:58:04.0
嵌套的向量式中断控制器(NVIC)
几个基本概念:
1.ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于cortex_m3 内核的部分。其中,STM32 目前支持的中断共为 84 个(16 个内核+68 个外部) ,和 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位) 。
 
2.嵌套向量中断控制器( NVIC ) 和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。
 
3.NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQs) 。具体的数值由芯片厂商在设计芯片时决定。此外,NVIC 还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NMI 的实际功能亦由芯片制造商决定。在某些情况下,NMI 无法由外部中断源控制。
 
4.NVIC 的访问地址是 0xE000_E000。 所有 NVIC 的中断控制/状态寄存器都只能在特权级下访问。 不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断。 所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。 此外, 有几个中断屏蔽寄存器也与中断控制密切相关,它们属于“特殊功能寄存器” ,只能通过 MRS/MSR及 CPS 来访问。
 
5.每个外部中断都在 NVIC 的下列寄存器中“挂号” :
  • 使能与除能寄存器
  • 悬起与“解悬”寄存器
  • 优先级寄存器
  • 活动状态寄存器、另外,下列寄存器也对中断处理有重大影响
  • 异常掩蔽寄存器(PRIMASK, FAULTMASK 以及 BASEPRI)
  • 向量表偏移量寄存器
  • 软件触发中断寄存器
  • 优先级分组位段
 
对于中断优先级分组
中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式:
在一个系统/工程中,通常只使用上面 5 种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个 32 位寄存器 AIRC(Application Interrupt and Reset Control Register)的第[10:8]这 3 个位中。这 3 个 bit 位有专门的称呼:PRIGROUP(具体写操作后面介绍) 。比如你将 0x05(即上表中的编号)写到 AIRC 的[10:8]中,那么也就规定了你的系统中只有 4 个抢先式优先级,相同的抢先式优先级下还可以有 4 个不同级别的子优先级。
 
PS:对这4位进行分组,根据“分步用乘法”的规律,不管怎样(2^2 * 2^2 = 4 * 4 = 16 或者2^^4 = 16等)都是满足16位优先级的说法。
 
如:
中断分组设置函数
        在 sys.c 里面只有一个函数就是 void NVIC_Configuration()中断配置函数,在这个函数里面我们只调用了固件库的中断分组配置函数,这只整个系统的中断分组为组别 2.这个函数在系统初始化的时候调用即可,并且永远只需要调用一次。
void NVIC_Configuration(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2:2 位抢占//优先级,2 位响应优先级
}