正點原子STM32串列埠例程解析

2021-10-11 17:42:35 字數 1900 閱讀 7859

學習32,串列埠的使用很重要,特別是現在學的越多就覺得在很多方面通訊才是主角,原子歷程寫的挺好,但是我看論壇裡好像沒怎麼有這個的解析那就按自己的理解寫寫吧,希望能幫助到正在學習的同學。然後寫在前面,初學者或者想深入學習一定要多看看參考手冊。

在主函中使用以下語句實現將接收到的資料傳送出去:

if

(usart_rx_sta&

0x8000

)

首先usart_rx_sta是什麼呢?在"usart.c"裡面有說明這是個接收狀態標記,它既指接收狀態又表明接收到資料的位數,具體使用在下文的串列埠中斷部分中進行說明解釋。

u16 usart_rx_sta=0;

//接收狀態標記

usart_rx_sta的值在usart1_irqhandler串列埠接收中斷函式中被改變,這裡usart_rx_sta&0x8000就是判斷是否已經接收到了0x0a,0x0a是lf(line feed)換行的意思,游標到達下一行,也是判斷資料接收結束的標誌。

提一下,中斷中是以是否接收到0x0d 0x0a這兩個資料,判斷資料是否傳送結束的。假如你發的資料沒有回車(0x0d )、換行(0x0a)那麼微控制器是不會停止接收的(在pc中回車、換行使用回車按鍵就都包含了,感興趣可以具體查查)。

程式使用陣列進行資料的儲存,於是這段**也就引出乙個bug,具體描述不會描述就簡單說下,嘴笨是硬傷。

比如我給微控制器傳送 0x01 0x02 0x03 0x04 0x05 0x06 0x0d,這時候程式還在執行繼續等待接收,

再傳送 0x07 0x08 0x0d 0x0a這時候接收結束,看看最後輸出什麼?

導致這個bug的原因就是陣列儲存了資訊,知道出錯但沒有清除,只是提一下,注意一點就行,一般使用還是可以的。

if

(res==

0x0d

)usart_rx_sta|

=0x4000

;

這句話呢就是判斷是否接收到回車(0x0d ),接收到了回車,那麼讓usart_rx_sta標誌位第二位為1。

if

(usart_rx_sta&

0x4000

)

這句話呢就是判斷是否接收到換行(0x0a),如果收到換行並進行判斷確認收到換行符那麼讓usart_rx_sta標誌位最高位為1。不是很懂的話,那就看看後面的那個圖。至此中斷就差不多說明白了,要是還有其他問題,看看下面的注釋,這裡我是想說怎麼進行的資料處理,畢竟我覺得這一塊是個難點。

void

usart1_irqhandler

(void

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

else

//還沒收到0x0d,說明資料還未傳送結束繼續進行資料的檢測與儲存}}

}}

判斷接收結束再判斷此次接收資料的長度,usart_rx_sta也表明接收資料的位數,要想將接收到的資料全部傳送出去就需要知道,一共接收到了幾位然後一位一位的傳出去,所以len=usart_rx_sta&0x3fff;就實現了將資料長度賦值給變數len,然後使用for迴圈依次將接收到的資料傳送出去。這裡也許會糊塗為什麼是0x3fff呢?看下圖能理解麼?

接收到0x0d ,usart_rx_sta的值變成0x4000,又接收到0x0a,usart_rx_sta的值變成0xc000那麼很容易發現資料的的前兩位是作為標誌位了,所以用來記錄其他資料位數就只有0x3fff。

)//如果在串列埠接收中斷中接收到0x0a,資料已接收完畢

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...

STM32串列埠通訊

串列埠作為mcu最重要的外部介面,同時也是軟體開發重要的除錯手段,其重要性不言而喻。在這裡我們主要從庫函式的角度來講述如何設定串列埠,來達到最基本的通訊功能。串列埠的設定一般可以歸結為以下幾個步驟 1 串列埠時鐘使能,gpio時鐘使能。2 設定引腳復用器對映,呼叫gpio pinafconfig函式...