如何在STM32CubeMX中为DMA配置NVIC?
问题背景
我基于STM32CubeMX开展开发工作,尝试通过UART的DMA模式实现STM32G070微控制器与Quectel BC660K-GL模块的通信连接。
- 我已掌握DMA基本工作原理,DMA Settings标签页内的配置项逻辑对我来说没有障碍
- 目前对NVIC Settings标签页的配置存在明确疑问:不确定是否需要勾选
USART1 global interrupt / USART1 wake-up interrupt through EXTI line 25选项,对应配置界面如下图所示:
我查阅了大量在线教程,均未找到关于该配置项的明确说明。
解答
要不要勾选这个中断选项没有强制统一的要求,完全取决于你的代码实现逻辑和低功耗功能需求,可按以下两类场景判断:
- 必须勾选的场景(99%的常规开发场景都属于这类)
如果你使用STM32 HAL库自带的HAL_UART_Transmit_DMA()、HAL_UART_Receive_DMA()接口实现非阻塞收发,这个选项必须勾选。
不要轻信网上“用DMA就不需要开UART中断”的错误说法:HAL库的UART DMA逻辑并非靠硬件自动完成全流程处理,DMA通道本身的中断仅负责响应传输计数相关的事件,但UART通信过程中可能出现的帧错误、总线噪声、接收溢出、奇偶校验错误,以及对接AT模块做不定长接收必须用到的IDLE总线空闲事件,全部需要靠USART1全局中断触发处理。如果不开这个中断,一旦通信过程中触发错误,HAL库的UART状态机就会一直卡在“忙”状态,后续所有收发调用都会直接返回失败,甚至没有明确的故障提示供排查。
如果你后续计划做低功耗优化,让MCU在休眠模式下靠BC660K-GL的上报数据唤醒,也必须开启这个中断——对应的唤醒事件正是通过EXTI线25触发的。 - 可以不勾选的场景
如果你完全弃用HAL库的UART驱动层,自行编写寄存器逻辑实现纯轮询式DMA收发:不使用任何中断处理事件、不需要低功耗唤醒功能、全程通过读取寄存器标志位判断传输状态和错误,那可以不开启这个中断。但这种写法用来跑AT指令通信属于舍近求远,既浪费CPU资源,稳定性也差,完全不推荐。
针对你连接BC660K-GL模块的场景补充实用提示:除了开启USART1全局中断,对应DMA通道的传输完成、半传输中断也要记得打开,建议把USART1的中断优先级设置得比对应DMA通道的优先级稍高,避免错误响应不及时导致丢包或者状态机锁死。
内容的提问来源于stack exchange,提问作者Nemanja
相关产品推荐
相关产品推荐

