STM32W108的中断系统由两部分组成:一个标准的ARM Cortex-M3嵌套向量中断控制器(NVIC)提供顶层(一级)中断,一个事件管理器(EM)提供第二级中断。NVIC和EM提供了一个简单的层次结构,所有EM的第二级中断都会送入NVIC中的顶层中断。这两个层次结构既允许很好的微观控制中断源,也能宏观的控制整个外围设备,同时允许外设有自己的中断向量。
在工程实践中,顶层外设中断仅用于启用或禁用一个外设的中断,二级中断来自于硬件,因此,它才是应用程序使用中断的主要部分。
7.1 中断控制器7.1.1嵌套向量中断控制器(NVIC)ARM Cortex-M3的嵌套向量中断控制器(NVIC)有利于低延时的异常和中断的处理,NVIC和处理器内核接口是密切耦合的,从而允许低延迟的中断处理并能够有效地处理后续中断,同时NVIC还具有中断嵌套能力。
ARM Cortex-M3的NVIC包含10个标准中断,它们都与芯片、CPU操作以及管理有关。除了10个标准中断,具体对于STM32W108,还包含了17个单独的矢量外设中断。
NVIC定义了一系列异常,这些异常不仅包括传统的外设中断,也包括一些特定的事件,如故障和CPU复位。在ARM Cortex-M3的NVIC中,CPU复位事件被认为是一个高优先级的异常,并且会从NVIC异常表中的初始位置加载堆栈指针。NVIC异常表定义了所有的异常和它们的级别,包括外设中断。每个异常的级别是很重要的,因为它被直接转变成每个中断的32位的中断向量位置,并且定义了异常的硬件优先级。表中的每个异常都是一个32位的地址,在异常发生时被加载到程序计数器中。表7.1列出了全部的异常表,异常0(堆栈指针)到异常15(SysTick)是标准的ARM Cortex-M3的NVIC一部分,而异常16(定时器1)至异常32(调试)是STM32W108的专用外设中断,更详细的外设中断在表7.2中列出。
表7.1. NVIC异常表 异常 | 编号 | 描述 | -
| 0 | 复位时从第一个向量表中载入栈顶
| 复位
| 1 | 上电和热复位时应用,执行第一条指令后,优先级降到最低(线程模式),异步的
| NMI(不可屏蔽中断)
| 2 | 不能被任何异常所停止或抢占,除了复位,异步的
| 硬件异常
| 3 | 所有硬件异常,由于优先级或配置异常处理被禁止,异常不能激活,同步的
| 内存异常
| 4 | MPU不匹配,包括非法访问和不匹配,同步的
| 总线异常
| 5 | 预取指,内存访问,以及其它地址/内存相关的故障。精确时同步,不精确时异步
| 用户异常
| 6 | 使用故障,例如执行了未定义指令或非法状态转换,同步的
| -
| 7-10 | 保留
| SVC调用
| 11 | 使用SVC指令的系统服务调用,同步的
| 调试监控器
| 12 | 调试监控中断,当没有暂停时,同步的,但只有使能时会激活。如果优先级低于其他当前有效中断,则不激活
| -
| 13 | 保留
| PendSV
| 14 | 系统服务可挂起的请求,异步的,并只能由软件挂起
| SysTick
| 15 | 系统节拍定时器失效,异步的
| 定时器1
| 16 | 定时器1外设中断
| 定时器2
| 17 | 定时器2外设中断
| 管理器
| 18 | 管理外设中断
| 基带
| 19 | 基带外设中断
| 睡眠定时器
| 20 | 睡眠定时器外设中断
| 串口控制器1
| 21 | 串口控制器1外设中断
| 串口控制器2
| 22 | 串口控制器2外设中断
| 安全部件
| 23 | 安全部件外设中断
| MAC定时器
| 24 | MAC定时器外设中断
| MAC传输
| 25 | MAC传输外设中断
| MAC接收
| 26 | MAC接收外设中断
| ADC
| 27 | ADC外设中断
| IRQA
| 28 | IRQA外设中断
| IRQB
| 29 | IRQB外设中断
| IRQC
| 30 | IRQC外设中断
| IRQD
| 31 | IRQD外设中断
| 调试
| 32 | 调试外设中断
|
NVIC还包含一个软件可配置的中断优先级机制,复位、NMI和硬件故障异常始终是优先级最高的中断,并且软件不可更改。所有其它的异常都可以被分配一个5位的优先级号,数值越小优先级越高。如果有某些异常具有相同的软件可配置的优先级,那么NVIC就会使用硬件定义的优先级进行区分,硬件定义的优先级编号和其在异常表中的位置一样。例如,如果IRQA和IRQB同时发生了,并且拥有相同的软件定义的优先级,那么NVIC就会处理优先级为28的IRQA,因为它比优先级为29的IRQB有更高的硬件优先级。
顶层一级中断由5个ARMCortex-M3 NVIC寄存器控制:INT_CFGSET、INT_CFGCLR、INT_PENDSET、INT_PENDCLR和INT_ACTIVE,写0到这五个寄存器中的任何位都是无效的。
● INT_CFGSET - 写1到INT_CFGSET中可以使能该顶层中断。
● INT_CFGCLR - 写1到INT_CFGCLR中可以禁用该顶层中断。
● INT_PENDSET - 写1到INT_PENDSET中可以触发该顶层中断。
● INT_PENDCLR - 写1到INT_PENDCLR中可以清除该顶层中断。
● INT_ACTIVE不能被写入,是用于标识当前哪些中断是被激活的。
INT_PENDSET和INT_PENDCLR寄存器用于设置和清除中断标志;INT_CFGSET和INT_CFGCLR寄存器用于设置和清除中断标志的屏蔽位。中断可能会在任何时候被提交或清除,但只有相应的屏蔽位(INT_CFGSET)被置位的中断提交后才会被处理。如果INT_CFGSET中的一位被置位,并且相应的INT_PENDSET位也被置位,那么该中断会被处理。如果在设置完INT_PENDSET之后设置INT_CFGSET,那么中断同样会被处理。顶层一级中断的中断标志(信号)是根据电平进行判断的。
想了解更多的关于NVIC和Cortex-M3异常的信息,请参阅ARM Cortex-M3的技术手册和ARM ARMv7-M架构手册。
不可屏蔽中断(NMI)
不可屏蔽中断(NMI)是一种特殊情况,尽管是10个标准ARMCortex-M3 NVIC中断的其中之一,但它是源自于事件管理器,就像外设中断一样。NMI有2个二级中断源:24MHz晶振故障和看门狗低水位线(即将溢出)。
1.24MHz晶振故障:如果STM32W108的主时钟SCLK使用24MHz晶振,而晶振出现故障,STM32W108会检测到故障并自动切换到使用内部的12MHz RC时钟。当此故障检测和切换已经发生,STM32W108就会触发CLK24M_FAIL二级中断,然后这个中断又会触发NMI。
2.看门狗低水位线:如果STM32W108的看门狗是激活的并且看门狗计数器在1.792s时没有被复位,那么看门狗就会触发WATCHDOG_INT二级中断,然后这个中断又会触发NMI。
本文出自《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社,2014年5月
|