我们使用DMA时利用串口的空闲中断接收一帧一帧的数据。
在串口中断处理函数中对数据进行处理-
- uint16_t this_time_rx_len = 0; //当前剩余数据长度
- if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) //判断是否为空闲中断
- {
- USART_ReceiveData(USART3); //清除空闲中断标志位
- if(DMA_GetCurrentMemoryTarget(DMA1_Stream1) == DMA_Memory_0) //获取当前目标内存是否为 DMA_Memory_0
- {
- //重新设置DMA
- DMA_Cmd(DMA1_Stream1, DISABLE);
- this_time_rx_len = DMA_GetCurrDataCounter(DMA1_Stream1); //获取当前剩余数据量
-
- DMA_SetCurrDataCounter(DMA1_Stream1, 18); //重新设置数据量
-
- DMA_Cmd(DMA1_Stream1, ENABLE);
- if(this_time_rx_len == 18) //接收成功18个字节长度
- {
- //处理遥控器数据
- RemoteDataProcess(sbus_rx_buffer[1]); //Memory_1
- }
- }
- else //获取当前目标内存是否为 DMA_Memory_1
- {
- //重新设置DMA
- DMA_Cmd(DMA1_Stream1, DISABLE);
- this_time_rx_len = DMA_GetCurrDataCounter(DMA1_Stream1); //获取当前剩余数据量
- DMA_SetCurrDataCounter(DMA1_Stream1, 18); //重新设置数据量
- DMA_Cmd(DMA1_Stream1, ENABLE);
- if( this_time_rx_len== 18) //接收成功18个字节长度
- {
- //处理遥控器数据
- RemoteDataProcess(sbus_rx_buffer[0]); //Memory_0
- }
- }
- }
|