串口接收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);
}
}
串口实现的3种方式,可以用轮询、中断以及DMA实现,轮询模式为堵塞模式,必须在设定的时间内接收到设定的数据长度才会正确接收;中断模式为非堵塞模式,也是平时用的比较多的,但在HAL库中必须在每次接完之后就要重新开启接收中断,这样在接收不确定长度数据就不好处理;最后发现有一个比较好的方法那就是用串口的空闲中断+DMA实现串口数据的接收,在接收一帧数据只需要中断一次,这样就可以接收不定长数据了 假如先開啟DMA傳輸 , 在DMA傳輸過程中 , uart 有 data 進入 , 引起中斷 , 這樣DMA傳輸的 data 有可能會發生錯誤吧 初始化串口之后,先打开DMA接收,然后等待串口空闲中断,中断后,关闭DMA接收,取出DMA中的数据,重新打开DMA接收。 接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里
2、DMA接收一直都有存在的,将Usart接收到的字符系统自动的写到你设定的DMA缓冲区里。
3、IDE中断发送才开启DMA传输,是为下一次传输做准备。
4、当然速度快了是容易丢失或者几个包一起接收,就要看你系统设计偏好了。 wolfgang2015 发表于 2018-9-6 11:27
接收DMA+IDE中断接收不定长数据
首先要明白机制
1、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里 ...
是RXNE中断开启DMA
页:
[1]