遥控器数据处理
串口通信格式
DMA数据处理
遥控器数据处理
中断
在RM比赛中使用的遥控器是DT7,接收机为DR16,使用协议为D_BUS,通信方式为串口通信,同时使用DMA搬运数据。
串口通信:
根据官方文件可知串口通信数据格式:
根据官方参数,可知串口配置如下(来自于官方Demo):
USART_InitTypeDef usart2;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_USART2);
USART_DeInit(USART2);//串口复位
usart2.USART_BaudRate = 100000;//波特率配置 10000
usart2.USART_WordLength = USART_WordLength_8b;//数据位8位
usart2.USART_StopBits = USART_StopBits_1;//停止位 1位
usart2.USART_Parity = USART_Parity_Even;//校验方式 偶校验
usart2.USART_Mode = USART_Mode_Rx;//串口模式 接收
usart2.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件控制流 无
USART_Init(USART2,&usart2);//串口初始化
USART_Cmd(USART2,ENABLE);//串口使能
说明一下,该代码仅供参考,实际引脚和使用串口根据单片机原理图选择引脚。而且DBUS 信号控制电平符合 TTL,却和普通 UART 信号是相反的,所以需要在 MCU 端需要增加三极管取反电路,MCU 才能正常识别出 UART 信号。
DMA配置:
DMA_InitTypeDef dma;
DMA_DeInit(DMA1_Stream5);//将DMA寄存器的初始化为其默认值
dma.DMA_Channel = DMA_Channel_4;//DMA通道
dma.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR);//串口模式
dma.DMA_Memory0BaseAddr = (uint32_t)&sbus_rx_buffer[0][0];//储存器地址
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;//数据传输方向 存储器到外设
dma.DMA_BufferSize = RC_FRAME_LENGTH;//数据传输量
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度 八位
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度 八位
dma.DMA_Mode = DMA_Mode_Circular;//数据传输模式 循环模式
dma.DMA_Priority = DMA_Priority_VeryHigh;//传输速度 非常高
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;//FIFO模式 关闭
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;//这个无所谓,毕竟FIFO都关了
dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;//寄存器突发单次传输
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_DoubleBufferModeConfig(DMA1_Stream5,(uint32_t)&sbus_rx_buffer[1][0],
DMA_Memory_0); //first used memory configuration
DMA_DoubleBufferModeCmd(DMA1_Stream5, ENABLE);
DMA_Init(DMA1_Stream5,&dma);
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //usart rx idle
interrupt enabled
DMA_Cmd(DMA1_Stream5,ENABLE);
DMA通道选择可以根据使用芯片的手册查到。
遥控器数据解析
这部分可以参考我之前那篇文章:
遥控器数据处理
遥控器中断:
中断这里可以使用串口中断,也可以使用DMA中断,这里提供一种DMA中断,串口中断双缓冲的数据处理可以根据这篇文章(这是位大佬,快关注他)
DMA双缓冲
void DMA1_Stream5_IRQHandler() //DMA中断
{
if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF2))
{
DBUS_Data_Process();
DMA_ClearFlag(DMA1_Stream5, DMA_FLAG_TCIF2);
DMA_ClearITPendingBit(DMA1_Stream2, DMA_IT_TCIF5);
}
}
至此,遥控器数据处理的.c文件完成,.h文件可以直接参考官方代码
遥控器官方数据
版权归作者(可爱的小昕同学)所有,需要转载或引用请注明来历和作者,若为其他用途或者有其他疑问则联系本文作者