STM32
直播中

王刚

8年用户 1352经验值
私信 关注
[问答]

串口接收DMA+IDE中断接收不定长数据,为什么要先进入接收非空中断后然后才开启DMA传输?

这段代码是IDE+DAM接收串口数据的,为什么要先进入接收非空中断后然后才开启DMA传输?不会造成第一个数据丢失吗?

  • void  BSP_Ser2_ISR_Handler (void)
  • {
  •         uint8_t clear=clear;

  •         FlagStatus idle_status;

  •         if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET){
  •                 USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
  •                 Ser2_RXDMA_Init();//开启DMA接收
  •         }

  •         idle_status = USART_GetFlagStatus(USART2, USART_FLAG_IDLE);
  •     if (idle_status == SET) {
  •                 clear = USART2->SR;
  •                 clear = USART2->DR;

  •                 USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);

  •                 if(Ser2_read_f){
  •                         BSP_OS_SemPost( BSP_Ser2RxWait);
  •                         Ser2_read_cnt = CMD_LEN_MAX - DMA_GetCurrDataCounter(DMA1_Channel6);
  •                 }

  •                 DMA_Cmd(DMA1_Channel6, DISABLE);
  •                 DMA_DeInit(DMA1_Channel6);
  •                 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

  •     }


  • }




回帖(1)

张艳梅

2024-4-26 10:51:43
串口实现的3种方式,可以用轮询、中断以及DMA实现,轮询模式为堵塞模式,必须在设定的时间内接收到设定的数据长度才会正确接收;中断模式为非堵塞模式,也是平时用的比较多的,但在HAL库中必须在每次接完之后就要重新开启接收中断,这样在接收不确定长度数据就不好处理;最后发现有一个比较好的方法那就是用串口的空闲中断+DMA实现串口数据的接收,在接收一帧数据只需要中断一次,这样就可以接收不定长数据了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分