|
最近在基于STM32H743VIT6开发工业通信模块时,需要通过UART实现大数据量不定长数据接收,最初使用中断轮询方式频繁出现丢包问题,改用DMA传输后又遇到缓存溢出和数据错位的坑,折腾一周后终于找到稳定方案,特此分享给有需要的坛友。 一、核心需求与初始问题
二、关键解决步骤
c // 核心代码片段 define RX_BUF_SIZE 2048uint8_t rx_buf[RX_BUF_SIZE] = {0}; uint16_t last_rx_len = 0; // 初始化后启动DMA接收 HAL_UART_Receive_DMA(&huart2, rx_buf, RX_BUF_SIZE); // 空闲中断回调函数(关键) void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { __HAL_UART_CLEAR_IDLEFLAG(huart); uint16_t current_len = RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx); if (current_len > last_rx_len) { // 正常接收:处理rx_buf[last_rx_len..current_len-1] process_data(&rx_buf[last_rx_len], current_len - last_rx_len); } else { // 循环溢出:分两段处理 process_data(&rx_buf[last_rx_len], RX_BUF_SIZE - last_rx_len); process_data(rx_buf, current_len); } last_rx_len = current_len; } }
三、测试结果
目前该方案已成功应用于工业网关项目,兼容STM32H7全系列芯片,HAL库和LL库均可适配。如果大家在DMA+UART使用中遇到其他问题,欢迎在评论区交流,也求大佬分享更多优化技巧! |
STM32H7系列再添新成员,这次是高性能微控制来了
来了,老铁!混合信号 + 高性能双杀!NUCLEO-G564RE & H7P5II 试用马上来
【2026.11.07】每日签到:STM32H735G-DK评测、Coremark跑分结果显示在LCD
【2026.10.31】每日签到:STM32H735G-DK评测.TouchGFX在LCD—text中显示动态字符
【2026.11.1】每日签到:STM32H735G-DK评测.接收串口字符并显示在LCD—text中
STM32H747的四线SPI(QUADSPI)是否支持slave模式?
[STM32H735G-DK评测]tocuchGFX中的时钟时针和秒针在MDK中丢失了
【2026.10.18】每日签到:STM32H735G-DK评测.接收串口字符并显示在LCD—text中
【2026.10.17】每日签到:STM32H735G-DK评测.TouchGFX在LCD—text中显示动态字符
使用STM32H743IIT6,读写MCU内部Flash固定地址与固定长度的区域,出现随机性HardFault错误,请问是什么原因?
微信公众号
手机版
感谢分享