STM32CubeIDE開發筆記4:USART異步通信+DMA


本文鏈接:https://blog.csdn.net/qq_42038029/article/details/103835984
版權聲明:本文爲CSDN博主「遙望1415984987」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
stm32CubeIDE所用版本:1.1.0
固件庫包:f1 1.8.0
測試平臺stm32f103c8t6

USART的基本配置

配置如圖所示
在這裏插入圖片描述

調用HAL庫的USART函數

異步發送

這裏包括了我們能用到的庫函數:
串口的發送接收函數:
HAL_UART_Transmit();串口輪詢模式發送,使用超時管理機制。
HAL_UART_Receive();串口輪詢模式接收,使用超時管理機制。
HAL_UART_Transmit_IT();串口中斷模式發送,
HAL_UART_Receive_IT();串口中斷模式接收
HAL_UART_Transmit_DMA();串口DMA模式發送
HAL_UART_Receive_DMA();串口DMA模式接收
串口相關的中斷函數:
HAL_UART_TxHalfCpltCallback():一半數據(half transfer)發送完成後,通過中斷處理函數調用。
HAL_UART_TxCpltCallback():發送完成後,通過中斷處理函數調用。
HAL_UART_RxHalfCpltCallback():一半數據(half transfer)接收完成後,通過中斷處理函數調用。
HAL_UART_RxCpltCallback():接收完成後,通過中斷處理函數調用。
HAL_UART_ErrorCallback():傳輸過程中出現錯誤時,通過中斷處理函數調用。

本次我們使用HAL_UART_Transmit();串口輪詢模式發送,使用超時管理機制。
在這裏插入圖片描述
在主程序的while循環里加入如下程序:

HAL_UART_Transmit(&huart1,"Hello World!\r\n",14,10);
HAL_Delay(1000);

第一個參數是串口
第二個參數是要發送的字符串
第三個參數是發送字符的個數
第四個參數是超時時間。(這裏我隨便輸的10,有點例程用最大的0XFFFF,也有用0的,我都試過,都能成功發送,想要深入研究可自行查看源碼)
在這裏插入圖片描述
下載到單片機上,用串口用助手驗證。(注意串口助手的配置要與單片機相同才能通信;連接TTL轉UASRT時TX接RX,不懂的自行百度)

在這裏插入圖片描述

異步接收

異步接收我們使用HAL_UART_Receive_IT();串口中斷模式接收。
先記得開啓中斷再更新工程
然後我們編寫程序讓串口助手發送一個“a”,單片機接收後回覆“I get a”;
先在USER CORD4裏添加下段代碼

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart1)
    {
    	HAL_UART_Transmit(&huart1, (uint8_t *)"I get ", 6,0xFFFF);
    	HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, sizeof(aRxBuffer),0xFFFF);
    	HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 4,0xFFFF);
    }
}

添加字符串變量
在這裏插入圖片描述
while添加接收函數
在這裏插入圖片描述
第一個變量是串口號
第二個變量是存儲接收字符的地址
第三個變量是接收字符個數
下載到單片機上驗證

在這裏插入圖片描述
從這可以看出與預期一致,下面這張在線調試的圖也一樣。
在這裏插入圖片描述

DMA 收發

DMA的用法與上面的類似,使用的是:
HAL_UART_Transmit_DMA();串口DMA模式發送
HAL_UART_Receive_DMA();串口DMA模式接收

使用前要注意,首先要配置好,要開啓中斷,不然發的時候會出現問題。
在這裏插入圖片描述
然後用法與上面的**HAL_UART_Transmit(),HAL_UART_Receive()**一致,這裏不多說了,說幾點要注意的:

注意

如果你先只加了USART,後面再加DMA,cubemx可能會
MX_USART1_UART_Init();

MX_DMA_Init();
這樣會導致發送失敗,具體原因我沒深究,必需換下順序,下圖這樣是正確的。
在這裏插入圖片描述
當然,你用CUBUMX配置時一開始就把USART與DMA同時導入,順序就是對的。

有的老一點的資料說要加這一段代碼:

//void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
//{
////回調函數
//huart->gState=HAL_UART_STATE_READY;
//
//
//}

親測加不加不影響,我用的CUBEMX版本5.4,F1HAL庫函數版本1.80。

創作不易,點個贊吧!

發佈了7 篇原創文章 · 獲贊 40 · 訪問量 4977
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章