厦门浪子 发表于 2018-9-3 19:48:50

串口接收DMA+IDE中断接收不定长数据的问题请教

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

    }       
       

}

feixiang20 发表于 2018-9-3 23:37:27

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

jeffhe1 发表于 2018-9-6 09:42:03

假如先開啟DMA傳輸 , 在DMA傳輸過程中 , uart 有 data 進入 , 引起中斷 , 這樣DMA傳輸的 data 有可能會發生錯誤吧

dsjsjf 发表于 2018-9-6 10:59:33

初始化串口之后,先打开DMA接收,然后等待串口空闲中断,中断后,关闭DMA接收,取出DMA中的数据,重新打开DMA接收。

wolfgang2015 发表于 2018-9-6 11:27:32

接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里
2、DMA接收一直都有存在的,将Usart接收到的字符系统自动的写到你设定的DMA缓冲区里。
3、IDE中断发送才开启DMA传输,是为下一次传输做准备。
4、当然速度快了是容易丢失或者几个包一起接收,就要看你系统设计偏好了。

厦门浪子 发表于 2018-9-9 16:33:33

wolfgang2015 发表于 2018-9-6 11:27
接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里 ...

是RXNE中断开启DMA
页: [1]
查看完整版本: 串口接收DMA+IDE中断接收不定长数据的问题请教