本文共 2029 字,大约阅读时间需要 6 分钟。
STM32H7嵌入式系统开发教程:NVIC中断优先级配置
本章节将详细讲解STM32H7中的NVIC(Nested Vectored Interrupt Controller)中断优先级配置,帮助开发者全面理解和掌握这一重要知识点。
NVIC,全称Nested Vectored Interrupt Controller,即嵌套向量中断控制器,是用于管理和配置多个中断的高级功能芯片。对于STM32H7系列,其中断的优先级由一个8位的寄存器(NVIC_PRI)控制,这8位寄存器的使用方式与芯片型号有关。
在实际应用中,芯片厂商根据具体实现进行了优化。例如,STM32F1xx、F4xx和STM32H7系列中,只使用NVIC_PRI的高四位(7:4位),因此能够配置的中断优先级范围是0至15级。
优先级分组、抢占优先级与子优先级
NVIC支持抢占优先级和子优先级的配置。这意味着高抢占优先级的中断可以在低抢占优先级中断正在执行时强行中断并占用资源。子优先级用于区分同一优先级的中断请求,子优先级高的中断优先执行。默认配置
系统上电复位后,默认使用优先级分组0,即没有抢占优先级,只有子优先级。默认中断响应模式
-具有高抢占优先级的中断可以在低抢占优先级的中断服务程序运行期间响应。-在抢占优先级相同的情况下,子优先级高的中断优先响应。特殊中断类型
例如,系统中断(如PendSV、SVC、SysTick)与外设中的普通中断在同一个NVIC中设置,不会占用额外的NVIC资源。在实际开发中,我们主要通过两个函数来配置和管理NVIC中断:
函数原型
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
功能描述
通过该函数可以设置中断的抢占优先级和子优先级。参数说明
IRQn
: 中断号,定义在IRQn_Type
枚举类型中。PreemptPriority
: 抢占优先级,可取0-15范围内的值。SubPriority
: 子优先级,取值范围为0-15。使用示例
// 设置ADC中断的抢占优先级为1,子优先级为0HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
函数原型
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
功能描述
通过该函数可以使能指定中断的NVIC中断响应功能。注意事项
在调用HAL_NVIC_EnableIRQ
函数前,必须先调用NVIC_PriorityGroupConfig
函数以确保优先级分组设置正确。 使用示例
// 使能ADC中断响应HAL_NVIC_EnableIRQ(ADC_IRQn);
在开发过程中,为了确保中断优先级设置正确,可以使用Keil’s C-51 Prophet Hermes或IAR Embedded Workbench等开发工具的调试功能。
操作步骤:
在STM32H7开发中,开关中断的处理采用分开控制器的方法。
通过查看 BSP文件中的bsp.h
,可以找到开关中断相关的宏定义:
// 开关中断控制定义 #define ENABLE_INT() __set_PRIMASK(0) // 允许全局中断请求 #define DISABLE_INT() __set_PRIMASK(1) // 禁止全局中断请求
其中,__set_PRIMASK(0)
和__set_PRIMASK(1)
分别用于控制是否允许中断进入程序。
通过本章的学习,我们掌握了完整的NVIC中断优先级配置方法。特别需要注意的是:
对于实际开发,建议采用MDK调试工具查看中断优先级配置,确保中断响应正确。同时,对于复杂的嵌套中断场景,可以根据实际需求合理配置抢占优先级和子优先级,以保证系统的实时性和稳定性。
转载地址:http://aunjz.baihongyu.com/