STM32F103串口接收数据,多字节触发中断接收数据,DMA空闲中断接受,空闲中断触发中断。

2.知识点

2.1多字节中断,接收指定字节数据

  1. 在STM32cubemx中开启串口全局中断。

  2. 在程序初始化编写接收中断函数。

  3. 启用接收中断回调函数。并要开启下一次中断接受函数,否则将不接收数据。

  4. 在串口全局中断服务函数调用接收中断函数。

image-20230626143225682

image-20230626143350788

image-20230626143847991

image-20230626143548047

HAL_UART_Receive_IT(&huart1,g_Comm1RxBuffer,8);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
       //g_Comm1RxBuffe数据缓存区,串口接收到8字节触发中断,这儿将对接收到的数据进行处理
		USART1DataRecv();
	}
}


2.2 DMA加空闲中断回调函数接收不定量数据

  1. 在STM32cubamx中配置DMA通道。

  2. 在程序初始化编写使能空闲中断和串口DMA接收中断函数。

  3. 在串口全局中断服务函数调用自定义中断服务函数。

  4. 编写中断服务函数和空闲中断服务函数。

image-20230626145043625

image-20230626145125520

image-20230626145424711

 

2.3串口空闲中断接受不定量数据

  1. 程序初始化编写空闲中断接收函数。

  2. 调用空闲中断回调函数

image-20230626145746276

__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE); //使能IDLE中断
//DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
HAL_UART_Receive_DMA(&huart3, g_Comm3RxBuffer, BUFFER_SIZE);//重新打开DMA接收,不然只能接收一次数据
​
​
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
        //注意:大量数据时,temp、g_Comm3RxBuffer_lenth为uint32_t ,不能写uint8_t否则会超过254就出现问题了。
        //在数据量明确并且少量的情况下可以用uint8_t。
        uint32_t temp=0;
        HAL_UART_DMAStop(&huart3); //停止DMA
    
        temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);// 获取DMA中未传输的数据个数   
        g_Comm3RxBuffer_lenth  =  BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
        //控制逻辑。。。。。。    
        //HAL_UART_Transmit(&huart3, g_Comm3RxBuffer,g_Comm3RxBuffer_lenth,1000); //  
   
        memset(g_Comm3RxBuffer,0,g_Comm3RxBuffer_lenth);
        HAL_UART_Receive_DMA(&huart3, g_Comm3RxBuffer,BUFFER_SIZE);
}
void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
{
    //DMA的通道每个芯片会有差异,有些串口没有DMA,所以在这儿不写其他的接口,需要时添加即可。
    if(huart->Instance==USART3) 
    {   // 判断是否是空闲中断
        if(RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))   
        {    // 清除空闲中断标志(否则会一直不断进入中断)
            __HAL_UART_CLEAR_IDLEFLAG(&huart3);                    
            // 调用空闲中断处理函数
            HAL_UART_IdleCpltCallback(huart);                       
        }
    }   
}

image-20230626145956625

HAL_UARTEx_ReceiveToIdle_IT(&huart5,Rxbuffer,1024);
​
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  if(huart->Instance==UART5)
  {
      //数据存到了Rxbuffer,长度为函数参数Size。
    //HAL_UART_Transmit(&huart1,Rxbuffer,Size,100);
    
    memset(Rxbuffer,0,sizeof(Rxbuffer));
    HAL_UARTEx_ReceiveToIdle_IT(&huart5,Rxbuffer,1024); 
  }
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值