理解STM32的中断优先级

STM32提供68个中断通道,每个中断源对应不同的外设,如I2C、UART等。中断优先级由抢占式和非抢占式两部分构成,其中4位优先级寄存器用于控制。NVIC_PriorityGroupConfig设置优先级段分配,NVIC_Init配置具体中断源的优先级。抢占式优先级高的中断可以嵌套中断低优先级任务,相同抢占式优先级时,非抢占式优先级高或中断序号低的中断先响应。

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

STM32提供68个中断通道,每一个中断通道对应一个中断源,这里的中断源是指引发中断的外设(例如,I2C,UART,EXTI等等)。每一个中断源又可以包括多种中断发生情况,例如UART发送数据完毕,接收到数据等情况均可能引起UART中断源向STM32内核提出中断处理请求。

STM32的中断优先级可以分为抢占式优先级和非抢占式优先级控制两部分。

为了符合COTEX-M3标准,STM32的中断源优先级寄存器采用8位的方式存储,但是只是用了高4位,低4位保留未用。高4位又被分为了两段:抢占式优先级控制段和非抢占式优先级控制段。STM32提供了一个函数

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x);

用于将这4位进行控制段分配划分,如下表,函数参数就是表的编号列。


对于一个特定的系统,只能在系统启动初调用该函数一次,指定优先级段分配方式。之后其他中断源配置均使用函数

NVIC_Init(&NVIC_InitStructure);--------------------------------------------优先级分组

进行中断源进行具体的优先级配置。涉及到的配置参数如下:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;-----抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;---------------非

### STM32 中断优先级分组配置方法与原理 #### 配置方法 在STM32微控制器中,中断优先级通过NVIC (Nested Vectored Interrupt Controller) 来管理。为了灵活控制不同中断之间的相对优先级STM32允许用户对中断优先级进行分组配置。 具体来说,可以通过调用`NVIC_PriorityGroupConfig()`函数来设定优先级分组模式。该函数接受一个参数,用于指定使用的优先级分组方案: ```c void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); ``` 其中,`NVIC_PriorityGroup`是一个枚举类型的变量,定义了几种不同的优先级分组方式,例如`NVIC_PriorityGroup_0`, `NVIC_PriorityGroup_1`等。每一种分组决定了抢占优先级和响应优先级的具体划分比例[^4]。 #### 分配原则 当选择了某个特定的优先级分组后,总的8位优先级寄存器会被划分为两部分:一部分用来表示抢占优先级,另一部分则代表响应优先级。具体的分割情况取决于所选的分组选项,在某些情况下可能会全部分配给抢占优先级或完全留给响应优先级[^3]。 例如,在采用`NVIC_PriorityGroup_2`的情况下,意味着总共有4位可用于设置抢占优先级,而剩下的4位则作为响应优先级使用。这意味着此时能够区分出多达16个级别的抢占优先级以及同样数量的响应优先级等级。 #### 工作机制 当中断发生时,系统会首先比较各个待处理中断请求的抢占优先级。具有较高抢占优先级中断将会打断当前较低优先级的执行流程并立即得到服务。而对于那些拥有相同抢占优先级的多个中断而言,则进一步依据它们各自的响应优先级来进行排序;即谁的响应优先级更高就先处理哪个中断事件。倘若连这两者也一样的话,则按照这些中断在线程上下文中出现的位置先后次序依次调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值