STM32cubeMX+DMA+USART 接收任意长度的数据

Posted mengydz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32cubeMX+DMA+USART 接收任意长度的数据相关的知识,希望对你有一定的参考价值。

DMA接收选用circle模式,如果是normal模式的话,需要每次在中断里面接收完成后重新开启DMA接收,circle模式不用每次都开启dma接收中断。如图
技术图片

···c
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_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能idle中断
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//打开DMA接收,数据存入
}

接收中断里面按如下所示
···c
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint32_t temp;
    uint8_t dma_rx_pt=0;
    uint8_t rx_len=0;
	uint32_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
	if((tmp_flag != RESET))//idle标志被置位
	{ 
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
		temp = huart1.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
		temp = huart1.Instance->DR; //读取数据寄存器中的数据
		temp  = hdma_usart1_rx.Instance->NDTR;// 获取DMA中未传输的数据个数,NDTR寄存器分析见下面
		if(dma_rx_pt>=(10-temp))
            rx_len = 10-dma_rx_pt+10-temp;
        else
        {
            rx_len = 10-temp-dma_rx_pt;
        }
        dma_rx_pt = 10-temp;
	 }
  /* USER CODE END USART1_IRQn 0 */
//  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}
···


















以上是关于STM32cubeMX+DMA+USART 接收任意长度的数据的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeMx配置USART注意的一个问题

HAL库 STM32CubeMX--USART串口通信--补充

STM32:将 USART 与字符匹配 ISR 和 DMA 缓冲区一起使用

STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收

STM32F103VET6基于STM32CubeMX 配置DMA方式获取内部温度

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收