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。
創作不易,點個贊吧!