NVIC中断优先级

本文介绍了STM32中的NVIC中断优先级设置,包括中断分组如何决定抢占和响应优先级位数,以及中断优先级的执行规则。内容涉及NVIC_InitStructure结构体的使用,如设置TIM3_IRQn中断的抢占和响应优先级。

如果将一个中断设置为中断分组2,那么将有IP寄存器的四个位中,有两个位是用来设置响应优先级,两个位来设置抢占优先级的

对于每一个中断,IP中四个位就是2的四次方。一共有16种优先级设置。确定中断分组就是确定一个中断的抢占优先级和响应优先级的位数。

·高优先级的抢占优先级可以打断正在进行的底抢占优先级中断的。

·抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

·抢占优先级相同的中断,当两个中断同时发生的情况下,哪个优先级高,那个先执行。

·如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//对于103系列,有60个通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
N

NVIC(Nested Vectored Interrupt Controller)是ARM Cortex-M系列微控制器中的中断控制器,负责管理中断优先级中断使能以及中断响应。在STM32等基于Cortex-M内核的MCU中,NVIC支持中断优先级的分设置,以实现对抢占优先级(Preemption Priority)和响应优先级(Subpriority)的灵活管理。 ### NVIC中断优先级分组原理 NVIC将每个中断优先级寄存器分为两部分:一部分用于表示抢占优先级,另一部分用于表示响应优先级。这种划分通过设置优先级寄存器(NVIC_IPRx中的Grouping Field)来实现。ARM Cortex-M内核支持最多5种优先级方式,具体如下: | 分编号 | 抢占优先级位数 | 响应优先级位数 | |----------|----------------|----------------| | Group 0 | 0 | 4 | | Group 1 | 1 | 3 | | Group 2 | 2 | 2 | | Group 3 | 3 | 1 | | Group 4 | 4 | 0 | 例如,当选择Group 2时,抢占优先级2位,可以表示4个不同的抢占级别(0~3),响应优先级2位,可以表示4个不同的响应级别(0~3)[^2]。 ### NVIC中断优先级分组设置方法 在STM32系统中,通常使用标准外设库或HAL库进行配置。以下是两种常见方式: #### 1. 使用标准外设库设置 在程序启动后,首先调用函数 `NVIC_PriorityGroupConfig()` 来设置中断优先级分组: ```c NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置为Group 2 ``` 该函数定义在 `misc.c` 文件中,参数 `NVIC_PriorityGroup_2` 表示设置为Group 2模式,即2位抢占优先级2位响应优先级[^4]。 #### 2. 使用HAL库设置 在HAL库中,优先级通常在 `HAL_Init()` 函数中调用 `HAL_NVIC_SetPriorityGrouping()` 函数进行设置: ```c HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); // 设置为Group 2 ``` 此函数会配置系统中断优先级分组模式,并在整个系统运行过程中仅调用一次[^3]。 #### 3. 设置具体中断优先级 在完成优先级之后,可以通过 `NVIC_Init()` 或 `HAL_NVIC_SetPriority()` 函数设置具体中断的抢占优先级和响应优先级。 使用标准外设库: ```c NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); ``` 使用HAL库: ```c HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); // 设置抢占优先级为1,响应优先级为0 HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断 ``` ### 注意事项 - **优先级在整个系统中仅设置一次**,通常在系统初始化阶段完成,尽量避免在运行过程中更改。 - 不同的分方式会影响中断嵌套的能力。抢占优先级高的中断可以打断优先级低的中断服务程序,而响应优先级用于在同级抢占优先级之间决定响应顺序。 - 在多任务系统中,合理设置优先级优先级值可以提高系统的实时性和响应能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值