一、在底層中初始化DMA接收和串口中斷
void MX_USART1_UART_Init(void)
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
二、在初始化完成之後,enable空閒中斷,並啓動DMA接收
三、在*it.c的中斷c文件中增加空閒中斷處理
void USART1_IRQHandler(void)
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
//空閒中斷
if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);//清除標誌
temp =huart->Instance->SR;//讀SR可以實現清除狀態寄存器
temp =huart->Instance->DR;
HAL_UART_DMAStop(huart);//在回調函數中通過HAL_UART_Receive_DMA重新啓動
temp = huart->hdmarx->Instance->NDTR;//獲取未傳輸數據個數
__HAL_DMA_DISABLE(huart->hdmarx);//關閉DMA接收
HAL_UART_RxIdleCallback(huart,temp);//把未接收字節數傳過去
__HAL_DMA_ENABLE(huart->hdmarx);//開啓DMA接收,在傳未接收字節數時,先關DMA,防止又接收到數據,改變了未接收字節數
}
即讀取SR寄存器和CR1寄存器,判斷是否是空閒中斷。如果是,原來設置DMA接收HLGI_NUM個字節,讀NDTR看還剩多少個字節未接收。兩者相減,就得到已接收的字節數
四、把接收到的字符通過回調函數HAL_UART_RxIdleCallback處理
可以把它發送到隊列中,然後啓動新一次DMA接收