STM32F103C8T6-CubeMx串口收發程序詳細設計與測試(2)——程序規劃、代碼編寫及測試

摘要:演示程序的功能:經過中斷接收串口數據,在1750us時間內沒有收到新的字節的話,將收到的數據原封不動地發送出去,以測試串口的完整收發流程。對使用到的函數進行了說明,闡述了各個函數的調用順序和調用關係,在目標板上對代碼進行了測試,結果代表,能夠實現預期功能。緩存

關鍵詞:STM32F103C8T6 STM32CubeMX UART 收發程序設計微信

 

2.1程序規劃app

演示程序的功能:經過中斷接收串口數據,在1750us時間內沒有收到新的字節的話,將收到的數據原封不動地發送出去,以測試串口的完整收發流程。框架

2.2 函數說明ide

STM32CubeMx自動生成的初始化函數,孔丙火(公衆號:孔丙火)這裏再也不作說明。函數

(1)HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)測試

對於這個函數,孔丙火(公衆號:孔丙火)認爲這是一個配置函數,配置串口號、接收緩存區的指針和每次接收的數量,並使能接收中斷。ui

圖2-1是此測試程序的該函數的調用,每次接收一個字節,存在ucUartTempBuf中。spa

圖2-1設計

(2)HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)

此函數在串口的中斷服務程序中調用,做用是將接收到的字節放到接收緩存區,判斷整個數據是否已接收完整(是否已達到配置的數量),接收完整的話調用HAL_UART_RxCpltCallback(),並禁止接收中斷。

(3)HAL_UART_RxCpltCallback()

此函數是一個回調函數,須要用戶編寫,孔丙火(公衆號:孔丙火)認爲,在此函數中,能夠將收到的數據進行轉移,若是須要繼續接收的話,還要再次調用HAL_UART_Receive_IT(),因爲這個回調函數有可能會被多個串口中斷服務程序調用,所以在函數中須要區分串口。

此篇文章的測試程序中,在此函數中啓動定時器,用於1750us的定時。代碼如圖2-2所示。

圖2-2

(4)HAL_TIM_PeriodElapsedCallback()

此函數是一個回調函數,當定時器產生溢出中斷時調用,須要用戶編寫,此測試程序中,定時1750us的時間到,說明一個完整數據幀已接收完成,調用HAL_UART_Transmit_IT()函數,將收到的數據,原封不動地發送回去。

圖2-3

(5)HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

孔丙火(公衆號:孔丙火)認爲,此函數也是一個配置函數,將發送數據指針和數量賦給相應的寄存器,而後使能發送緩存區爲空中斷,以便經過中斷的方式將數據逐個字節的發送出去。

(6)HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)

此函數在uart的中斷服務程序中調用,將數據發到uart硬件緩存區,並監視已發送數量,發送數量達到目標值後,禁止發送緩存區爲空中斷。

2.3 函數調用順序

函數調用順序如圖2-4所示。此圖只是大致上展現了各個函數的調用順序和調用關係,並不徹底準確,因爲中斷的存在,有的進程是並行進行的。

圖2-4

2.4 測試結果

準備兩幀數據:01 03 00 00 00 0A C5 CD;

01 10 00 00 00 05 0A 00 01 00 02 00 03 00 04 00 05 EA 6A;

各發送兩幀,查看目標板的回覆數據,如圖2-5所示。自此,uart的收發流程就演示完畢,這也相似於Modbus串口通訊的一個基本框架。

圖2-5

文章在微信公衆號同步推出,微信公衆號:孔丙火,關注欣賞更多文章。

相關文章
相關標籤/搜索