这段代码是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、开启DMA传输是将DMA缓存的内容写入到你真正需要的空间里
2、DMA接收一直都有存在的,将Usart接收到的字符系统自动的写到你设定的DMA缓冲区里。
3、IDE中断发送才开启DMA传输,是为下一次传输做准备。
4、当然速度快了是容易丢失或者几个包一起接收,就要看你系统设计偏好了。
评分
查看全部评分
是RXNE中断开启DMA