【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 文章被收录于专栏

cortexm相关

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务