[其他ST产品] 配置和使用NVIC

[复制链接]
 楼主| 纠结的那些年 发表于 2024-5-29 15:55 | 显示全部楼层 |阅读模式
配置中断优先级分组
优先级分组定义了抢占优先级和子优先级的划分比例。以下是配置优先级分组的示例:

c

#include "stm32f4xx.h" // 根据使用的具体型号包含相应的头文件

void NVIC_Configuration(void)
{
    // 配置优先级分组,设为 Group 3(4 bits for pre-emption priority, 0 bits for subpriority)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);

    // 配置具体中断通道的优先级
    NVIC_InitTypeDef NVIC_InitStructure;

    // 配置 USART1 中断
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 配置 EXTI Line0 中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


kepe 发表于 2024-7-31 01:04 | 显示全部楼层
中断优先级是通过 NVIC_InitTypeDef 结构体进行配置的。你需要为每个中断通道设置抢占优先级和子优先级,并启用或禁用中断。
AdaMaYun 发表于 2024-7-31 19:02 | 显示全部楼层
配置中断优先级分组十分重要
公羊子丹 发表于 2025-3-20 08:20 | 显示全部楼层
STM32F4 的 NVIC 里优先级分组挺重要的,你这个 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 设的是 4 位抢占优先级,0 位子优先级,刚好适合实时抢占需求。
周半梅 发表于 2025-3-20 08:21 | 显示全部楼层
你这个 USART1 的中断优先级比 EXTI0 低,如果串口中断和外部中断同时发生,会不会影响数据接收?
帛灿灿 发表于 2025-3-20 08:22 | 显示全部楼层
STM32F4 的 NVIC 其实已经改成 HAL_NVIC_SetPriorityGrouping() 这种 HAL 库的方式了,你是用标准库开发的吗?
童雨竹 发表于 2025-3-20 08:23 | 显示全部楼层
如果是 FreeRTOS 之类的 RTOS 环境,NVIC 的优先级要小心配置,不能高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,否则可能会出问题。
万图 发表于 2025-3-20 08:24 | 显示全部楼层
你有没有遇到 NVIC 配置好但中断不触发的情况?一般要检查 NVIC 之外,中断源是否打开、标志位是否清除等问题。
Wordsworth 发表于 2025-3-20 08:25 | 显示全部楼层
如果你的中断处理函数比较复杂,建议把高优先级的任务放到主循环处理,避免长时间占用 CPU。
Bblythe 发表于 2025-3-20 08:26 | 显示全部楼层
你这个 EXTI0 设置的是最高优先级,会不会有低优先级任务被打断的情况?有些时候外部中断触发太频繁也会影响系统性能。
Pulitzer 发表于 2025-3-20 08:27 | 显示全部楼层
STM32 的 NVIC 允许动态修改优先级,NVIC_SetPriority() 可以在运行时调整,适合处理不同场景的优先级需求。
Uriah 发表于 2025-3-20 08:28 | 显示全部楼层
如果你要禁用某个中断,可以用 NVIC_DisableIRQ(),这样比直接在中断函数里改 NVIC_Init() 更加直观。
Clyde011 发表于 2025-3-20 08:29 | 显示全部楼层
有些 STM32 片上集成了 FPU(浮点运算单元),如果在中断里用浮点计算,记得开启 FPU_IRQHandler 相关的 NVIC 配置,否则可能会引起 HardFault。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

749

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

55

主题

749

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部