stm32 串列埠接受不定長資料方法(3種)

2021-08-09 06:53:59 字數 2480 閱讀 4138

方法1:串列埠接受資料,定時器來判斷超時是否接受資料完成。

方法2:dma接受+idle中斷

實現思路:採用stm32f103的串列埠1,並配置成空閒中斷idle模式且使能dma接收,並同時設定接收緩衝區和初始化dma。那麼初始化完成之後,當外部給微控制器傳送資料的時候,假設這幀資料長度是200個位元組,那麼在微控制器接收到乙個位元組的時候並不會產生串列埠中斷,而是dma在後台把資料默默地搬運到你指定的緩衝區裡面。當整幀資料傳送完畢之後串列埠才會產生一次中斷,此時可以利用dma_getcurrdatacounter();函式計算出本次的資料接受長度,從而進行資料處理。

應用物件:適用於各種串列埠相關的通訊協議,如:modbus,ppi ;還有類似於gps資料接收解析,串列埠wifi的資料接收等,都是很好的應用物件。

關鍵**分析:

void uart_init(u32 bound);

void mydma_enable(dma_channel_typedef*dma_chx);

#endif

usart.c

//初始化io 串列埠1

//bound:波特率

void uart_init(u32 bound)

//重新恢復dma指標

void mydma_enable(dma_channel_typedef*dma_chx)

//傳送len個位元組

//buf:傳送區首位址

//len:傳送的位元組數

void usart1_send(u8 *buf,u8 len)

while(usart_getflagstatus(usart1, usart_flag_tc) == reset);

}//串列埠中斷函式

void usart1_irqhandler(void) //串列埠1中斷服務程式

}

方法3:實現思路:直接利用stm32的rxne和idle中斷進行接收不定位元組資料。 

基本知識: 

idle中斷什麼時候發生? 

idle就是串列埠收到一幀資料後,發生的中斷。什麼是一幀資料呢?比如說給微控制器一次發來1個位元組,或者一次發來8個位元組,這些一次發來的資料,就稱為一幀資料,也可以叫做一包資料。 

如何判斷一幀資料結束,就是我們今天討論的問題。因為很多專案中都要用到這個,因為只有接收到一幀資料以後,你才可以判斷這次收了幾個位元組和每個位元組的內容是否符合協議要求。 

看了前面idle中斷的定義,你就會明白了,一幀資料結束後,就會產生idle中斷。

如何配置好idle中斷? 

下面我們就配置好串列埠idle中斷吧。 

這是串列埠cr1暫存器,其中,對bit4寫1開啟idle中斷,對bit5寫1開啟接收資料中斷。(注意:不同系列的stm32,對應的暫存器位可能不同)

rxne中斷和idle中斷的區別? 

當接收到1個位元組,就會產生rxne中斷,當接收到一幀資料,就會產生idle中斷。比如給微控制器一次性傳送了8個位元組,就會產生8次rxne中斷,1次idle中斷。 

這是狀態暫存器,當串列埠接收到資料時,bit5就會自動變成1,當接收完一幀資料後,bit4就會變成1. 

需要注意的是,在中斷函式裡面,需要把對應的位清0,否則會影響下一次資料的接收。比如rxne接收資料中斷,只要把接收到的乙個位元組讀出來,就會清除這個中斷。idle中斷,如何是f0系列的微控制器,需要用icr暫存器來清除,如果是f1系列的微控制器,清除方法是「先讀sr暫存器,再讀dr暫存器」。(我怎麼知道?手冊上寫的)

下面以stm32f103為例給出源程式。 

我們先來看程式中的主要部分。 

串列埠初始化函式片段 

串列埠中斷函式 

串列埠中斷函式裡面,最重要的兩條語句,就是上圖中圈出來的兩條語句。第一條語句用來判斷是否接收到1個位元組,第二條語句用來判斷是否接收到1幀資料。(是不是感覺超級方便?媽媽再也不用擔心我如何判斷是否接收完1幀資料了。) 

主函式 

這個主函式,是用來驗證接收的正確性的。rxcounter表示的是這一幀資料有幾個位元組,接收完一幀資料,會在中斷函式裡面把receivestate置1,然後,通過串列埠把接收到的資料傳送回串列埠。這樣,既驗證了接收了多少位元組的正確性,又驗證了接收到的資料是否正確。

兩個程式**均採用stm32f103zet6測試過,完全沒問題。 

stm32串列埠接收不定長內容,不使用DMA

專案做到一半,碰到個尷尬問題 pwm使用的dma通道與串列埠接收的dma通道撞車了,咋辦?考慮一下,決定放棄idle中斷 dma的串列埠不定長資料接收方案,回到中斷接收去。中斷接收函式hal uart receive it函式是個定長接收函式,除非把接收長度設為1。由於我使用freertos系統,打...

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...

STM32串列埠通訊

1.常用的串列埠相關暫存器 1 usart sr狀態暫存器,對應的庫函式 flagstatus usart getflagstatus usart typedef usartx,uint16 t usart flag 2 usart dr資料暫存器,對應的庫函式 void usart senddat...