最近做STM32串口编程踩的几个坑

使用STM32CubeIDE开发,串口用HAL库,一个串口因为数据不定长,用HAL_UARTEx_ReceiveToIdle_DMA函数接收;第二个数据定长用HAL_UART_Receive_DMA接收。

DMA只能收到一个字节

最终也没有找到原因,重建新的项目好了。

DMA第二次触发总是收到两帧数据

使用HAL_UARTEx_ReceiveToIdle_DMA函数时,HAL_UARTEx_RxEventCallback回调函数会在三种情况下触发:半满、全满、IDLE。因为一开始我忘了开串口中断,所以IDLE是不触发的。而半满触发后,缓冲区会继续往后写入而不会从头开始写,所以如果缓冲区长度是帧长的两倍,就会导致这种情况。
而且在回调函数中我不知道怎么区分到底是哪种原因触发的回调,HAL库感觉很谜。

开机后串口接收不到任何数据,复位后正常

第二个串口用HAL_UART_Receive_DMA接收,调试时是正常的,正常上电开机就不行。发现是上电后串口收不到数,一旦MCU复位一次就正常了。
我的程序会反复调用HAL_UART_Receive_DMA,每次调用前增加HAL_UART_AbortReceive函数将接收关闭,开机就正常了。

版权声明:本文为CSDN博主「saintsage」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/saintsage/article/details/121810818

生成海报
点赞 0

saintsage

我还没有学会写个人说明!

暂无评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

STM32(七)DMA总结库函数串口使用DMA

系列文章目录 前言 DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接 控制传输,也没有中断处理方式那样保留现场和恢复现场的过

stm32使用CubeMX配置LED灯闪烁

前言 本篇文章将带大家学习如何使一个LED灯闪烁。 一、cubeMX配置 CubeMX配置和点亮一个LED的配置方法是一样的,点亮一个LED灯。 二、使用HAL库函数点亮LED灯 HAL_GPIO_WritePin(GP