RoboMaster遥控器配置

遥控器数据处理

串口通信格式

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文件可以直接参考官方代码
遥控器官方数据

版权归作者(可爱的小昕同学)所有,需要转载或引用请注明来历和作者,若为其他用途或者有其他疑问则联系本文作者

猜你喜欢

转载自blog.csdn.net/weixin_45850927/article/details/126856966