STM32 HAL 串口DMA+空闲中断接收不定长数据

公司项目中用到了WIFI模块,需要与云端通信,用到了串口空闲中断+DMA,再次做个记录!

CubeMX配置如下:

STM32 HAL 串口DMA+空闲中断接收不定长数据_第1张图片

串口中断服务程序添加如下代码:

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);                       //清除空闲中断标志
		HAL_UART_DMAStop(&huart1);  		//停止本次DMA传输    
		
		data_length  = sizeof(WIFI_ReceiveBuff) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   //计算接收到的数据长度
		                                          
		
		HAL_UART_Receive_DMA(&huart1, (uint8_t*)WIFI_ReceiveBuff, sizeof(WIFI_ReceiveBuff)); //重启开始DMA传输
	}

  /* USER CODE END USART1_IRQn 1 */
}

 主程序while(1)前 不要忘记 使能中断,添加如下代码

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//串口空闲中断 使能
    HAL_UART_Receive_DMA(&huart1, (uint8_t*)WIFI_ReceiveBuff, sizeof(WIFI_ReceiveBuff)); 

在处理函数中添加如下代码

if(data_length != 0 )//串口空闲中断将data_length赋值
    {
        if(Wifi_CheckCRC16(wifi_data,8))//CRC校验正确
        {
            id = wifi_data[0];
            cmd = wifi_data[1];
            reg_addr = (wifi_data[2]<<8) | wifi_data[3];
            len = (wifi_data[4] << 8) | wifi_data[5];
            
            switch(cmd)
            {
                case 0x03://云端给终端单片机要数据
                    SendDataToWifiClud(312,445,521);
                    break;
                case 0x06://云端给终端单片机写数据(设置)
                    break;
            }
      }

你可能感兴趣的:(stm32,单片机,嵌入式硬件)