写在前面
在工作中,部分产品使用了ST最新的 HAL驱动库,发现 HAL 库 BUG 还是挺多的!本文重点针对在使用HAL库的 UART / USART 部分时,发现的以下几个个比较严重Bug。其严重影响正常产品中使用!特此备注说明。
不过需要说明的是,HAL库的串口驱动确实很好使用,绝大部分繁杂的工作都被封装在了 HAL 库 函数之中。但是,这种封装也存在一定的弊端,因为作为嵌入式产品,我不需要大而全的东西,只求精简高效!
在使用 USB部分驱动时,BUG也是不少(目前产品已全部替换使用旧版独立版本的USB库了),后续文章在说明!HAL库的USB部分是真的难用!与旧版差多了!
分析解决
- 如果在DMA发送过程中,出现串口错误(可能是发送错误,也可能是接收错误),将进入HAL的中断处理函数,但是处理函数中只处理了DMA的接收部分(将DMA关闭,清除串口的接收标志CR3->DMAR),而对于发送的DMA标志(CR3->DMAT)则没有处理,这样重新初始化后,CR3->DMAT先于DMA通道使能,就导致了再次配置完串口启用DMA发送时出现错误。因此 必须在错误回调函数中,显式清除CR3->DMAT
- 由于DMA在其设计上,在使能时NDTR会自动重装之前的值,而串口使用DMA接收时,通常是工作在循环模式下,重装后将导致循环模式重新计算,进一步导致串口接收循环覆盖。