ArduPilot AP_Periph DroneCAN 外设固件开发指南:从 hwdef.dat 到构建、烧录与仿真验证
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
AP_Periph 是 ArduPilot 仓库中一套基于 DroneCAN 协议的外设固件方案(Tools/AP_Periph/README.md),它复用 ArduPilot 丰富的传感器驱动,让开发者只需编写一个简单的 hwdef.dat 即可把 STM32 芯片变成 GPS/RTK、罗盘、气压计、测距仪、电调等 DroneCAN 外设。本文将以官方 README 为主线,结合仓库源码深入讲解 AP_Periph 的架构、支持的硬件与功能、构建烧录流程、bootloader 更新机制以及 SITL 仿真测试方法,帮助你从零上手开发自己的 DroneCAN 外设固件。
AP_Periph 是什么
AP_Periph 是一套基于 ArduPilot 的 DroneCAN(即 UAVCAN v0)外设固件。它的核心设计思想是:不重复造轮子——直接复用 ArduPilot 中为飞控开发的大量传感器驱动(GPS、罗盘、气压计、空速、测距、ADSB、电调遥测等),把它们封装成一个运行在独立 STM32 节点上的 DroneCAN 从设备固件。
与 ArduCopter、ArduPlane 等载具固件不同,AP_Periph 不执行飞行控制逻辑,而是通过 CAN 总线与主飞控通信,把本地传感器数据以 DroneCAN 消息形式广播到总线上,或接收飞控下发的遥控输出(RCOutput)、灯光、蜂鸣器等命令。从源码结构看,AP_Periph 的主类AP_Periph_FW(定义于 Tools/AP_Periph/AP_Periph.h)同时持有AP_GPS、Compass、AP_Baro、AP_Airspeed、RangeFinder、AP_BattMonitor、AP_Proximity、AP_EFI等完整的 ArduPilot 传感器库实例,这正是它能快速支持多种外设类型的根本原因。
AP_Periph 的入口实现(Tools/AP_Periph/AP_Periph.cpp)展示了其运行模型:
setup()调用periph.init(),完成参数加载、CAN 启动、各传感器初始化、串口管理、看门狗初始化等;loop()周期调用periph.update(),以 1Hz 发送心跳与系统状态、10Hz 读取电池、50Hz 更新通知与 GCS、并持续调用can_update()处理 CAN 收发。
void setup(void) { periph.init(); } void loop(void) { periph.update(); }值得一提的健壮性设计是:init()中始终启用硬件看门狗(stm32_watchdog_init()与周期性的stm32_watchdog_pat()),并在编译期强制要求AP_CHECK_FIRMWARE_ENABLED开启(否则直接#error)。源码注释明确指出,这不仅是功能依赖,更是一套"刷错固件也能可靠恢复"的防护机制。
基于 hwdef.dat 的硬件适配机制
AP_Periph 复用了 ArduPilot 的 ChibiOS hwdef.dat 系统——这也是 ArduPilot 为 STM32 飞控定义引脚的核心工具。这意味着:
支持一个新的基于 STM32 的 DroneCAN 外设,只需要编写一个定义设备引脚的简单 hwdef.dat 文件。
hwdef 文件位于仓库的 libraries/AP_HAL_ChibiOS/hwdef 目录下,每个板卡一个子目录。构建系统会自动识别 AP_Periph 板卡:根据 Tools/ardupilotwaf/boards.py 中的get_ap_periph_boards()逻辑,板卡名包含 "periph" 关键字,或 hwdef.dat 中带有 periph 标记的板卡,都会被纳入 AP_Periph 构建目标。
支持的 MCU 系列
仓库中已提供超过 60 个 AP_Periph 构建目标,覆盖 ArduPilot 支持的全部主流 STM32 系列:
| MCU 系列 | 典型外设应用 |
|---|---|
| STM32F1xx | 低成本 GPS 模块、CAN 节点 |
| STM32F3xx | 测距、传感器节点 |
| STM32F4xx | 主流 GPS/RTK、罗盘、电调节点 |
| STM32F7xx | 高性能外设 |
| STM32H7xx | 高速 CAN-FD、多传感器复合节点 |
| STM32L4xx | 低功耗外设 |
| STM32G4xx | 电机驱动、遥测节点 |
更多 MCU 可通过 hwdef.dat 系统扩展(hwdef.dat 示例可查看 libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat、libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat 等成熟产品级配置)。
支持的传感器与功能特性
传感器类型
AP_Periph 可配置支持以下 DroneCAN 传感器类型:
- GPS 模块(含 RTK GPS,支持移动基线 Moving Baseline 数据转发)
- 磁罗盘(SPI 或 I2C)
- 气压计(SPI 或 I2C)
- 空速传感器(I2C)
- 测距仪(UART 或 I2C,支持多实例)
- ADSB(uAvionix 兼容的 Ping ADSB 接收机,接 UART)
- 电池监测(Analog、I2C/SMBus、UART)
- LED(GPIO、I2C 或 WS2812 串行)
- 安全 LED 与安全开关
- 蜂鸣器(tonealarm 或简单 GPIO)
- RC 输出(全部标准 RCOutput 协议,含 DShot 等)
- RC 输入
- 电池平衡监测(Tools/AP_Periph/batt_balance.cpp)
- EFI 发动机(libraries/AP_EFI/AP_EFI.cpp)
- 近距离传感器 Proximity(libraries/AP_Proximity/AP_Proximity.cpp)
此外,从 Tools/AP_Periph/Parameters.cpp 的参数表还可以看到更多可选能力:温度传感器(TEMP_MSG_RATE)、RPM 转速传感器(RPM_MSG_RATE)、MSP 串口透传(MSP_PORT)、IMU 输出(INS_SAMPLE_RATE)、电调遥测(ESC_TELEM_RATE)、舵机遥测(SRV_TLM_MSG_RATE)、NMEA 输出、继电器(RELAY)、以及通过 Lua 脚本扩展的通知/灯光控制(SCR_参数组)。是否启用取决于 hwdef.dat 中的宏定义,构建系统会根据 hwdef 裁剪库(见 Tools/AP_Periph/wscript 中的AP_PERIPH_HEAVY分支)。
DroneCAN 协议特性
AP_Periph 固件具备完整的 DroneCAN 节点能力:
- 动态或静态 CAN 节点分配:
CAN_NODE参数设为 0 时向 DNA 服务器请求动态节点 ID,设为非 0 值则固定使用该 ID(范围 0~127) - 固件上传:支持通过 CAN 总线在线升级固件
- 自动生成的 bootloader:每个板卡构建时自动生成配套 bootloader
- 参数存储在 Flash:通过 StorageManager 持久化参数
- 便捷的 bootloader 更新:用户可直接在飞控端触发
- 高韧性设计:看门狗、CRC 校验与板级检查
- 固件与参数更新:外设挂载在飞控上时,可通过 MissionPlanner 或 DroneCAN GUI 工具完成
- USB 固件更新:若硬件提供 USB 口,可独立通过 USB 更新固件
- SLCAN 参数更新:若提供 USB,外设独立使用时可通过 SLCAN + DroneCAN GUI 更新参数
从 Tools/AP_Periph/AP_Periph.h 的消息处理函数列表可以看出协议实现的完整性:handle_get_node_info(节点信息)、handle_param_getset/handle_param_executeopcode(参数读写与操作码执行)、handle_begin_firmware_update(固件更新启动)、handle_allocation_response(动态节点 ID 分配)、handle_safety_state(安全状态)、handle_RTCMStream(RTK 差分数据)、handle_esc_rawcommand(电调原始命令)、handle_act_command(舵机命令)、handle_beep_command(蜂鸣)、handle_lightscommand(灯光)等。
编译 AP_Periph 固件
以官方示例板卡 f103-GPS 为例(注意:f103-GPS 对应的 hwdef 需在 libraries/AP_HAL_ChibiOS/hwdef 中确认你的板卡目录是否存在,若为自研板卡请先按 hwdef.dat 规范编写配置文件):
# 1. 配置构建环境,指定目标板卡 ./waf configure --board f103-GPS # 2. 编译 AP_Periph 固件 ./waf AP_Periph构建产物位于build/f103-GPS/bin/AP_Periph.bin。之后可通过CAN bootloader配合dronecan_gui_tool或MissionPlanner 的 DroneCAN 支持将其加载到设备中。
构建系统会在 configure 阶段自动识别该板卡是否为 AP_Periph 目标(Tools/ardupilotwaf/boards.py 的get_ap_periph_boards()),并据此裁剪库集合、启用AP_PERIPH相关定义。
烧录固件
使用 ST-Link 直接烧录
ST-Link V2 可直接将固件写入目标地址。官方给出了两个典型示例:
# f103-GPS:应用固件加载地址 0x8006400 st-flash write build/f103-GPS/bin/AP_Periph.bin 0x8006400 # CUAV_GPS:应用固件加载地址 0x10000(从 0x8010000 写入) st-flash write build/CUAV_GPS/bin/AP_Periph.bin 0x8010000注意:写入地址必须与硬件设计中的 bootloader 长度匹配(不同板卡偏移不同,CUAV_GPS 在 0x10000 偏移处),务必先确认目标板卡的固件偏移约定,避免覆盖 bootloader 区域。
烧录 bootloader
bootloader 需要烧录到 Flash 起始地址 0x8000000:
st-flash write Tools/bootloaders/f103-GPS_bl.bin 0x8000000预编译的 bootloader 文件存放在仓库的 Tools/bootloaders 目录(<板卡名>_bl.bin)。
构建 bootloader
若需要自行编译 bootloader,可使用仓库提供的自动化脚本:
Tools/scripts/build_bootloaders.py f103-GPS脚本源码位于 Tools/scripts/build_bootloaders.py,构建生成的 bootloader 会输出到Tools/bootloaders目录,命名形如<板卡名>_bl.bin。bootloader 本身也是由同一套 hwdef 系统生成的(构建逻辑可参考 Tools/ardupilotwaf/chibios.py 中关于BOOTLOADER与HAL_NUM_CAN_IFACES的配置处理)。
固件分发与参数修改
AP_Periph 固件目标由 ArduPilot 官方 CI 自动构建并发布到 ArduPilot 固件服务器。普通用户获取固件后:
- 通过MissionPlanner或DroneCAN GUI Tool加载固件;
- 外设参数可通过MissionPlanner 的 DroneCAN 支持或DroneCAN GUI 工具在线修改。
核心参数速查
以下参数在 Tools/AP_Periph/Parameters.cpp 中定义,均带有完整的参数元数据(范围、单位、默认值):
| 参数 | 说明 | 默认值 | 备注 |
|---|---|---|---|
CAN_NODE | 本节点在所有网络上的 DroneCAN 节点 ID;0 表示向 DNA 服务器动态申请 | 板卡默认 | 范围 0~127,重启生效 |
CAN_BAUDRATE | CAN 接口比特率 | 1000000 | 范围 10000~1000000,重启生效 |
CAN_PROTOCOL | 端口使用的协议(0:禁用,1:UAVCAN/DroneCAN,4:PiccoloCAN 等) | DroneCAN | 至少一个 CAN 口必须为 DroneCAN |
CAN_FDMODE/CAN_FDBAUDRATE | CAN-FD 模式与数据段比特率(1M/2M/4M/5M/8M) | 0 / 由硬件决定 | 需 MCU 支持 CAN-FD |
FLASH_BOOTLOADER | 触发 bootloader 更新(危险操作) | 0 | 见下文"用户 bootloader 更新" |
DEBUG | 调试位掩码(0:显示空闲栈,1:15 秒后自动重启,2:发送统计) | 0 | — |
BRD_SERIAL_NUM | 设备序列号,非 0 时会显示在 CAN App Name 中 | 0 | — |
GPS_PORT | GPS 串口编号,该口协议会被设为 GPS | 3 | 重启生效 |
RNGFND_BAUDRATE/RNGFND_PORT | 测距仪串口波特率/端口 | 115200 / 3 | 支持多实例(RNGFND2_*) |
RNGFND_MAX_RATE | 测距数据最大发送速率(Hz),0 表示不限 | 50 | 范围 0~200 |
ADSB_BAUDRATE/ADSB_PORT | ADSB 串口波特率/端口 | 57600 / 1 | — |
ESC_RATE/ESC_PWM_TYPE | 电调输出速率 / PWM 类型(1 正常、2 OneShot、3 OneShot125、4 Brushed、5~8 DShot) | 400Hz / 0 | — |
ESC_CMD_TIMO | 电调命令超时(ms),超时后输出归零,0 表示不归零 | 200 | 应大于两帧 CAN 命令间隔 |
SRV_CMD_TIME_OUT | 舵机命令超时(ms) | 200 | 同上 |
BARO_ENABLE | 气压计使能 | 1 | — |
LOG_BITMASK | 日志位掩码(bit1 为 GPS) | 4 | — |
OPTIONS | 外设选项位掩码(bit0:持续探测传感器) | 板卡决定 | — |
传感器驱动参数(如GPS_*、COMPASS_*、BARO_*、ARSPD_*、RNGFND_*、BATT_*、PRX_*、EFI_*、TEMP_*、RPM_*、INS_*)均复用对应 ArduPilot 库的参数体系,可通过串口/DroneCAN 完整配置。
用户 bootloader 更新机制
AP_Periph 的一个实用特性是:bootloader 已内置在固件的 ROMFS 中,终端用户无需 ST-Link 即可升级 bootloader。
操作步骤:
- 通过 DroneCAN 将外设参数
FLASH_BOOTLOADER设为1; - 节点会执行 bootloader 更新——将内嵌的 bootloader 复制覆盖现有 bootloader(耗时数秒);
- 更新结果会以debug 文本消息回传,可在 DroneCAN GUI 工具中查看。
该参数的完整描述可见 Tools/AP_Periph/Parameters.cpp 中的FLASH_BOOTLOADER定义,其注释明确警告:"DANGER! 启用后 App 将用内嵌 bootloader 覆盖现有 bootloader……只有在明确知道自己在做什么时才应执行"。
与 bootloader 更新配套的还有 Tools/AP_Bootloader 目录下的 bootloader 源码(含 CAN 固件上传协议bl_protocol.cpp、从 SD 卡刷写flash_from_sd.cpp、网络刷写network.cpp等),以及 Tools/AP_Periph/AP_Periph.cpp 中的prepare_reboot()/reboot(bool hold_in_bootloader)实现——重启前会强制打开安全开关(force_safety_on())、冲刷未写入的参数(AP_Param::flush())并短暂延迟以让 ACK 发出,确保升级过程安全可靠。
SITL 仿真测试
AP_Periph 在 SITL(软件在环)仿真系统中支持大量 DroneCAN 外设,无需真实硬件即可验证固件行为。最简单的方式是使用sim_vehicle.py启动带 DroneCAN 总线的仿真载具:
# 仿真垂直起降固定翼(quadplane),挂载 DroneCAN 外设 sim_vehicle.py -f quadplane-can # 仿真四旋翼,挂载 DroneCAN 外设 sim_vehicle.py -f quad-canSITL 支持通过HAL_BOARD_SITL构建 AP_Periph(Tools/AP_Periph/AP_Periph.cpp 中为 SITL 提供了看门狗的桩实现),仿真时每个外设作为独立 CAN 节点接入仿真总线,可用于验证节点分配、传感器消息流、电调命令与遥测等完整链路。仿真的测试用例可参考 Tools/autotest 下的自动化测试体系。
开发新外设的推荐路径
结合 README 与源码,为自研 STM32 外设开发 AP_Periph 固件的完整流程是:
- 编写 hwdef.dat:在 libraries/AP_HAL_ChibiOS/hwdef 下新建板卡目录,定义 MCU、CAN 外设引脚、传感器接口(SPI/I2C/UART)、LED/蜂鸣器 GPIO 等;参考现有产品级配置(如 libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat);
- 配置构建:
./waf configure --board <你的板卡名>,确认构建系统识别为 AP_Periph 目标; - 编译固件:
./waf AP_Periph,得到build/<板卡>/bin/AP_Periph.bin; - 编译 bootloader:
Tools/scripts/build_bootloaders.py <板卡名>,输出到 Tools/bootloaders; - 烧录:先用 ST-Link 烧 bootloader 到 0x8000000,再按板卡偏移烧应用固件;
- 调参验证:通过 SITL 仿真或接上飞控,用 MissionPlanner / DroneCAN GUI 修改参数、观察节点消息、验证传感器数据与遥控输出;
- 发布:配置 CI 自动构建,固件即可通过 DroneCAN 在线更新通道分发。
总结
AP_Periph 将 ArduPilot 的传感器驱动资产与 DroneCAN 生态有机结合,是快速构建 UAVCAN 外设的高效方案。其核心价值在于:复用 hwdef.dat 硬件抽象与完整传感器库,一套源码即可支持从 F1 到 H7 的数十种 MCU、数十种外设形态,并内置看门狗、CRC 校验、Flash 参数存储、自动 bootloader 生成与在线更新等高韧性机制。无论是 GPS/RTK 模块、CAN 电调、测距传感器还是复合传感器节点,遵循 README 与源码中的构建、烧录与仿真流程,都能在很短时间内完成从硬件定义到可用固件的闭环。
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考