STM32(五)NVIC中断优先级管理

本文介绍了STM32的中断管理,特别是NVIC中断优先级的配置,包括ISER、ICER、IP寄存器的作用,以及中断分组的概念,如分组设置、抢占优先级和响应优先级。还提到了NVIC_PriorityGroupConfig和NVIC_Init函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录



前言

使用中断前,需了解中断优先级管理,
CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256
级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。
STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列
上面,又只有 60 个(在 107 系列才有 68 个)。因为我们开发板选择的芯片是 STM32F103 系列
的所以我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。


一、STM32 NVIC 中断优先级管理

在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体:

typedef struct
{
__IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register /
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /
!< Interrupt Clear Enable Register /
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /
!< Interrupt Set Pending Register /
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /
!< Interrupt Clear Pending Register /
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /
!< Interrupt Active bit Register /
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /
!< Interrupt Priority Register, 8Bit wide /
uint32_t RESERVED5[644];
__O uint32_t STIR; /
!< Software Trigger Interrupt Register */
} NVIC_Type;

ISER[8]: 中断使能寄存器组,使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能,配合中断分组、屏蔽、IO 口映射等设置。
ICER[8]: 中断除能寄存器组,用来清除某个中断的使能。
ISPR[8]: 中断挂起控制寄存器组,通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
ICPR[8]: 中断解挂控制寄存器组,通过设置 1,可以将挂起的中断接挂。写 0 无效。
IABR[8]: 中断激活标志位寄存器组
IP[240]: 中断优先级控制的寄存器组,由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,240 个可屏蔽中断。只用了高 4 位,这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

二、STM32 的中断分组

STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
在这里插入图片描述
每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

中断优先级分组函数 NVIC_PriorityGroupConfig

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分
组确定就最好不要更改。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0) ||
((GROUP) == NVIC_PriorityGroup_1) ||
((GROUP) == NVIC_PriorityGroup_2) ||
((GROUP) == NVIC_PriorityGroup_3) ||
((GROUP) == NVIC_PriorityGroup_4))

分组范围为 0-4

中断初始化函数 NVIC_Init

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

NVIC_InitTypeDef 是一个结构体

typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

NVIC_InitTypeDef 结构体中间有三个成员变量,这三个成员变量的作用是:
NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。
例如 USART1_IRQn。
NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。
NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
NVIC_IRQChannelCmd:该中断是否使能。

中断优先级设置的步骤:

  1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的
    分配位数。调用函数为 NVIC_PriorityGroupConfig();
  2. 设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();

三、NVIC的作用

NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是ARM Cortex-M系列微控制器中的一个重要组成部分,它主要用于管理中断请求并控制中断的处理流程。NVIC的主要作用包括以下几个方面:

  1. 中断管理:

    • NVIC负责接收来自微控制器内部和外部的中断请求。
    • 它维护中断请求的状态,包括中断是否被启用、挂起等。
  2. 中断优先级设置:

    • NVIC允许开发者设置每个中断源的优先级,这有助于确定哪个中断应该被优先处理。
    • 支持中断的抢占优先级和子优先级(响应优先级),以实现更精细的控制。
  3. 中断嵌套处理:

    • 如果一个中断正在被处理时另一个更高优先级的中断到来,NVIC会暂停当前较低优先级的中断处理,并转去处理新的高优先级中断。
    • 这种机制确保了系统能够快速响应最高优先级的事件。
  4. 中断使能与禁用:

    • 开发者可以通过NVIC使能或禁用特定的中断源,这对于调试和优化中断处理流程非常有用。
  5. 中断挂起与清除:

    • 当中断发生但尚未被处理时,NVIC可以将其挂起。
    • 处理完中断后,NVIC可以清除中断标志,以便下次中断可以再次被触发。
  6. 中断向量表管理:

    • NVIC维护一个中断向量表,其中包含每个中断服务例程(ISR)的入口地址。
    • 当中断发生时,NVIC会根据中断类型自动跳转到正确的ISR。
  7. 处理器状态保存与恢复:

    • 当一个中断被处理时,NVIC会自动保存处理器状态(如程序计数器PC、链接寄存器LR、通用寄存器等)到堆栈中。
    • 在中断处理完成后,NVIC会恢复处理器状态,使程序能够从被打断的地方继续执行。
  8. 软件触发中断:

    • NVIC支持软件触发中断,这意味着开发者可以通过软件指令触发一个中断,而不仅仅是等待硬件事件。

NVIC的存在极大地简化了中断处理过程,并提高了系统的响应能力和灵活性。在嵌入式系统设计中,合理地配置和使用NVIC可以显著提高系统的实时性能和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小超电子笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值