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接收
在这里插入图片描述
在这里插入图片描述

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