STM32 UART DMA實(shí)現未知數據長(cháng)度接收
UART在傳輸一個(gè)字節的時(shí)候,首先拉低,傳輸起始位,然后在是LSB –MSB,最后是停止位,停止位是高電平
本文引用地址:http://dyxdggzs.com/article/201611/318276.htm超時(shí)時(shí)間
搞過(guò)串口通信的都知道,如果串口有協(xié)議,一般都是有個(gè)超時(shí)時(shí)間的,超時(shí)時(shí)間是定義兩個(gè)幀之間的間隔的,如果串口接收到一個(gè)字節后,在規定的超時(shí)時(shí)間內沒(méi)有接收到其他數據,我們則認為前面接收的數據位一幀。
定時(shí)器復位復位模式
STM32定時(shí)器功能比較強大,其中有一種模式為復位模式,TI1的輸入上升沿會(huì )復位定時(shí)器的計數器
整體的思路是這樣的,一開(kāi)始設置好DMA接收,可以把緩沖區長(cháng)度設置為幀最大長(cháng)度,我們可以把RX連接到定時(shí)器的管腳輸入端,并且一開(kāi)始設置輸入并且使能引腳下降沿中斷,當幀的第一個(gè)字節發(fā)送時(shí),因為起始位為低電平,空閑時(shí)UART為高電平,滿(mǎn)足條件,進(jìn)入中斷,禁止中斷,并且在中斷中開(kāi)啟定時(shí)器,該定時(shí)器工作在復位模式,上升沿復位,并且設置好定時(shí)器輸出比較值為超時(shí)時(shí)間,比如20ms,這樣,在傳輸后面字節時(shí),肯定會(huì )有高低電平出現,即便是傳輸的是0x00,0xFF,雖然UART數據區不變,但是都為1,或都為0,但是因為起始位為低電平,停止位是高電平,所以肯定會(huì )有上升沿,定時(shí)器會(huì )一直復位,輸出定時(shí)器的計數器一直到達不了輸出比較值,當一幀傳輸結束后,定時(shí)在最后一個(gè)字節復位后,由于沒(méi)有數據繼續到達,無(wú)法復位,則計數器就能計到輸出比較值,這時(shí)發(fā)出中斷,在定時(shí)器中斷中可以計算出接收數據的長(cháng)度,并且通知外部數據已經(jīng)接收完畢。
功能實(shí)現
實(shí)現的步驟:
1、硬件連接:UART的RX線(xiàn)在連接外部的同時(shí),還需要連接到一個(gè)定時(shí)器的輸入端TIMx_CHx,定時(shí)器可以為任意定時(shí)器,但是CHx,只能為CH1或CH2
軟件設置
a) IO、中斷設置:在把UART功能口設置好后,還需要設置TIM4_CH2為輸入上拉,并且使能該引腳外部中斷
把DMA接收的數據緩沖區設置為你認為最大的幀長(cháng)度,(如果最長(cháng)不能確定,也可以隨便指定一個(gè)長(cháng)度,后面再講怎么實(shí)現)。
b) 定時(shí)器設置
因為使用的是TIM4_CH2,所以需要配置TIM4,并且配置為復位模式,把超時(shí)時(shí)間定為20ms,為了方便TIM4時(shí)鐘定輸入為1KHZ
工作過(guò)程如下
在串口傳輸起始位的時(shí)候,首先產(chǎn)生外部中斷,在外部中斷中開(kāi)啟定時(shí)器,禁止外部中斷,只要串口上一直有數據,定時(shí)器肯定會(huì )不停的復位,到達不了定時(shí)時(shí)間,當串口上沒(méi)有數據的時(shí)候,到超時(shí)時(shí)間后,定時(shí)器產(chǎn)生中斷,此時(shí)可以讀出接收的數據長(cháng)度,然后開(kāi)啟外部中斷,進(jìn)入下一個(gè)周期。
總結:本方法的缺點(diǎn)是程序開(kāi)始的初始化麻煩些,但是優(yōu)點(diǎn)是非常明顯的,徹底解放了CPU,這樣在計算串口超時(shí)的時(shí)候,就不需要定時(shí)器不停的中斷,并且串口接收數據使用DMA方式,也不需要CPU參與,只是在接收結束的時(shí)候通知CPU取數據,CPU的利用率會(huì )更高。
評論