这里写目录标题
中断
概念:
就是他可以打断系统当前正在执行的任务,让CPU优先执行此任务,等这个任务结束,CPU才能回到刚才被打断的地方重新执行程序。
分类
中断一般分为系统异常和外部中断。
系统异常
把CPU内部产生的紧急事件。比如非法指令(除零)、地址访问越界等;
外部中断
从名字上看,就是由于外部变化而在单片机内产生的中断。比如GPIO引脚电平变化、定时器溢出等。
单片机通过GPIO口接收外部数据,STM32F103的所有GPIO口都可以设置为外部中断模式。
Cortex-M3中断和优先级
Cortex-M3内核有共有0-255,共256个中断。
如何管理中断优先级
Cortex-M3内核有一个专门管理中断的外设NVIC (Nested Vectored Interrupt Controller,嵌套向量中断控制器)用于控制各种中断的优先级实现中断的嵌套和调度。
NVIC是一个总的中断控制器,无论是来在内核的异常还是外设的外部中断,都由NVIC统一进行管理。
除了Reset(复位)、NMI(Non Maskable Interrupt,不可屏蔽中断)、HardFault(硬件异常〉,他们的优先级是固定的,且优先级是负数,是最高的。剩下的异常或中断,都是可以通过修改NVIC的寄存器调整优先级(但不能设置为负数,最小值是0)。
同时在Cortex-M3中,将优先级拆分为抢占优先级(Preempt Priority)和子优先级(Subpriority) ,每个中断都需要指定这两级。
抢占优先级是决定抢占的。这个抢占是对于中断来说的,抢占优先级高的中断能把CPU抢过来。如果CPU正在执行一个中断函数,抢占优先级更高的中断可以打断正在运行的中断,让CPU运行优先级更高的中断。
子优先级是决定运行的先后顺序的,他没有抢占功能,当两个中断的抢占优先级一样,子优先级更高的中断先运行,但是如果在子优先级低的中断正在执行的时候,子优先级高的中断只能等待子优先级低的中断执行完毕才能去执行,因为子优先级没有抢占功能。
STM32中断和优先级
STM32中断介绍
STM32是基于Cortex-M3内核的,所以STM32的中断、优先级设置以及他们的特性和Cortex-M3内核是一样的,只不过STM32将其进行了裁剪。因为Cortex-M3设计有256种中断,但大多数MCU都用不到这么多中断,比如STM32F103系列就只有70种异常和中断,其中前15个是系统异常(有5个预留),后面60个是外部中断。
STM32的中断没有太大的改动,只是去掉了一些可更改的外部中断,同时对所有中断的中断编号重新编排了。STM32中的Reset和NMI属于系统启动时的中断,所以没有设置中断号,然后从HardFault开始的中断号从-13开始向上递增。外部中断编号就从0开始递增了。
STM32优先级介绍
STM32F103继承了Cortex-M3的中断优先级规则,也还用抢占优先级和子优先级对中断优先级进行控制。但是因为STM32F103的中断少了很多,所以中断优先级也用不了那么多,只使用了8个Bit中的4个来设置。所以提供了最大16级的中断优先等级。
STM32中断可以分为抢占优先级和子优先级。
注意:中断优先级中是数值越小越优先。
关于NVIC(5种中断优先级分组:4Bit):
从上面的表格可以看出,STM32 支持 5 种优先级分组,系统上电复位后,默认使用的是优先级分组
0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。
在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级(数值小的)的中断优先被响应。
** 在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。**
对于初学者还有一个比较纠结的问题就是系统中断(比如:PendSV,SVC,SysTick)是不是一
定比外部中断(比如 SPI,USART)要高,答案:不是的,它们是在同一个 NVIC 下面设置的。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这
样中断优先级的管理将非常方便。 这个也是官方强烈建议的。
(注意:一旦初始化好 NVIC 的优先级分组后,切不可以在应用中再次更改。)
设置 NVIC 的优先级分组为 4 表示支持 0-15 级抢占优先级 (注意, 0-15 级是 16 个级别,包含 0 级), 不支持子优先级。
在这里继续强调下这一点,在 NVIC 分组为 4 的情况下,抢占优先级可配置范围是 0-15,那么数值越小,抢占优先级的级别越高,即 0 代表最高优先级,15 代表最低优先级。
中断优先级分组设置特点
- 低于configMAX_SYSCALL_INTERRUPT_PRIORITY(5)优先级的中断(5-15才可以调用)里才可以调用FreeRTOS的API函数。
- 建议将所有的优先级指定为抢占优先级位,方便RTOS的管理。
中断相关的寄存器
三个优先级配置寄存器
为了保证中断时可以打断任务的,但是任务是不可以打断中断的。Pendsv和Systick就是用来处理任务切换的。
三个中断屏蔽寄存器
设置成:5-15就是可以被关闭,被管理的一个范围。
开中断:
文章参考:
https://blog.youkuaiyun.com/wdsclm937256/article/details/125847575
https://www.cnblogs.com/yangguang-it/p/7152549.html