【电路笔记 STM32】Cortex-M7 UART DMA模式(DMA&空闲中断&普通模式+DMA&半满/全满中断&循环模式)

文章目录

STM32CubeMX配置

基础配置

DMA 的 Normal 和 Circular

模式 行为 适合场景
Normal 传输完一次就停,需要重新调用启动函数 定长收发、一次性发送
Circular 缓冲区写满后自动回到开头继续写 连续接收、ADC、音频、串口流

DMA 的FIFO配置

DMA Request Synchronization Settings

  • DMA Request Synchronization Settings 是 STM32H7 里 DMAMUX 的"同步触发"功能,用来让 DMA 传输被某个外部事件(比如 EXTI、定时器 TRGO、DMA 完成事件等)门控触发。
  • DMA 传输必须严格跟随某个外部触发信号,比如:
    • 定时器 TRGO 触发 ADC DMA 采样
    • EXTI 触发 SPI DMA 发送
    • 某个外设事件到来后,才允许 DMA 搬运 N 个数据

DMA 的中断配置

关闭MPU

DMA控制语句

HAL_UART_Receive_DMA

普通定长 DMA 接收

c 复制代码
HAL_UART_Receive_DMA(&huart1, rx_buf, len);
  • 触发条件 :DMA 计数器减到 0,即收满 len 字节。
  • 回调 :HAL_UART_RxCpltCallback()。
  • 适用:已知长度的帧,比如固定 8 字节寄存器应答。
  • 局限:必须预知长度;收不满不会回调。

循环 DMA + 半满/全满中断

c 复制代码
hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;
HAL_UART_Receive_DMA(&huart1, rx_buf, size);
  • 触发条件:缓冲区半满、全满时分别触发 HT / TC 事件。可配合__HAL_DMA_ENABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
  • 回调 :HAL_UART_RxHalfCpltCallback()、HAL_UART_RxCpltCallback()。
  • 适用:高速连续数据流,避免缓冲区被覆盖。
  • 局限:不能直接判断"一帧结束",通常还要配合超时或协议解析。
  • Circular 模式是 DMA 写满缓冲区后从之前索引位置继续写,所以启动一次就够了。实测重新启动也不会从usart3_rx_dma_buf0的位置续写。

HAL_UART_Receive_DMA

DMA + 空闲中断(不定长)

c 复制代码
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buf, size);
  • 触发条件 :收满 size 字节,或 RX 线出现空闲。
  • 回调 :HAL_UARTEx_RxEventCallback(huart, Size),Size 是实际接收长度。
  • 适用:Modbus RTU、AT 指令、传感器不定长上报。
  • 注意 :回调里处理完数据后必须重新调用 HAL_UARTEx_ReceiveToIdle_DMA,否则下一帧收不到;DMA 模式通常用 Normal 即可。

中断控制语句

__HAL_DMA_DISABLE_IT

  • __HAL_DMA_DISABLE_IT宏用来关闭指定 DMA 通道的某些中断源。 参数含义:
参数 含义
__HANDLE__ DMA 句柄指针,例如 &hdma_usart1_rx
__INTERRUPT__ 要禁用的 DMA 中断源,可组合使用,DMA_IT_TC:传输完成中断,DMA_IT_HT半传输完成中断,DMA_IT_TE:传输错误中断
  • 使用示例

    • 如果不想让 DMA 接收触发半传输中断,可以写:__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);

    • 如果要同时关闭传输完成和传输错误中断:__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_TC | DMA_IT_TE);

  • 注意事项

    • 它只关闭 DMA 通道自身的中断使能位 ,不等于关闭 NVIC 中断通道。如果 NVIC 里已经使能了该 DMA 中断,必要时还要配合 HAL_NVIC_DisableIRQ()。
    • 它和 __HAL_DMA_DISABLE() 不同:__HAL_DMA_DISABLE() 是关闭 DMA 通道本身,即清除 CCR 的 EN 位;而 __HAL_DMA_DISABLE_IT() 只是关闭中断。
    • 在 CubeMX 生成的 HAL 工程里,DMA 初始化后如果想屏蔽某些不必要的 DMA 中断,就可以用这个宏。

__HAL_DMA_ENABLE_IT

  • 同理
相关推荐
sramdram1 小时前
国产32位CH32V系列RISC-V单片机
单片机·嵌入式硬件·risc-v·国产32位单片机·risc-v单片机
万物智能信息科技1 小时前
人体感应芯片PIR模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·嵌入式硬件·华为·开源·harmonyos
youcans_1 小时前
【STM32C5教程】(4)GPIO 外部中断实验
stm32·单片机·嵌入式硬件·mcu·stm32c5
心仪久了会沦陷2 小时前
C语言数据结构入门——队列补充:循环队列的数组实现
c语言·开发语言·数据结构·笔记
志尊宝2 小时前
Vue3 零基础每日笔记(081):富文本编辑器集成 wangEditor 5——封装
前端·javascript·vue.js·笔记·信息可视化·echarts
深圳市恒锐丰科技杨生2 小时前
# CSM9118|芯晞微电 7.5V/1.5A 单通道 H 桥电机 / 线圈驱动
嵌入式硬件·硬件工程
硅基手札2 小时前
【I2C 技术系列 09】I2C 传输模式:轮询 / 中断 / DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
志尊宝3 小时前
Vue3 零基础每日笔记(080):Vue3 + ECharts 数据可视化——封装可复用图表组件
前端·javascript·vue.js·笔记·信息可视化·echarts
沪上企服通3 小时前
从票据采集到凭证生成:代账 pipeline 的 OCR、查重与规则引擎设计笔记
笔记·ocr