CM3 NVIC与中断控制

来源:互联网 发布:linux中压缩命令 编辑:程序博客网 时间:2024/06/05 07:21

        向量中断控制器,简称NVIC。NVIC的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU、SysTick定时器以及调试控制相关的寄存器。NVIC共支持1至240个外部中断输入(通常外部中断写作IRQs)。此外,NVIC还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NVIC的访问地址0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。此外,还有几个中断掩蔽寄存器也与中断控制密切相关,即“特殊功能寄存器”,只能通过MRS/MSR及CPS来访问。

   1、中断的使能和除能:使用各自的寄存器来控制,使能,SETENA的位置“1”;除能,CLRENA位置“1”。

   2、中断的悬起与解悬:SETPEND和CLRPEND

   3、优先级(PRI):每个外部中断都有一个对应的优先级寄存器,每个寄存器占用8位,但是CM3允许在最“粗线条”的情况下,只使用最高3位。可以按字节访问,当然也可以按半字/字来访问。

   4、活动状态(ACTIVE):每个外部中断都有一个活动状态位。在处理器执行了其ISR的第一条指令后,它的活动位就被置1,并且直到ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个ISR。然而,哪怕中断被抢占,其活动状态也依然为1(请仔细琢磨前文讲到的“直到ISR返回时才清零)。只读

   5、特殊功能寄存器PRIMASK与FAULTMASK
         PRIMASK用于除能在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。该寄存器可以通过MRS和MSR以下例方式访问:

                       1. 关中断
                       MOV R0, #1
                       MSR PRIMASK, R0
                       2. 开中断
                       MOV R0, #0
                       MSR PRIMASK, R0
此外,还可以通过CPS指令快速完成上述功能:
                      CPSID i ;关中断
                       CPSIE i ;开中断
FAULTMASK更绝,它把当前优先级改为-1。这么一来,连硬fault都被掩蔽了。使用方案与PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。

   6、其它异常的配置寄存器

      用法fault,总线fault以及存储器管理fault都是特殊的异常,因此给它们开了小灶。其中,它们的使能控制是通过“系统Handler控制及状态寄存器(SHCSR)”(地址:0xE000_ED24)来实现的。各种faults的悬起状态和大多数系统异常的活动状态也都在该寄存器中。

     7、中断系统设置全过程的演示

          1. 当系统启动后,先设置优先级组寄存器。缺省情况下使用组0(7位抢占优先级,1位亚优先级)。
          2. 如果需要重定位向量表,先把硬fault和NMI服务例程的入口地址写到新表项所在的地址中。
          3. 配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的话)
         4. 为该中断建立中断向量。因为向量表可能已经重定位了,保险起见需要先读取向量表偏移量寄存器的值,再根据该中断在表中的位置,计算出对应的表项,再把服务例程的入口地址填写进去。如果一直使用ROM中的向量表,则无需此步骤。
         5. 为该中断设置优先级。
        6. 使能该中断

0 0
原创粉丝点击