【CortexM】NVIC
Cortex-M 为异常分配了优先级(数值越小,优先级越高)
part1
Reset:重启
NMI:watchdog
part2
HardFault:兜底操作
MemManage:内存访问相关错误
BusFault:总线错误,如果未使用MPU防护Mem,可能导致BusFault
UsageFault:指令集错误
part3
SVCall:系统调用
PendSV:用于上下文切换(退出ISR时,恢复上下文)
当操作系统的调度器决定切换任务时,通过设置 SCB->ICSR 寄存器的 PENDSVSET 位,触发 PendSV 异常。
PendSV 是优先级可配置的最低优先级异常,会等待所有高优先级中断 / 异常处理完成后再执行,避免上下文切换打断关键的中断处理(如外设中断、定时器中断),保证系统稳定性。
part4
SysTick:滴答定时器
异常类型
0 | - | - | 栈顶,复位时从向量表的第一个内存位置加载 |
1 | Reset | -3 (最高) | 复位,包括上电和热启动 |
2 | NMI | -2 | 不可屏蔽中断,可在芯片内部产生,也可以在外部产生 |
3 | Hard Fault | -1 | 所有的Fault都可以能引发,前提是相应的错误处理未使能 |
4 | MemManage Fault | 可编程 | 储存器管理错误,存储器管理单元(MPU)冲突或访问非法位置 |
5 | Bus Fault | 可编程 | 总线错误。预取错误,内存访问错误和其他地址/内存有关。 当高级高性能总线(AHB)接口收到从总线的错误响应时产生 (若为取值也被称作预取终止,数据访问则为数据终止) |
6 | Usage Fault | 可编程 | 使用错误,如执行未定义的指令或非法的状态转换尝试, 访问协处理器等(Cortex-M3和Cortex-M4不支持协处理器) |
7 ~ 10 | 保留 | NA | 保留 |
11 | SVC | 可编程 | 请求管理调用,一般用于OS环境且允许应用任务访问系统服务 |
12 | Debug Monitor | 可编程 | 调试监控。在使用基于软件的调试方案时,断点和监视点等调试时间的异常 |
13 | 保留 | NA | 保留 |
14 | PendSV | 可编程 | 可Pending的服务调用。OS一般用该异常进行上下文切换 |
15 | SysTick | 可编程 | 系统节拍定时器。当其在处理器中存在时,由定时器外设产生。可用于OS或简单的定时器外设 |
16及16以上 | External Interrupt | 可编程 | 可由片上外设或外设中断产生 |
NVIC functional description
NVIC最多支持240个中断,每个中断具有多达256个优先级级别。
您可以动态地更改中断的优先级。NVIC与处理器核心接口紧密耦合,以实现低延迟的中断处理以及高效处理延迟到达的中断。
NVIC还维护着中断的堆叠(或嵌套)状态,从而实现中断的尾链处理。
Low power modes
现可以包括一个唤醒中断控制器(WIC)。
这使得处理器和NVIC能够进入极低功耗的睡眠模式,而由WIC来识别并优先处理中断。
当使用WIC时,您必须在系统控制寄存器中启用SLEEPDEEP位。
处理器完全实现了等待中断(WFI)、等待事件(WFE)以及发送事件(SEV)指令。
Level versus pulse interrupts
处理器支持电平中断和脉冲中断。电平中断在被中断服务程序(ISR)访问设备之前一直保持有效状态。脉冲中断是边沿触发模型的一种变体。
ICTR【Interrupt Controller Type Register】
ISER【Interrupt Set Enable Registers】
这是一个中断使能寄存器组。是个u32类型的数组,成员有8个。 CM3、4 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。根据单片机生产厂商的设计,不一定会全部使用到。
ICER【Interrupt Clear Enable Registers】
一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ISER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。
IP [240]【Interrupt Priority Registers】
一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32F407 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个 8bit的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而 STM32F407只用到了其中的 82 个。IP[81]-IP[0]分别对应中断 81~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。
//----------以上是常用的NVIC寄存器,对NVIC的配置实际上就是配置这几个寄存器----------//
ISPR【Interrupt Set Pending Registers】
一个中断使能挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
ICPR【Interrupt Clear Pending Registers】
是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断解挂。写 0 无效。
IABR【Interrupt Active Bit Registers】
一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
优先级的定义
1.优先级只有主优先级和子优先级
2.所谓的优先级分组是决定了IP寄存器的高4bit,其中哪几位代表主优先级,几位代表子优先级
3.数值越小所代表的优先级就越高
4.抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
5.响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断
cortexm相关
