大疆A型板使用经验分享(五)—— DMA配置和遥控器使用

本文分享了使用STM32通过DMA处理DBUS协议与遥控器通讯的经验,详细阐述了DMA配置、DBUS协议详情、CubeMX设置步骤以及解码函数的实现。调试过程中,通过观察变量验证了配置的正确性。
摘要由CSDN通过智能技术生成

一. DMA

直接存储器访问(Direct Memory Access,DMA,当需要将外部设备发来的数据存储在存储器中时,如果不使用DMA方式则首先需要将外部设备数据先读入CPU中,再由CPU将数据存储到存储器中,如果数据量很大的话,那么将会占用大量的CPU时间,而通过使用DMA控制器直接将外部设备数据送入存储器,不需要占用CPU。STM32中的许多通讯如USART,SPI,IIC都支持DMA方式进行数据的收发。

二. DBUS协议

遥控器和stm32之间采用DBUS协议进行通讯。DBUS通讯协议和串口类似,DBUS的传输速率为100kbit/s,数据长度为8位,奇偶校验位为偶校验,结束位1位。需要注意的是DBUS使用的电平标准和串口是相反的,在DBUS协议中高电平表示0,低电平表示1,如果使用串口进行接收需要在接收电路上添加一个反相器。使用DBUS接收遥控器的数据,一帧数据的长度为18字节,一共144位,根据遥控器的说明书可以查出各段数据的含义,从而进行数据拼接,完成遥控器的解码,如图所示。

  • 19
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
要调用大疆DT7的DBus协议,您需要使用DBus编程接口来与DT7通信。DBus是一种用于进程间通信的系统总线,它是Linux上的一种标准机制。 在使用DBus时,您需要使用如下步骤: 1. 安装DBus库 您需要安装DBus库,例如libdbus-1-dev,以便能够使用DBus API。 2. 创建DBus连接 使用DBus API创建一个DBus连接,并指定要连接的服务名称和对象路径。 3. 发送DBus消息 使用DBus API向DT7发送DBus消息。您需要指定DBus消息的类型、目标对象、方法名称以及参数列表。 4. 接收DBus消息 使用DBus API接收DT7返回的DBus消息。 5. 解析DBus消息 使用DBus API解析DBus消息,并从中提取所需的数据。 6. 断开DBus连接 使用DBus API断开与DT7的DBus连接。 这里提供一个简单的示例代码,用于向DT7发送一个DBus消息并接收其返回值: ``` #include <stdio.h> #include <stdlib.h> #include <dbus/dbus.h> int main(int argc, char **argv) { DBusConnection *conn; DBusError err; DBusMessage *msg, *reply; dbus_uint32_t serial = 0; const char *bus_name = "com.dji.dt7"; const char *object_path = "/com/dji/dt7"; const char *interface_name = "com.dji.dt7.Interface"; const char *method_name = "dt7_method"; dbus_bool_t ret; // Initialize error structure dbus_error_init(&err); // Connect to the bus conn = dbus_bus_get(DBUS_BUS_SESSION, &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Connection Error (%s)\n", err.message); dbus_error_free(&err); return EXIT_FAILURE; } // Request a name on the bus ret = dbus_bus_request_name(conn, bus_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Name Error (%s)\n", err.message); dbus_error_free(&err); return EXIT_FAILURE; } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { return EXIT_FAILURE; } // Create a new message msg = dbus_message_new_method_call(bus_name, object_path, interface_name, method_name); if (NULL == msg) { fprintf(stderr, "Message Null\n"); return EXIT_FAILURE; } // Append arguments to the message if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &"Hello, DT7!", DBUS_TYPE_INVALID)) { fprintf(stderr, "Out Of Memory!\n"); return EXIT_FAILURE; } // Send the message and flush the connection if (!dbus_connection_send(conn, msg, &serial)) { fprintf(stderr, "Out Of Memory!\n"); return EXIT_FAILURE; } dbus_connection_flush(conn); // Free the message dbus_message_unref(msg); // Block until we receive a reply dbus_bus_add_match(conn, "type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'", &err); dbus_connection_flush(conn); if (dbus_error_is_set(&err)) { fprintf(stderr, "Match Error (%s)\n", err.message); dbus_error_free(&err); return EXIT_FAILURE; } reply = dbus_connection_pop_message(conn); if (NULL == reply) { return EXIT_FAILURE; } // Parse the reply if (!dbus_message_get_args(reply, &err, DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID)) { fprintf(stderr, "Reply Null\n"); return EXIT_FAILURE; } // Print the reply printf("Reply: %s\n", str); // Free the reply and close the connection dbus_message_unref(reply); dbus_connection_close(conn); return EXIT_SUCCESS; } ``` 注意,这个示例只是演示如何使用DBus API向DT7发送DBus消息,并接收其返回值。实际上,DT7的DBus协议非常复杂,您需要根据具体的需求和协议文档编写相应的代码。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cascatrix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值