ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32H743飞控WFG100适配ArduPilot/PX4/INAV/Betaflight四套固件实战

STM32H743飞控WFG100适配ArduPilot/PX4/INAV/Betaflight四套固件实战 1. 为什么要在WFG100这块H743板子上折腾四套固件手里这块WFG100飞控是基于STM32H743VIT6做的480MHz主频、2MB Flash、1MB RAM双IMU、双气压计、8路PWM输出、板载OSD和SD卡槽。硬件规格放在2024年看不算顶配但胜在接口齐全、引脚定义规整拿来跑ArduPilot、PX4、INAV、Betaflight这四套主流固件都具备物理条件。问题在于——能跑和跑得好是两码事。我见过太多人拿到一块H743板子兴冲冲去下固件刷进去发现串口映射对不上、IMU方向反了、气压计读不到数据然后就开始怀疑板子是不是坏的。其实绝大多数情况下不是硬件问题而是固件与硬件的适配层没有打通。APM和PX4走的是ChibiOS/NuttX操作系统抽象层INAV和BF走的是裸机或轻量级调度四套代码对H7系列的外设初始化逻辑、时钟树配置、DMA分配策略完全不同。同一块板子换一套固件就得重新过一遍引脚定义、传感器SPI总线分配、定时器通道映射。这篇内容就是把这四套固件在WFG100上的编译、烧录、适配过程完整走一遍。我会把每套固件的工具链搭建、target配置文件修改、传感器校准、试飞前检查这些环节拆开讲重点放在“为什么这么改”而不是“照着改就行”。适合手里有H743飞控、想跑不同固件做对比测试的玩家也适合正在做飞控硬件二次开发的工程师参考。先给一个总体判断WFG100的硬件底子跑这四套固件都没问题但适配工作量从低到高依次是Betaflight INAV ArduPilot PX4。BF和INAV的适配基本就是改target文件里的引脚定义和定时器映射半天能搞定APM需要处理ChibiOS的board配置和hwddef文件大概两三天PX4最麻烦NuttX的board bringup加上驱动适配一周起步。下面逐套展开。2. 四套固件的工具链搭建与编译环境对比2.1 编译环境选型为什么我最终留在Ubuntu 22.04原生环境四套固件的编译环境需求差异很大。Betaflight和INAV用GNU Arm Embedded Toolchain就能编版本要求相对宽松10-2020-q4-major到12.2都能跑。ArduPilot对工具链版本敏感官方推荐用他们自己打包的gcc-arm-none-eabi版本锁得比较死用系统自带的容易出链接错误。PX4早期版本用make1.14之后全面转向CMakeKconfig工具链要求gcc-arm-none-eabi 10-2020-q4-majorPython依赖一大堆。我试过在WSL2里搭PX4环境编译能过但烧录时USB设备透传偶尔抽风DFU模式识别不稳定。后来换到Ubuntu 22.04原生系统所有固件的编译和烧录都正常。如果你只有Windows机器WSL2跑编译没问题烧录建议用Windows端的QGroundControl或者STM32CubeProgrammer来做别在WSL里折腾USB透传。具体环境配置# 基础依赖 sudo apt update sudo apt install git zip python3 python3-pip python3-venv \ build-essential cmake ninja-build ccache dfu-util \ libusb-1.0-0-dev # ARM工具链各固件通用版本 sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # 验证版本 arm-none-eabi-gcc --version注意Ubuntu 22.04 apt源里的arm-none-eabi-gcc是10.3版本编Betaflight和INAV够用编ArduPilot和PX4建议去ARM官网下10-2020-q4-major的独立包解压后把bin目录加到PATH最前面。2.2 四套固件的源码获取与分支选择源码分支选择直接决定你能不能编过。我踩过的坑ArduPilot的master分支经常处于不可编译状态一定要切到stable标签。PX4的main分支同理用release标签更稳。固件推荐分支/标签仓库地址编译系统Betaflight4.4.x maintenancegithub.com/betaflight/betaflightmakeINAV7.1.x maintenancegithub.com/iNavFlight/inavmakeArduPilotCopter-4.4 stablegithub.com/ArduPilot/ardupilotwafPX4v1.14.3github.com/PX4/PX4-Autopilotcmake克隆的时候加--recursive把子模块一起拉下来ArduPilot和PX4的子模块特别多漏了后面编译报错很难查。# ArduPilot git clone --recursive https://github.com/ArduPilot/ardupilot.git cd ardupilot git checkout Copter-4.4.4 git submodule update --init --recursive # PX4 git clone --recursive https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot git checkout v1.14.3 make distclean2.3 首次编译验证先编官方target再动刀拿到源码别急着改WFG100的配置先用官方支持的H743 target编一遍确认工具链没问题。ArduPilot可以编CubeOrange或者Pixhawk6XPX4编px4_fmu-v6xBetaflight编STM32H743的默认targetINAV编MATEKH743。这一步的目的是把工具链、Python依赖、子模块完整性全部验证通过。如果官方target都编不过说明环境有问题先解决环境再谈适配。我见过有人直接改target文件然后编译报错以为是改错了其实是工具链版本不对。编译命令示例# ArduPilot 编CubeOrange验证 ./waf configure --board CubeOrange ./waf copter # PX4 编v6x验证 make px4_fmu-v6x_default # Betaflight make STM32H743 # INAV make MATEKH743四套都编过一遍之后你对自己机器上的编译耗时会有概念。ArduPilot全量编译大概8-12分钟PX4大概5-8分钟BF和INAV各2-3分钟。后面改target文件增量编译会快很多。3. WFG100硬件资源梳理与四套固件的引脚分配逻辑3.1 先把板子上的外设总线理清楚适配任何固件之前必须先把WFG100的硬件资源摸透。我对着原理图把关键外设列了一遍MCUSTM32H743VIT6LQFP100封装IMU1ICM42688SPI1CS接PE11IMU2BMI270SPI1CS接PE10与IMU1共用SPI1气压计DPS310I2C1地址0x76磁罗盘QMC5883LI2C1地址0x0DSD卡SDMMC14位模式OSDAT7456ESPI2PWM输出TIM1 CH1-4TIM4 CH1-4串口UART1/2/3/4/6/7/8USBOTG_FSLEDWS2812TIM5 CH1关键点在于SPI1上挂了两个IMU靠不同的CS引脚区分。四套固件对多IMU共用SPI总线的处理方式不同BF和INAV用SPI_DEVICE宏逐个注册APM在hwddef里定义多个SPI devicePX4走的是SPI总线驱动加CS GPIO的框架。3.2 四套固件的引脚定义文件位置与修改入口每套固件的target定义文件位置和格式都不一样这是适配工作的核心入口Betaflightsrc/main/target/WFG100/target.h需要新建目录。引脚用#define宏定义格式是IO_TAG(引脚)。INAVsrc/main/target/WFG100/target.h格式与BF类似但宏名称有差异比如DEFIO和IO_TAG的用法不同。ArduPilotlibraries/AP_HAL_ChibiOS/hwdef/WFG100/需要新建目录包含hwdef.dat、defaults.parm、board_types.txt等文件。hwdef.dat用类似设备树的语法描述外设。PX4boards/wfg/wfg100/需要新建board目录包含default.px4board、board_config.h、init/rc.board_defaults等。PX4的board配置分散在多个文件里改起来最繁琐。3.3 时钟树配置的差异H743的480MHz不是随便跑的STM32H743的时钟树比F4/F7复杂得多。H743有多个时钟域CPU域、AXI域、AHB域、APB域每个域的时钟源和分频都可以独立配置。四套固件对H743时钟树的初始化策略不同Betaflight和INAV基本沿用ST的HAL库默认配置CPU跑480MHzAXI 240MHzAHB 120MHzAPB1/APB2 120MHz。这个配置比较保守但稳定。ArduPilot在ChibiOS里自己配时钟树CPU 480MHz但会根据外设需求调整APB分频。比如SPI时钟要跑到20MHz以上APB就得相应配置。PX4在NuttX里配时钟树默认配置和ArduPilot接近但PX4对USB时钟要求严格OTG_FS必须精确48MHz分频系数算错USB就枚举不了。实操心得如果你改完target文件发现USB识别不了先查时钟树配置。H743的USB时钟源是PLL1Q或者PLL3Q分频系数必须让输出精确等于48MHz差一点都会导致枚举失败。4. Betaflight在WFG100上的适配从target文件到首飞4.1 新建WFG100 target目录与最小配置Betaflight的target适配是最简单的因为BF的驱动层抽象做得比较薄大部分外设初始化都是直接操作寄存器。在src/main/target/下新建WFG100目录创建target.h和target.mk。target.mk里指定MCU型号TARGET_MCU : STM32H743target.h里定义板级资源。先配最小系统LED、蜂鸣器、串口、IMU、气压计。PWM和OSD后面再加。#define BOARD_NAME WFG100 #define USBD_PRODUCT_STRING WFG100 // 串口 #define USE_USART1 #define USE_USART2 #define USE_USART3 #define USE_USART6 #define SERIAL_PORT_COUNT 4 // IMU #define USE_SPI #define USE_SPI_DEVICE_1 #define SPI1_SCK_PIN PA5 #define SPI1_MISO_PIN PA6 #define SPI1_MOSI_PIN PA7 #define USE_IMU_ICM42688 #define IMU_ICM42688_CS_PIN PE11 #define IMU_ICM42688_SPI_BUS BUS_SPI1 #define USE_IMU_BMI270 #define IMU_BMI270_CS_PIN PE10 #define IMU_BMI270_SPI_BUS BUS_SPI14.2 双IMU共用SPI1的CS管理与DMA分配BF对多IMU共用SPI总线的处理方式是每个IMU注册为独立的SPI device各自有CS引脚但共用同一个SPI bus。读取时通过拉低对应CS来选中目标IMU。这里有个坑如果两个IMU的CS引脚在同一个GPIO端口上BF的IO_TAG宏能正确处理如果跨端口需要确认IO_TAG的位操作没问题。DMA分配是另一个容易出问题的地方。H743的SPI1有多个DMA请求通道BF默认用DMA1 Stream0/1给SPI1。如果和SDMMC或者其他外设冲突需要手动调整。我在WFG100上遇到SPI1 DMA和SDMMC1 DMA冲突把SPI1的DMA改到DMA2上解决。// DMA冲突时手动指定 #define SPI1_TX_DMA_OPT 1 #define SPI1_RX_DMA_OPT 14.3 编译烧录与传感器校准的完整流程target文件写好后编译make WFG100生成的hex在obj/WFG100.hex。烧录用DFU模式按住BOOT键上电然后dfu-util -a 0 -s 0x08000000:leave -D obj/WFG100.hex烧完连Betaflight Configurator先看传感器页面。如果IMU数据不动检查SPI通信如果方向不对在Configurator里调board alignment如果气压计读数为0检查I2C地址。校准顺序加速度计六面校准 → 磁罗盘校准 → 气压计地面校准。BF的校准流程很成熟跟着界面走就行。注意BF 4.4对H743的DFU烧录有个已知问题部分板子需要先擦除全片再烧。如果dfu-util报错加-s 0x08000000:mass-erase:force:leave参数。5. INAV适配在BF基础上补GPS与OSD5.1 从BF target迁移到INAV的差异点INAV的target文件格式和BF很像但不能直接复制。主要差异INAV的宏名称有变化比如USE_USART1在INAV里是USE_UART1INAV多了GPS、OSD、导航相关的配置项INAV的定时器映射宏和BF不同。我建议以INAV官方的MATEKH743 target为模板改比从BF迁移省事。MATEKH743也是H743外设配置接近改引脚定义和传感器型号就行。5.2 GPS与OSD的引脚分配和协议配置WFG100上GPS接UART2OSD用AT7456E走SPI2。INAV的OSD配置比BF复杂因为INAV支持动态OSD和多种OSD芯片。// GPS #define USE_GPS #define GPS_UART UART2 // OSD #define USE_MAX7456 #define MAX7456_SPI_BUS BUS_SPI2 #define MAX7456_CS_PIN PB12INAV的OSD需要配置osdconfig在CLI里设置视频制式、OSD元素布局。AT7456E的初始化时序比较讲究如果OSD不显示先查SPI2的时钟是否使能、CS引脚是否正确。5.3 INAV特有的导航参数与试飞前检查INAV和BF最大的区别是INAV有完整的导航功能。适配完硬件后需要配置nav_mc_vel_xy_p等PID参数nav_rth_altitude返航高度nav_fw_launch_velocity等固定翼参数如果跑固定翼试飞前检查清单GPS星数≥8、HDOP≤1.5、磁罗盘校准通过、加速度计校准通过、遥控器通道映射正确、模式开关配置正确、失控保护测试通过。实操心得INAV在H743上跑的时候如果开了太多功能OSDGPS导航黑匣子CPU负载会比较高。可以在CLI里用tasks命令看各任务耗时如果某个任务超过预算考虑关掉不用的功能。6. ArduPilot适配ChibiOS board配置的深水区6.1 hwdef.dat的语法结构与关键字段ArduPilot的hwdef.dat是适配的核心文件语法类似设备树但更简洁。关键字段# MCU MCU STM32H743xx # 时钟 OSCILLATOR_HZ 24000000 # SPI总线 SPIDEV icm42688 SPI1 DEVID1 PE11 MODE3 1*MHZ 8*MHZ SPIDEV bmi270 SPI1 DEVID2 PE10 MODE3 1*MHZ 8*MHZ SPIDEV at7456e SPI2 DEVID1 PB12 MODE0 1*MHZ 10*MHZ # I2C I2C_ORDER I2C1 # 串口 SERIAL_ORDER OTG1 UART1 UART2 UART3 UART6 # 定时器 TIM1 PWM(1) GPIOE(9) TIM1 PWM(2) GPIOE(11) TIM4 PWM(3) GPIOD(12)每个SPIDEV行定义了一个SPI设备设备名、总线、片选、CS引脚、SPI模式、低速时钟、高速时钟。MODE3和MODE0要查传感器手册确认。6.2 双IMU的EKF3配置与传感器健康检查ArduPilot用EKF3做状态估计支持多IMU融合。hwdef里定义好两个IMU后需要在defaults.parm里配置EK3_IMU_MASK 3 EK3_PRIMARY 0 INS_ENABLE_MASK 3EK3_IMU_MASK 3表示启用前两个IMU。如果两个IMU型号不同ICM42688BMI270EKF3会自动做一致性检查差异过大时切换主IMU。传感器健康检查在Mission Planner的“状态”页面看重点看IMU的加速度和陀螺仪读数是否合理、气压计高度是否稳定、磁罗盘是否有干扰。6.3 waf编译系统与bootloader烧录ArduPilot用waf编译./waf configure --board WFG100 ./waf copter生成的固件在build/WFG100/bin/arducopter.apj。烧录有两种方式通过Mission Planner刷apj文件或者用DFU刷hex。bootloader需要单独编译和烧录./waf configure --board WFG100 --bootloader ./waf bootloaderbootloader烧到0x08000000固件烧到0x08020000。如果bootloader没烧对固件跑不起来。注意ArduPilot的H743 bootloader对Flash分区有要求WFG100的2MB Flash要合理分配bootloader区、参数区、固件区。hwdef里的FLASH_SIZE_KB和FLASH_RESERVE要算清楚。7. PX4适配NuttX board bringup与驱动适配7.1 新建board目录与Kconfig配置PX4的board配置在boards/wfg/wfg100/下需要创建default.px4board板级配置指定驱动和功能board_config.h引脚定义和硬件配置init/rc.board_defaults启动脚本src/板级驱动代码default.px4board里用Kconfig语法CONFIG_BOARD_SERIAL_TEL1/dev/ttyS0 CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688Py CONFIG_DRIVERS_BAROMETER_DPS310y CONFIG_DRIVERS_MAG_QMC5883Ly7.2 传感器驱动的SPI/I2C总线注册PX4的驱动框架比APM更复杂传感器驱动需要注册到对应的SPI/I2C总线。在board_config.h里定义总线#define PX4_SPI_BUS_SENSORS 1 #define PX4_SPI_BUS_OSD 2 #define PX4_I2C_BUS_EXPANSION 1 #define GPIO_SPI1_CS_ICM42688 (GPIO_PORTC | GPIO_PIN15) #define GPIO_SPI1_CS_BMI270 (GPIO_PORTC | GPIO_PIN14)然后在rc.board_defaults里启动驱动icm42688p start -s -b 1 bmi270 start -s -b 1 dps310 start -b 1 qmc5883l start -b 17.3 PX4的EKF2与uORB消息验证PX4用EKF2做状态估计和APM的EKF3是两套不同的实现。适配完传感器后用uorb top看消息频率确认sensor_combined、vehicle_attitude、vehicle_local_position这些话题有数据。如果EKF2不收敛检查IMU数据是否有噪声、磁罗盘是否校准、气压计是否有漂移、GPS是否正常。PX4的EKF2对传感器质量要求比APM高传感器噪声大的话EKF2会拒绝融合。实操心得PX4在H743上跑的时候如果开了太多模块内存会不够。用free命令看剩余内存如果小于50KB考虑关掉不用的模块。WFG100的1MB RAM跑PX4完整功能有点紧建议关掉不必要的驱动和模块。8. 四套固件在WFG100上的实测表现与选型建议8.1 编译难度、资源占用、功能完整度对比维度BetaflightINAVArduPilotPX4适配工作量半天半天到一天两到三天一周以上编译耗时2分钟3分钟10分钟8分钟Flash占用~500KB~700KB~1.5MB~1.8MBRAM占用~200KB~300KB~500KB~700KB多IMU支持支持支持支持支持导航功能无基础完整完整适合场景穿越机固定翼/远航多旋翼/固定翼科研/开发8.2 不同应用场景下的固件选型逻辑穿越机、花飞选BetaflightPID响应快、手感直接。固定翼远航选INAV导航功能够用、配置简单。多旋翼航拍、测绘选ArduPilot功能完整、社区成熟。科研开发、算法验证选PX4模块化好、二次开发方便。WFG100这块板子跑四套固件都没问题但要注意Flash和RAM的余量。PX4跑完整功能时RAM比较紧张建议关掉不用的模块。ArduPilot的Flash占用也不小如果要用日志功能SD卡要选高速的。8.3 从适配到试飞我踩过的五个坑第一个坑H743的DFU模式在部分Linux发行版上识别不稳定换USB线或者加udev规则解决。第二个坑双IMU共用SPI时CS引脚如果配错两个IMU都读不到数据但错误现象是“IMU不健康”而不是“SPI通信失败”容易误判。第三个坑PX4的board_config.h里引脚定义用的是GPIO端口号引脚号的编码方式和STM32的引脚命名不一样需要查PX4的GPIO定义表。第四个坑ArduPilot的hwdef.dat里SPIDEV的时钟频率如果设太高传感器初始化会失败。ICM42688最高支持24MHz但初始化时建议先用1MHz初始化完成后再切高速。第五个坑INAV的OSD在H743上如果SPI2时钟配置不对OSD会显示乱码或者不显示。AT7456E的SPI时钟不能超过10MHz。9. 适配完成后的验证清单与长期维护建议9.1 试飞前的硬件与软件双重检查硬件检查电源电压正常、电机转向正确、桨叶安装正确、GPS天线朝向正确、遥控器信号正常、图传信号正常。软件检查传感器校准通过、模式开关配置正确、失控保护测试通过、返航高度设置合理、日志功能正常。双重检查的意思是硬件检查完一遍软件检查完一遍然后交叉验证。比如软件里看到GPS星数够硬件上确认GPS天线没被遮挡软件里看到IMU数据正常硬件上确认飞控减震做好。9.2 固件升级与参数备份的策略四套固件的参数备份方式不同BF和INAV用CLI的diff命令导出配置APM用Mission Planner的参数导出PX4用param save命令。升级固件前先备份参数升级后先恢复参数再试飞。我见过有人升级固件后忘了恢复参数直接试飞导致炸机。长期维护建议关注各固件的release note特别是H743相关的bug fix。ArduPilot和PX4的H743支持在持续改进新版本可能修复了你遇到的兼容性问题。9.3 社区资源与二次开发入口Betaflight和INAV的社区在Discord和GitHub DiscussionsArduPilot在DiscoursePX4在Discourse和Slack。遇到适配问题先搜issue大概率有人遇到过。二次开发入口BF和INAV改target文件就行APM改hwdef和librariesPX4改boards和src/drivers。如果想加新传感器四套固件的驱动框架都要熟悉。我个人在实际操作中的体会是适配飞控固件这件事最难的不是写代码而是理解每套固件的设计哲学。BF追求极致响应INAV追求功能平衡APM追求稳定可靠PX4追求模块化和可扩展。理解了这个改target文件的时候就知道哪些参数可以动、哪些不能动。
返回列表