1.配置
2.開啟中斷后,生成代碼?
3.串口的接收
1).開啟空閑中斷接收
__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 關鍵步驟:啟用空閑中斷
2).?啟動接收
調用?HAL_UARTEx_ReceiveToIdle_IT
?啟動異步接收,可以使用連個數組交替接收
#define RX_BUFFER_SIZE 256 uint8_t rx_buffer[RX_BUFFER_SIZE];// 在 main() 或某個初始化函數中啟動接收 HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);
3).實現接收回調
當以下事件發生時,會觸發?HAL_UARTEx_RxEventCallback
?回調函數:
- 接收到指定長度(
RX_BUFFER_SIZE
)的數據; - 檢測到空閑(IDLE)狀態。
在回調函數中處理接收到的數據
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart == &huart1) {// Size 是實際接收到的數據長度(可能小于 RX_BUFFER_SIZE)if (Size > 0) {// 處理數據(例如解析、轉發等)process_received_data(rx_buffer, Size);}// 重新啟動接收,以持續監聽數據HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);}
}
接收注意事項? ?
- 緩沖區大小?:設置的 RX_BUFFER_SIZE 應足夠大以容納最大預期數據包,否則可能溢出。
- 及時重啟接收?:在回調函數中務必重新調用 HAL_UARTEx_ReceiveToIdle_IT,否則后續數據無法接收。 ?
- 數據競爭?:避免在數據處理過程中修改 rx_buffer,可以使用雙緩沖區(Ping-Pong Buffer)策略。 ?
- 錯誤處理?:檢查 HAL_UARTEx_ReceiveToIdle_IT 的返回值,確保啟動成功(返回 HAL_OK)。
4.串口的數據的發送?
以下是 STM32 HAL 庫中 ?UART 數據發送?的常用方式及使用方法總結:
一、UART 數據發送的三種模式?
根據 HAL 庫設計,可通過以下三種方式實現 UART 數據發送:
輪詢模式(阻塞式)?
調用 HAL_UART_Transmit 函數,CPU 持續等待數據發送完成后再執行后續代碼。
適用場景?:簡單調試、低頻率小數據量傳輸。
// 示例代碼:發送字符串 "Hello"
uint8_t data[] = "Hello";
HAL_UART_Transmit(&huart2, data, sizeof(data), 100); ?// 超時時間 100ms
中斷模式(非阻塞)?
調用 HAL_UART_Transmit_IT 函數啟動發送,數據通過中斷異步傳輸,CPU 可并行處理其他任務。
適用場景?:需提高 CPU 利用率的中等數據量傳輸。
// 步驟:
// 1. 啟動發送
HAL_UART_Transmit_IT(&huart2, data, len);// 2. 實現發送完成回調函數
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if (huart == &huart2) {// 發送完成后的處理(如啟動下一次發送)}
}
DMA 模式(非阻塞)?
調用 HAL_UART_Transmit_DMA 函數,DMA 控制器直接搬運數據至 UART 外設,完全釋放 CPU。
適用場景?:高速、大數據量傳輸(如音頻流、圖像數據)。
// CubeMX 配置:
// 1. 開啟 UART DMA 發送通道
// 2. 啟動發送
HAL_UART_Transmit_DMA(&huart2, data, len);
二、發送模式選擇建議?
模式?? ?優點? ? ? ? ? ? ? ? ? ? ? ? ? ? 缺點? ? ? ? ? ? ? ? ? ? ? ? ? 典型應用場景
輪詢?? ?實現簡單? ? ? ? ? ? ? ? ? ? ?阻塞 CPU? ? ? ? ? ? ? ? ?調試輸出、簡單指令
中斷?? ?非阻塞、? ? ? ? ? ? ? ? ? ? ?中等效率? ? ? ? ? ? ? ? ? 頻繁中斷可能影響系統實時性?? ?中速數據包傳輸
DMA?? ?零 CPU 占用、高效?? ?需配置 DMA 通道?? ?高速大數據傳輸
三、關鍵配置步驟?
1.CubeMX 基礎配置?
啟用 UART 外設并配置波特率、數據位等參數。
中斷模式?:使能 UART 全局中斷(NVIC 設置優先級)。
DMA 模式?:添加 DMA 通道(方向為 Memory-to-Peripheral)。
2.代碼實現要點?
中斷模式?需實現 HAL_UART_TxCpltCallback 回調函數處理發送完成事件。
DMA 模式?需確保發送緩沖區在 DMA 傳輸期間保持有效(避免使用棧內存)。
四、注意事項?
- 錯誤處理?:檢查函數返回值(如 HAL_OK),并在 HAL_UART_ErrorCallback 中處理超時或硬件錯誤。
- 緩沖區管理?:避免在發送過程中修改發送緩沖區數據(尤其在使用 DMA 時)。可使用雙緩沖區交替發送以提高效率。
- 重新啟動發送?:在中斷或 DMA 回調中需手動重啟發送流程(如需連續傳輸)。
五、進階優化?
自定義協議?:結合空閑中斷(IDLE)實現不定長數據幀接收,與發送邏輯配合使用。
混合模式?:對關鍵數據使用中斷/DMA,非關鍵數據使用輪詢,平衡系統負載。
通過合理選擇發送模式并優化配置,可顯著提升 STM32 UART 通信的效率和可靠性。