我们使用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
}
}
}
|