STM32 之九 HAL 库串口(USART/UART)驱动 BUG 及解决方法

写在前面

  在工作中,部分产品使用了ST最新的 HAL驱动库,发现 HAL 库 BUG 还是挺多的!本文重点针对在使用HAL库的 UART / USART 部分时,发现的以下几个个比较严重Bug。其严重影响正常产品中使用!特此备注说明。
  不过需要说明的是,HAL库的串口驱动确实很好使用,绝大部分繁杂的工作都被封装在了 HAL 库 函数之中。但是,这种封装也存在一定的弊端,因为作为嵌入式产品,我不需要大而全的东西,只求精简高效!
  在使用 USB部分驱动时,BUG也是不少(目前产品已全部替换使用旧版独立版本的USB库了),后续文章在说明!HAL库的USB部分是真的难用!与旧版差多了!

分析解决

  1. 如果在DMA发送过程中,出现串口错误(可能是发送错误,也可能是接收错误),将进入HAL的中断处理函数,但是处理函数中只处理了DMA的接收部分(将DMA关闭,清除串口的接收标志CR3->DMAR),而对于发送的DMA标志(CR3->DMAT)则没有处理,这样重新初始化后,CR3->DMAT先于DMA通道使能,就导致了再次配置完串口启用DMA发送时出现错误。因此 必须在错误回调函数中,显式清除CR3->DMAT
  2. 由于DMA在其设计上,在使能时NDTR会自动重装之前的值,而串口使用DMA接收时,通常是工作在循环模式下,重装后将导致循环模式重新计算,进一步导致串口接收循环覆盖。࿰
  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZC·Shou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值