|
老话题,新讨论。STM32的奇葩UART设计和DMA方式如何收发
[复制链接]
STM32的UART没有FIFO,但是有DMA。
UART的中断标志,有4个非常重要的标志,TXE,TC,RXNE,IDLE。
本人做了一个改进的串口中断+环形缓存的方式,操作UART收发。
因为STM32的UART非常奇葩,我来说说有多么奇葩。
标志位TXE和TC,上电就是置位的,只要一开启TXEIE和TCIE,不用往DR里面写数据,就有TXE和TC中断。所以本人以前被这个奇葩的设置戏弄过。
而且这两个标志的清零方式更奇葩,往DR写数据就能清零。在F0和F4中TC标志可以清零,但是F1中,TC就没有清零的时候。
无论哪种STM32,TXE标志位永远没有清零的时候。
所以发送的时候,有种很好的方法了。把数据写入写入环形缓存(以后都叫fifo)。写入叫push fifo,读出叫pop fifo.
MCU上电时,关闭TXEIE和TCIE。
发送串口帧时,先push fifo,有多少字节要发送,就push fifo多少次。psuh fifo完了后,就打开TXEIE。
然后就可以进入中断,在TXE中断下,pop fifo。如果pop fifo读到数据,就写入DR,直到没有数据为止,再关闭TXEIE。
数据接收,可以用IDLE中断。IDLE中断有点类似带FIFO UART的timeout中断,清空标志位需要读一下DR寄存器。
hal_uart.zip
(3.33 KB, 下载次数: 30)
附加为优化后的文件。
有了这些思路,大家来想想怎么用DMA来做收发。
|
|