STM32怎麼利用串口空閒中斷進行DMA接收

一、在底層中初始化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接收
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章