注:本文内容主要参考cortex-M0 权威指南。

Cotex-M0处理器内置了中断控制器,并且最多支持32个中断请求(IRQ)输入,以及1 个不可屏蔽中断(NMI)输入。另外Cotex-M0处理器还支持多个内部异常。而 Cortex -M3中的 NVIC 支持最多240个中断请求(IRQ)、1 个不可屏蔽中断(NMI)多个系统异常。

Cortex -M0的每个中断都有一个单独的中断编号, NMI 的编号为2,而片上外设和外部中断的则为16-47。1-15的其他编号,用于处理器内部的系统异常。有些中断的优先级是固定的,而有些则是可编程的。表中列出了异常类型、异常编号和优先级。

m3架构和m0架构有什么差别_m3架构和m0架构有什么差别


从头文件中可以看出,FM33LG0XX芯片的中断表如下。

m3架构和m0架构有什么差别_c语言_02


外部中断

m3架构和m0架构有什么差别_c语言_03


中断优先级定义

在 Cortex -M0处理器中,毎个中断都对应一个优先级。优先级决定了中断是否执行或者是否延迟执行。Cortex -M0处理器支持3个固定的最高优先级以及4个可编程的优先级。对于具有可编程优先级的异常,优先级配置寄存器为8位宽,而且只能使用最高两位。见下图。

m3架构和m0架构有什么差别_优先级_04

因为第0到5位没有使用,故它们读出始终为0,对它们的写操作没有意义。在这个设定下,可以使用的优先级为0x00(最高)、0x40、0x80和 0xc0 (最低)。这点同 Cortex -M3处理器类似,只是 Cortex -M3处理器至少使用3个位,因此就具有至少8个可编程的优先级,而 Cortex -M0处理器只有4个。再加上3个固定的优先级,Cortex - M0总共具有7个优先级。

对于Cortex - M3来说,处理器有3个固定优先级和最多256 个优先级(最多有 128 个抢占等级),优先级的数量也是可由芯片设计者配置的,可选范围为8-256(多数情况下为8-32,比如 STM32 就只有16 级优先级)。 NVIC 将优先级分为两个部分:抢占优先级(用于嵌套中断)和子优先级(用于多个具有相同抢占优先级的中断同时发生),并且它们可由软件配置(SCB->AIRCR [10:8] PRIGROUP field)。

系统异常控制寄存器

对于 Cortex -M0处理器,只有3个与 OS 相关的系统异常才具有可编程的优先级,它们包括 SVC 、PendSV 和 SysTick ,其他像 NMI 和硬件错误等系统异常的优先级则是固定的。通过配置SHPR2和SHPR3两个寄存器来修改三个系统异常的优先级。

m3架构和m0架构有什么差别_m3架构和m0架构有什么差别_05


m3架构和m0架构有什么差别_arm_06


如果使用了CMSIS设备驱动库,你可以使用寄存器名SCB->SHP[0]和SCB->SHP[1]来访问SHPR2和SHPR3。

m3架构和m0架构有什么差别_单片机_07


以freeRTOS为例,在port.c中,可以看到将PendSV和SysTick配置为最低优先级。

m3架构和m0架构有什么差别_arm_08


m3架构和m0架构有什么差别_优先级_09


中断屏蔽寄存器(PRIMASK)

有些对时间敏感的应用,需要在一段较短的时间内禁止所有中断。对于这种应用,Cortex -M0处理器没有使用中断使能/禁止控制寄存器来禁止所有中断然后再恢复,而是提供了一个单独的特性,特殊寄存器中有一个被称作 RRIMASK,通过它可以屏蔽掉除了 NMI 和硬件错误异常的其他所有的中断和系统异常。 PRIMASK 寄存器只有1位有效,并且在复位后默认为0。该寄存器为0时,所有的中断和异常都处于允许状态;而设为1后,只有 NMI 和硬件错误异常处于使能。实际上,当 PRIMASK 设置为1后,处理器的当前优先级就降到了 0 (可设置的最高优先级)。若使用C语言以及CMSIS设备驱动库,用户可以使用以下函数来设置和清除PRIMASK。

__disable_irq();//设置PRIMASK

__enable_irq();//清除PRIMASK

m3架构和m0架构有什么差别_arm_10


对于Cortex -M3来说除了 PRIMASK 外还有其他的中断屏蔽寄存器。 BASEPRI 寄存器可以阻止某优先级或更低优先级的中断, FAULTMASK 寄存器则提供了其他的错误管理特性。