目的
UART(異步串口)是單片機非常常用的一個功能,一般用作設備或模塊間通訊的一種方式。通常所說的232或是485通訊從寫程序的角度來說就是使用UART進行通訊。(這個地方有些人會混淆,串口更多是一種通訊方式、機制,而TTL、232、485更多的是電氣相關特性)
基礎說明與初始化
基礎說明
STM32系列MCU大多都有多個UART可以使用,每個UART可以設置獨立的參數,和其它設備通訊時通訊的雙方必須有相同的參數。一般會涉及的參數如下:
BaudRate
波特率,通訊速率,當其他參數默認時,每秒可傳輸字節數約爲 BaudRate/10;WordLength
數據位,數據位表示每一個數據包含bit數,一般用8bit,即一個數據爲一個字節;StopBits
停止位,停止位用來表示一個數據傳輸結束;Parity
校驗位,校驗位用來校驗傳輸的數據是否正確,一般也比較少用,通訊用的協議一般帶自己的校驗方式;HwFlowCtl
流控制,現在比較少用到;OverSampling
過採樣,一般默認就行;
初始化
如果使用STM32CubeMX來初始化UART的話我們一般只要根據需求設置基本參數、中斷、DMA即可,如下圖所示:
默認情況下STM32CubeMX生成的初始化代碼分別位於main和stm32fxxx_hal_msp文件中,其中UART基本參數相關設置代碼如下:
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
如果想要在使用過程中更改串口參數可以用上面代碼更改,如果想要關閉串口可以使用 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
函數。
數據接收和發送
UART的數據接收和發送可以分別爲輪詢、中斷、DMA三種方式,同一個串口三種方式不可混用。
輪詢方式
輪詢方式使用UART只需要設置基本參數就行,不需要開啓中斷和DMA。輪詢模式下收發數據使用下面函數:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
上面函數使用時分別傳入UART對象、數據指針、數據長度、超時時間(默認情況下單位ms)。這兩個函數在調用時均會阻塞程序,直至數據傳輸完成或者超時。所以輪詢方式一般不怎麼推薦。
中斷方式
中斷方式使用UART需要設置基本參數和開啓中斷,不需要啓用DMA。中斷模式下收發數據需要用到下面函數:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
上面兩個函數分別是接收和發送的操作。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
上面兩個函數分別是接收和發送完成時的回調函數,用戶需要自行編寫回調函數具體的內容。
中斷方式收發數據其實是每收發一個字節均會觸發一次中斷的,只不過HAL庫將它處理了,用戶一般只在全部完成時進行操作。這種方式會頻繁進出中斷,在使用時需要注意。
DMA方式
DMA模式下收發數據需要用到下面函數:
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
上面兩個函數分別是接收和發送的操作。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
上面兩個函數分別是接收和發送完成時的回調函數,用戶需要自行編寫回調函數具體的內容。
其它說明
UART除了設置、收發數據外還有一些功能,如下圖:
- 帶有
HAL_UART_Abort
字符的函數是用來取消當前正在進行的傳輸的相關操作; - 帶有
HAL_UART_DMA
字符的函數是用來控制DMA方式收發數據過程的相關操作; HAL_UART_GetError
和HAL_UART_GetState
函數分別用來獲取UART的錯誤和狀態信息,具體信息參見其宏定義;- 帶有
HalfCpltCallback
字符的函數是傳輸過半回調函數,用戶可以根據需求自行重寫函數具體功能;
總結
UART基本使用還是比較簡單的。一般實際使用中除了基本的功能使用外還需要編寫一些額外的收發邏輯,這塊內容會在之後的文章中講解。
更多內容可以參考官方庫文檔,比如上面演示中用的F4系列文檔《UM1725 User Manual - Description of STM32F4 HAL and LL drivers》。