文章目录
-
- DBUS协议
- C板上的DBUS
- DR16 接收机
- 机器人控制协议
- 配置遥控器传输协议
- 添加官方函数库
- 代码编写
-
- 程序流程
- 1.初始化发送DMA和接收DMA
- 2.编写USART3的串口中断函数及调用解码函数
- 3.主函数的循环中调用串口实现的函数
DBUS协议
- DBUS通信协议和串口类似
- DBUS的传输速率(波特率)为100kbit/s,传输的单位数据长度为8位
- 奇偶校验位为偶校验,结束位1位
- DBUS使用的电平标准与串口相反(在DBUS协议中0表示高电平,1表示低电平)
- 使用串口进行接收时需要在接收电路上添加一个反相器
C板上的DBUS
在C板的原理图中可以找到DBUS

该DBUS通过一个反相器后与UART3的接收端相连
使用DBUS接收的遥控器数据,一帧数据的长度为18字节,一共144位
DR16 接收机
DR16接收机输出的信号为标准的DBUS协议数据
DR16 接收机是一款工作频率为2.4 GHz 的16 通道接收机,配合DT7 遥控器使用。
机器人控制协议
当遥控器与接收机建立连接后,接收机每隔14ms通过DBUS发送一帧18字节数据
除了通过遥控器直接控制之外,还可以通过PC进行控制,控制链如下:

配置遥控器传输协议
先将Connecitivity下的USART3打开,将mode设置为 Asynchronous(异步通讯方式)
波特率设置为100000,数据帧设置为8位数据位,无校验位,1位停止位
然后开启USART3的DMA,添加USART_RX,配置为最高的优先级
配置为循环模式
开启USART3的全局中断
然后可以自动生成代码
添加官方函数库
我们不需要学会如何使用寄存器的方法去做遥控器数据的串口接收中断和位运算的方法去做遥控器的数据解析
我们只需要学会调用官方函数库并使用官方代码即可
将官方样例代码“9.remote_control_dma”中的“applications”和“bsp”文件夹复制到工程中
在keil中按如下操作

先新建applications和bsp组

点击新创建的组,在file栏点击Add添加我们刚刚复制的源文件

然后将复制的代码全部添加到我们创建的组中
接着打开魔法棒,选择C/C++,选择Include Paths的最右侧的三个点

双击空白,选择三个点,将刚刚的文件夹路径添加到include路径中

再将bsp文件夹中的boards文件夹添加到路径中即可在本地文件中调用我们复制进来的源文件中
的函数


代码编写
程序流程
- 先将USART1的DMA发送初始化,和USART3的DMA接收初始化
- 然后在USART3的串口接收中断中使用DMA接收遥控器的数据,并使用官方解码函数进行解码
- 然后在主函数的循环中调用串口实现的函数,将解码完成的遥控器函数通过USART1的DMA发送功能发送出来

1.初始化发送DMA和接收DMA
将USART1的DMA发送初始化,和USART3的DMA接收初始化
a. 实现 C 语言中的 printf
(利用 stdarg.h 下的 va_start 函数和 vsprintf 函数再配合串口的 DMA 发送功能)
将要发送的内容存储在tx_buf中,将要发送的数据长度存储在len变量中,然后将tx_buf的首地址和数据长度len传递给DMA发送函数完成DMA的数据发送
//初始化USART1的DMA
//要用头文件#include<stdarg.h>
const RC_ctrl_t *local_rc_ctrl;
void usart_printf(const char *fmt,...)
{
static uint8_t tx_buf[256] = {
0};
static va_list ap;//保存参数起始地址
static uint16_t len;
va_start(ap, fmt);

最低0.47元/天 解锁文章
3187





