robomaster电控究极学习教程(以哨兵为例)------一、串口dma和遥控器
一、串口DMA的作用
DMA可以直接存储器访问,就是方便!!
二、步骤
1.cubemx配置
以uart3为例
2.添加代码
mian.c
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
RC_Ctl.rc.ch0 = (sbus_rx_buffer[0] | (sbus_rx_buffer[1] << 8))& 0x07ff; //确保11位
RC_Ctl.rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5))& 0x07ff;
RC_Ctl.rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | (sbus_rx_buffer[4] << 10))& 0x07ff;
RC_Ctl.rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7))& 0x07ff;
RC_Ctl.rc.s1 = ((sbus_rx_buffer[5] >> 4) & 0x000C) >> 2;
RC_Ctl.rc.s2 = ((sbus_rx_buffer[5] >> 4) & 0x0003);
RC_Ctl.mouse.x = sbus_rx_buffer[6] | (sbus_rx_buffer[7] << 8);
RC_Ctl.mouse.y = sbus_rx_buffer[8] | (sbus_rx_buffer[9] << 8);
RC_Ctl.mouse.z = sbus_rx_buffer[10] | (sbus_rx_buffer[11] << 8);
RC_Ctl.mouse.press_l = sbus_rx_buffer[12];
RC_Ctl.mouse.press_r = sbus_rx_buffer[13];
RC_Ctl.key.v = sbus_rx_buffer[14] | (sbus_rx_buffer[15] << 8);
}
/* USER CODE END 4 */
/* USER CODE BEGIN WHILE */
while (1)
{
if(RC_Ctl.rc.s2 == 1) // 开关向上
{
//自己想干嘛
}
/* USER CODE END WHILE */
/* USER CODE BEGIN PV */
RC_Ctl_t RC_Ctl;
uint8_t sbus_rx_buffer[18];
int TongDao0=0;
/* USER CODE END PV */
main.h
/* USER CODE BEGIN ET */
typedef struct
{
struct
{
unsigned short ch0;
unsigned short ch1;
unsigned short ch2;
unsigned short ch3;
unsigned char s1;
unsigned char s2;
}rc;
struct
{
unsigned short x;
unsigned short y;
unsigned short z;
unsigned char press_l;
unsigned char press_r;
}mouse;
struct
{
unsigned short v;
}key;
}RC_Ctl_t;
/* USER CODE END ET */
3.调试
点击watch1 输入变量 就是那个结构体
run 开关拨动 数值会随之变化