欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 104|回复: 0

STM32 中断优先级相关概念与使用笔记

[复制链接]
发表于 2025-11-25 20:36:54 | 显示全部楼层 |阅读模式
[AppleScript] 纯文本查看 复制代码
STM32 中断优先级相关概念与使用笔记 
上海 华东师范大学 通信工程系 ma-chao 
一、基本概念 
1.ARM cortex_m3 内核支持256 个中断(16个内核+240外部)和可编程256级中断优先级
的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于
cortex_m3 内核的部分。STM32采用了cortex_m3内核,所以这部分仍旧保留使用,但STM32
并没有使用 cortex_m3 内核全部的东西(如内存保护单元 MPU 等),因此它的 NVIC 是
cortex_m3 内核的NVIC 的子集。 
2.STM32 目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级
的设置(仅使用中断优先级设置 8bit 中的高 4 位,见后面解释)。《参考最新 101xx-107xx 
STM32 Reference manual, RM0008》。 
3.以下主要对“外部中断通道”进行说明。 
对于cortex_m3 内核所支持的 240 个外部中断,我在这里使用了“中断通道”这个概
念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的
中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请
中断。因此,下面关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先
级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,
都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用
户的中断服务程序。 
4. STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断
通道都具备自己的中断优先级控制字节PRI_n(8位,但在STM32中只使用4位,高4位有
效),每4个通道的8位中断优先级控制字(PRI_n)构成一个32位的优先级寄存器(Priority 
Register)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是NVIC
寄存器中的一个重要部分。 
5.对于这4bit的中断优先级控制位还必须分成2组看:从高位开始,前面是定义抢先式优
先级的位,后面用于定义子优先级。4bit的分组组合可以有以下几种形式: 
编 号 
 分配情况  
7 
0:4 
无抢先式优先级,16个子优先级 
6 
1:3 
2 个抢先式优先级,8个子优先级 
5 
2:2 
4 个抢先式优先级,4个子优先级 
4 
3:1 
8 个抢先式优先级,2个子优先级 
3/2/1/0 
4:0 
16 个抢先式优先级,无子优先级 
6.在一个系统中,通常只使用上面5种分配情况的一种,具体采用哪一种,需要在初始化
时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)
的第[10:8]这3个位中。这3个bit位有专门的称呼:PRIGROUP(具体写操作后面介绍)。
比如你将0x05(即上表中的编号)写到AIRC 的[10:8]中,那么也就规定了你的系统中只
有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同级别的子优先级。 
7.AIRC 中 PRIGROUP 的值规定了设置和确定每个外部中断通道优先级的格式。例如,在上
面将0x05 写入了AIRC中PRIGROUP,也就规定了当前系统中只能有4个抢先式优先级,相
同的抢先式优先级下还可以有4个不同级别的子优先级,他们分别为: 
位[7:6]  
位[5:4] 
00 
位[3:0] 
0 号抢先优先级 00 
01 
0 号子优先级 无效 
1 号抢先优先级 01 
10 
1 号子优先级 无效 
2 号抢先优先级 10 
11 
2 号子优先级 无效 
3 号抢先优先级 11 
3 号子优先级 无效 
8.如果在你的系统中使用了 TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而
TIME2 中断必须优先响应,而且当系统在执行EXIT0中断服务时也必须打断(抢先、嵌套),
就必须设置TIME2的抢先优先级比EXTI0的抢先优先级要高(数目小)。假定EXTI0为2号
抢先优先级,那么TIME2 就必须设置成 0 或 1 号抢先优先级。这些工作需要在AIRC 中的
PRIGROUP 设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设
备)进行设置。 
9.具体优先级的确定和嵌套规则。ARM cortex_m3(STM32)规定 
a/ 只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。 
b/ 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但STM32首
先响应子优先级高的中断。 
c/ 当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32首先响应中断通道
所对应的中断向量地址低的那个中断(见ROM0008,表52)。 
具体一点: 
0 号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先
级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。 
如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出
现(或挂在那里等待),就看它们2个谁的子优先级高了,如果子优先级也相同,就看它们
的中断向量位置了。 
10.上电Reset 后,寄存器AIRC中PRIGROUP[10:8]的值为 0(编号0),因此此时系统使
用16个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字PRI_n也都
是0,所以根据上面的定义可以得出,此时68个外部中断通道的抢先优先级都是0号,没
有子优先级的区分。故此时不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中
断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32
优先响应。 
注意:此时内部中断的抢先优先级也都是0号,由于它们的中断向量地址比外部中断向
量地址都低,所以它们的优先级比外部中断通道高,但如果此时正在执行一个外部中断服务,
它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。 
了解以上基本概念还是不够的,还要了解具体中断的控制有那些途径,中断服务程序
如何正确的编写。下面的描述主要以TIME2通道为例。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-1-10 00:14

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表