最近做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函数将接收关闭,开机就正常了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值