UART串口通信詳解
重要幾個函數講解:
*HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
串口發送,發送指定長度的數據。如果超時沒發送完成,則不再發送,返回超時標志(HAL_TIMEOUT)。
*HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
串口接收,接收指定長度的數據。如果超時沒接收完成,則不再接收數據到指定緩沖區,返回超時標志(HAL_TIMEOUT)。
*HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size);
串口中斷發送,以中斷方式發送指定長度的數據。
大致過程是,把 發送緩沖區指針 指向 要發送的數據,設置 發送長度,發送計數器初值,然后使能串口發送中斷,觸發串口中斷。
再然后,串口中斷函數處理,直到數據發送完成,而后關閉中斷,不再發送數據,串口發送完成回調函數。
*HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size);
串口中斷接收,以中斷方式接收指定長度數據。
大致過程是,把 接收緩沖區指針 指向 要存放接收數據的數組,設置 接收長度,接收計數器初值,然后使能串口接收中斷。接收到數據時,會觸發串口中斷。
再然后,串口中斷函數處理,直到接收到指定長度數據,而后關閉中斷,不再觸發接收中斷,調用串口接收完成回調函數。
*HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size);
串口DMA發送,以DMA方式發送指定長度的數據。
過程是,把 發送緩沖區指針 指向 要發送的數據,設置 發送長度,發送計數器初值,設置 DMA傳輸完成中斷的回調函數,使能DMA控制器中斷,使能DMA控制器傳輸,使能UART的DMA傳輸請求。
然后,UART便會發送數據,直到發送完成,觸發DMA中斷。
DMA中斷處理,如果 DMA模式 是 循環模式,則 直接 調用 DMA傳輸完成中斷的回調函數。
如果 DMA模式 是 正常模式,則 先 關閉DMA傳輸完成中斷,不再觸發DMA中斷,再 調用 DMA傳輸完成中斷的回調函數。
DMA傳輸完成中斷的回調函數處理過程,如果 DMA模式 是 循環模式,則 直接 調用 串口發送完成回調函數。
如果 DMA模式 是 正常模式,則 先關閉 UART的DMA傳輸請求, 再 使能串口傳輸完成中斷,直到傳輸完成,觸發中斷。
串口傳輸完成中斷處理,關閉中斷,調用串口發送完成回調函數。
*HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef huart, uint8_t *pData, uint16_t Size);
串口DMA接收,以DMA方式接收指定長度的數據。
過程是,把 接收緩沖區指針 指向 要存放接收數據的數組,設置 接收長度,接收計數器初值,設置 DMA傳輸完成中斷的回調函數,使能DMA控制器中斷,使能DMA控制器傳輸,使能UART的DMA傳輸請求。
然后,UART接收到數據,便會通過DMA把數據存到接收緩沖區,直到接收到指定長度數據,觸發DMA中斷。
DMA中斷處理,如果 DMA模式 是 循環模式,則 直接 調用 DMA傳輸完成中斷的回調函數。
如果 DMA模式 是 正常模式,則 先 關閉DMA傳輸完成中斷,不再觸發DMA中斷,再 調用 DMA傳輸完成中斷的回調函數。
DMA傳輸完成中斷的回調函數處理過程,如果 DMA模式 是 循環模式,則 直接 調用 串口接收完成回調函數。
如果 DMA模式 是 正常模式,則 先關閉 UART的DMA傳輸請求, 再 調用 串口接收完成回調函數。
