STM32-中断-NVIC优先级分组

文章介绍了中断的概念,中断优先级以及中断嵌套。STM32F407的中断向量表和NVIC(嵌套向量中断控制器)是重点,包括NVIC的特性、基本结构和中断优先级管理。NVIC允许对中断进行16级优先级划分,并通过抢占优先级和响应优先级来决定中断处理的顺序。

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

目录

前言

什么是中断?

什么是中断优先级?

什么是中断嵌套?

一、中断与控制

1.1 stm32f407 的中断向量表

二、NVIC(嵌套向量中断控制器)

2.1 NVIC 的一些特性

2.2 NVIC 的基本结构

2.2.1 NVIC工作简单示意图

2.2.2 NVIC如何管理中断呢?

2.3 NVIC中断优先级管理-如何分配中断优先级?

2.3.1 什么是抢占优先级?什么是响应优先级?


前言

什么是中断?

        中断就是主程序在运行的时候,由于触发了某些特定条件主程序暂停,先转去执行中断函数,执行完成后再回到主程序之前暂停的位置继续执行主程序。

什么是中断优先级?

        当有多个中断源同时申请中断时,CPU会根据每个中断源所设置的中断优先级分先后处理中断。

什么是中断嵌套?

        就是把中断再中断。中断嵌套就是当中断函数已经在执行的时候,出现了更高优先级的中断相应申请中断,CPU会暂停当前中断转而执行更高优先级的中断,执行完成后再回到之前被暂停的中断位置继续执行。

一、中断与控制

1.1 stm32f407 的中断向量表

 

 其中灰色的表示的是内核中断,一般我们用不到,而其余的部分就是stm32外设的中断了。

对于F1系列也是类似的,可以找到其中断向量表。


二、NVIC(嵌套向量中断控制器)

2.1 NVIC 的一些特性

  1.   对于STM32F405xx/07xx STM32F415xx/17xx 具有 82 个可屏蔽中断通道(中断源)
  2.   NVIC 是一个内核外设,是CPU的小助手。嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合。
  3.   每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先   级和响应优先级

2.2 NVIC 的基本结构

2.2.1 NVIC工作简单示意图

        
NVIC基本结构简单框图

         如图就是NVIC的简单示意图,左边紫色部分是外设,橙色是内核,红色是CPU。其中n代表这个外设可能占多个中断通道

2.2.2 NVIC如何管理中断呢?

        外设发送中断的时候,会先经过NVIC,NVIC会给每个中断先分配一个优先级,经过NVIC处理后,通过右边的一个输出口,把信息告诉CPU目前需要处理哪一个中断。

        这样一来大大减少了CPU的工作量,分配优先级的任务就交给了NVIC,CPU只需处理完成计算就行了。

2.3 NVIC中断优先级管理-如何分配中断优先级?

        那么NVIC是如何分配中断的优先级的呢?

NVIC优先级分组

分组方式

抢占优先级响应优先级

分组0

0位,取值为0

4位,取值为0~15
分组1

1位,取值为0~1

3位,取值为0~7
分组2

2位,取值为0~3

2位,取值为0~3
分组33位,取值为0~71位,取值为0~1
分组4

4位,取值为0~15

0位,取值为0

        NVIC的分组是由 AIRCR  寄存器的三位来配置的,可以分成 0~4 共5组 (可参见 STM32F3与F4内核编程手册)

        NVIC中断优先级优先级寄存器的4位(0~15)决定,也就是前面所说的每个中断通道有16个可编程的优先级这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。举例:比如选了分组1,那么抢占优先级有1个bit位,只能选0~1;而响应优先级有3个bit位,就可以选0~7。注意:值越小,优先级越高。

2.3.1 什么是抢占优先级?什么是响应优先级?

        举个简单的例子吧:比如CPU现在要处理多个中断,那么响应优先级更高的中断可以提前被执行;如果这时已经在执行中断程序了,来了个抢占优先级更高的新中断,这个新中断就能打断当前正在执行的中断,转而先执行这个抢占优先级更高的新中断——也就是中断嵌套。执行完成后再执行原来被打断的中断。

        抢占优先级高的可以中断嵌套(是可以打断正在进行的低抢占优先级中断)

        抢占优先级相同的中断,当两个中断同时发生时,哪个响应优先级高先执行哪个。

        响应优先级高的可以优先排队,抢占优先级和响应优先级均相同按中断号排队

### STM32 NVIC 优先级配置与 FreeRTOS 协同工作 对于 STM32 和 FreeRTOS 的组合,在配置嵌套向量中断控制器(NVIC)的优先级时需特别注意,以确保实时性能和可靠性。FreeRTOS 使用一个特殊的机制来管理中断优先级,这涉及到两个概念:最大系统调用优先级(`configMAX_SYSCALL_INTERRUPT_PRIORITY`)以及最低可能的中断优先级。 当在 STM32 上实现这一配置时,重要的一点是在 `FreeRTOSConfig.h` 文件中定义上述参数[^2]。此参数决定了哪些中断可以在调度器运行期间被服务而不引起上下文切换问题。具体来说: - 中断优先级数值越低表示该中断具有更高的优先权。 - 所有高于或等于 `configMAX_SYSCALL_INTERRUPT_PRIORITY` 值的中断都可以安全地中斷 FreeRTOS 调度程序执行的任务;低于它的任何中断都可能导致不可预测的行为。 为了正确设置这些值并使它们适用于特定的应用场景,通常会采用如下方法: 1. **确定应用需求**:识别应用程序中最关键的时间敏感型外设及其对应的中断线,并决定这些中断相对于其他事件的重要性程度。 2. **调整NVIC寄存器**:利用 CMSIS 提供的功能函数如 `NVIC_SetPriority()` 来设定各个外围设备中断的具体优先级别。例如,如果希望某个定时器中断拥有较高的响应速度,则应给予较低(即较高优先级)的数字作为其优先级参数。 下面是一段用于初始化 Systick 定时器并为其分配适当优先级别的 C 语言代码示例: ```c void SysTick_Configuration(void) { /* 配置滴答时钟的频率 */ if (SysTick_Config(SystemCoreClock / TICK_RATE_HZ)) { /* 配置失败处理 */ while (1); } /* 设置滴答时钟中断优先级 */ NVIC_SetPriority(SysTick_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY); } ``` 这段代码来自关于 STM32F FreeRTOS 滴答时钟配置的内容[^1]。其中 `configLIBRARY_LOWEST_INTERRUPT_PRIORITY` 是指定了给定平台上的最低有效优先级之一,从而允许大多数其他中断能够打断它而不会影响 RTOS 功能。 最后值得注意的是 USB 主机类别的堆栈大小也需要合理规划,特别是在涉及大量数据传输的情况下,比如读写 U盘的操作。建议将 `USB_PROCESS_STACK_SIZE` 参数从默认值增加至更合适的尺寸(如512),以防止因资源不足而导致系统不稳定的情况发生[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值