打印
[其他ST产品]

配置和使用NVIC

[复制链接]
780|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
配置中断优先级分组
优先级分组定义了抢占优先级和子优先级的划分比例。以下是配置优先级分组的示例:

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 位子优先级,刚好适合实时抢占需求。

使用特权

评论回复
5
周半梅| | 2025-3-20 08:21 | 只看该作者
你这个 USART1 的中断优先级比 EXTI0 低,如果串口中断和外部中断同时发生,会不会影响数据接收?

使用特权

评论回复
6
帛灿灿| | 2025-3-20 08:22 | 只看该作者
STM32F4 的 NVIC 其实已经改成 HAL_NVIC_SetPriorityGrouping() 这种 HAL 库的方式了,你是用标准库开发的吗?

使用特权

评论回复
7
童雨竹| | 2025-3-20 08:23 | 只看该作者
如果是 FreeRTOS 之类的 RTOS 环境,NVIC 的优先级要小心配置,不能高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,否则可能会出问题。

使用特权

评论回复
8
万图| | 2025-3-20 08:24 | 只看该作者
你有没有遇到 NVIC 配置好但中断不触发的情况?一般要检查 NVIC 之外,中断源是否打开、标志位是否清除等问题。

使用特权

评论回复
9
Wordsworth| | 2025-3-20 08:25 | 只看该作者
如果你的中断处理函数比较复杂,建议把高优先级的任务放到主循环处理,避免长时间占用 CPU。

使用特权

评论回复
10
Bblythe| | 2025-3-20 08:26 | 只看该作者
你这个 EXTI0 设置的是最高优先级,会不会有低优先级任务被打断的情况?有些时候外部中断触发太频繁也会影响系统性能。

使用特权

评论回复
11
Pulitzer| | 2025-3-20 08:27 | 只看该作者
STM32 的 NVIC 允许动态修改优先级,NVIC_SetPriority() 可以在运行时调整,适合处理不同场景的优先级需求。

使用特权

评论回复
12
Uriah| | 2025-3-20 08:28 | 只看该作者
如果你要禁用某个中断,可以用 NVIC_DisableIRQ(),这样比直接在中断函数里改 NVIC_Init() 更加直观。

使用特权

评论回复
13
Clyde011| | 2025-3-20 08:29 | 只看该作者
有些 STM32 片上集成了 FPU(浮点运算单元),如果在中断里用浮点计算,记得开启 FPU_IRQHandler 相关的 NVIC 配置,否则可能会引起 HardFault。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

691

帖子

0

粉丝