關於stm2cumx生成的串列埠通訊USART的使用(1)
在stm32cumx中的設定如下
並開啟中斷
初始化
在主函式中,這個函式完成串列埠初始化
這個函式先是初始化,串列埠通訊的配置。再接著進入這個函式
執行了這個函式
這個函式則是完成了串列埠通訊底層,硬體上的一些初始化,配置了引腳,並開啟了中斷
使能串列埠通訊?(設定進行回撥函式的條件)
主函式中,上一個函式只不過是以非阻塞的方式傳送了a1這個變數的值
關鍵是,後一個函式。定義一個字元陣列Rx_dat作為緩衝區,引數Size設定為1。即每接收1個字元,就進入一次回撥函式。
沒啥好說的,進入這個函式
設定串列埠物件的儲存指向位置,空間大小,和接受計數count
當有資料來的時候,就需要依靠中斷函式來處理了。
開始工作
這個是串列埠通訊的中斷,生成的程式碼裡面就一個函式,進入看看。(注意是每接收/傳送一個字元進入這個中斷函式(應該是這樣))
這個函式挺長的的,就是一些判斷啥的。圖中這個指向的這個函式,是真正接收字元的函式
上面3張圖,第一個箭頭之前的,就是串列埠接收字元的實際操作。
第一個箭頭的count的數值大小(根據後面兩張圖片可以得知,這個if裡面是進行回撥函式的呼叫),就是前面HAL_UART_Receive_IT函式裡設定的的count的大小(這裡我設定為1),可以看出,並不是每一次進入中斷處理函式都會進行回撥函式的呼叫(我是設定了快取區為1,所以才會每進入中斷處理函式都會呼叫回撥函式)
若我改為HAL_UART_Receive_IT(&huart1,&RX_dat,10),則進入10次中斷處理函式,才會呼叫1次回撥函式
後面幾個箭頭,是幾種不同事件的回撥函式呼叫。我們要重寫的是HAL_UART_RxCpltCallback這個會回撥函式
同時有點要注意,圖中畫圈部分,既是將串列埠中斷關閉了,就是每呼叫回撥函式都會將串列埠中斷關閉,得需要自己重新開啟中斷才行
重新開啟串列埠中斷,這樣才可以實現多次資料返回
總結
- 要注意HAL_UART_Receive_IT跟UART_Receive_IT的區別。一個是使用者自己設定緩衝區的大小,進入回撥函式的要求,一個是系統自身接收字元的實際操作
- HAL_UART_Receive_IT配置後,有資料來,計數會在呼叫中斷函式之後自動減1。只有到計數為0時,才會關閉中斷並呼叫回撥函式。至此有資料來不再呼叫中斷函式,因為中斷已經失效。
- HAL_UART_Receive_IT和HAL_UART_Receive的區別就是:中斷接收是有資料到了才去讀;直接接收是直接讀取,如果超時就返回