当前位置: 首页 > news >正文

从零定制:基于STM32F401CCU开发板的INAV飞控移植实战

1. 为什么选择STM32F401CCU开发板做INAV飞控移植

玩航模的朋友都知道,飞控是飞行器的"大脑"。我当初选择STM32F401CCU开发板来做INAV飞控移植,主要是被它的性价比打动了。这块开发板在某宝上20块钱就能拿下,比专门的飞控板便宜不少。而且STM32F401这颗芯片性能足够跑INAV飞控系统,主频84MHz,256KB Flash,64KB RAM,对于基础飞行控制完全够用。

不过说实话,最开始我也犹豫过。毕竟市面上常见的飞控板大多用的是STM32F405芯片,资源更丰富,社区支持也更完善。但去年芯片短缺那会儿,F405价格飞涨还经常断货,像我这种经常手滑烧板子的人,实在烧不起啊。F401虽然资源少点,但胜在便宜好买,而且经过合理裁剪的INAV固件完全能在上面跑起来。

这里要特别提醒新手朋友,选择开发板时一定要注意芯片封装。STM32F401CCU采用的是LQFP48封装,引脚数量适中,手工焊接难度不大。如果你选的是BGA封装的芯片,那焊接难度就直线上升了,没有专业设备很难搞定。

2. 硬件准备与电路设计

2.1 必备硬件清单

先给大家列个我的硬件配置清单,这些都是经过实测可用的:

  • STM32F401CCU开发板(核心板带最小系统)
  • MPU6050六轴姿态传感器模块(10元左右)
  • BMP280气压计模块(10元内)
  • BN-880 GPS模块(带电子罗盘)
  • TXS0108E电平转换模块(用于3.3V-5V电平转换)
  • 5V稳压模块(给外设供电)
  • 杜邦线若干(建议用不同颜色区分信号类型)

这里有个小技巧:买传感器模块时,尽量选择带排针的版本。这样用杜邦线连接时会更方便,也避免了自己焊接的麻烦。我最早买的几个模块都是裸板,焊接时不小心烫坏了一个MPU6050,白白浪费了十几块钱。

2.2 电路连接要点

传感器连接其实很简单,主要注意以下几点:

  1. I2C总线连接:MPU6050、BMP280和HMC5883L(BN-880内置)都挂在同一个I2C总线上。F401的I2C接口是PB6(SCL)和PB7(SDA),记得接上拉电阻(通常模块上已经集成)。
  2. GPS模块连接:BN-880的TX接开发板的RX(PA10),RX接开发板的TX(PA9)。注意GPS是5V电平,需要通过电平转换模块与开发板的3.3V电平匹配。
  3. PWM信号输入:接收机信号我接在PA0(TIM2_CH1),这是INAV默认的PPM输入引脚。如果你用PWM接收机,需要根据实际情况调整。

电源部分要特别注意:开发板的3.3V LDO通常只能提供几百mA电流,所有外设最好单独供电。我的方案是用一个5V稳压模块给外设供电,开发板单独供电,两者共地。

3. 软件环境搭建

3.1 开发工具准备

软件方面需要准备这些:

  • ARM GCC工具链(我用的是gcc-arm-none-eabi-8-2018-q4-major)
  • Make工具(Windows下可以用MinGW)
  • Git版本控制工具
  • STM32CubeProgrammer(烧录固件用)
  • INAV Configurator 2.5.2(配置飞控参数)

这里有个坑要注意:INAV新版本换了工具链,如果你不想折腾新工具链的安装和配置,建议跟我一样用2.5.2版本。我在尝试新版本时,光是解决工具链兼容问题就花了两天时间,最后还是退回2.5.2了。

3.2 获取INAV源码

直接从GitHub克隆INAV仓库:

git clone https://github.com/iNavFlight/inav.git cd inav git checkout release_2.5.2

然后创建一个新分支用于我们的修改:

git checkout -b FLYESF401_custom

我建议在修改前先编译一次原始代码,确保环境没问题:

make TARGET=OMNIBUSF4

如果编译成功,会显示Flash和内存的使用情况,并生成inav_OMNIBUSF4.hex文件。

4. 创建自定义目标板

4.1 复制目标模板

INAV支持自定义目标板配置,我们先复制一个现有配置作为模板:

cp -a src/main/target/OMNIBUSF4 src/main/target/FLYESF401

然后重命名相关文件:

mv src/main/target/FLYESF401/OMNIBUSF4.mk src/main/target/FLYESF401/FLYESF401.mk

现在执行make TARGET=应该能看到新增的FLYESF401目标了。不过这只是开始,接下来才是重头戏。

4.2 裁剪不必要的驱动

打开target.mk文件,你会看到一大堆驱动文件。我们需要根据实际硬件情况进行裁剪:

  1. 加速度计/陀螺仪:只保留mpu6050.c
  2. 气压计:只保留bmp280.c
  3. 罗盘:保留qmc5883l.c和hmc5883l.c(BN-880可能用这两种)
  4. 删除所有不用的驱动:比如max7456.c(OSD)、adc.c(我们没有用到的ADC功能)等

修改后的drivers列表大概长这样:

DRIVERS = \ drivers/accgyro/accgyro_mpu6050.c \ drivers/barometer/barometer_bmp280.c \ drivers/compass/compass_qmc5883l.c \ drivers/compass/compass_hmc5883l.c \ drivers/rx/rx_pwm.c

4.3 修改时钟配置

这是最容易出错的地方。F401CCU开发板通常使用25MHz外部晶振,而原配置是针对8MHz晶振的。我们需要修改stm32f4xx.h中的时钟配置:

#define HSE_VALUE 25000000

同时要调整PLL配置,确保最终主频不超过84MHz。我的配置是:

  • PLL_M = 25
  • PLL_N = 336
  • PLL_P = 4 这样得到的主频正好是84MHz(25MHz / 25 * 336 / 4)。

5. 引脚重映射与功能配置

5.1 引脚分配方案

F401的引脚与F405不完全相同,需要重新规划:

  • PWM输入:PA0 (TIM2_CH1)
  • I2C:PB6(SCL), PB7(SDA)
  • UART1:PA9(TX), PA10(RX) - 用于GPS
  • UART2:PA2(TX), PA3(RX) - 保留备用
  • LED:PC13 - 开发板自带LED

在target.c文件中,需要修改resourceMapping数组来反映这些变化:

resourceMapping_t resourceMapping[] = { { TIM2, IO_TAG(PA0), TIM_CHANNEL_1, 0 }, // PWM输入 { I2C1, IO_TAG(PB6), TIM_CHANNEL_0, 0 }, // SCL { I2C1, IO_TAG(PB7), TIM_CHANNEL_0, 0 }, // SDA // 其他引脚配置... };

5.2 外设初始化调整

由于F401的外设资源比F405少,需要关闭一些不用的外设初始化:

  1. 删除所有与SD卡相关的初始化(我们没有SD卡槽)
  2. 删除OSD相关代码
  3. 简化UART配置,只保留必要的1-2个串口

特别要注意的是定时器配置。F401的定时器数量有限,要确保PWM输入、电机输出等关键功能分配到合适的定时器上。我在这个环节踩过坑,错误配置导致PWM信号无法正常读取,调试了好久才发现是定时器冲突。

6. 固件裁剪与优化

6.1 功能裁剪策略

F401只有256KB Flash,必须精简功能:

  1. 禁用所有不用的飞行模式:保留ANGLE、HORIZON、RTH等基本模式
  2. 移除黑匣子功能(太占空间)
  3. 简化PID控制器,只用最基础的控制器
  4. 移除所有与多轴飞行器相关的代码(如果只用于固定翼)

在config.h中,可以通过定义来禁用功能:

#define DISABLE_BLACKBOX #define DISABLE_OSD #define DISABLE_MULTIROTOR

6.2 内存优化技巧

除了Flash空间,RAM也很紧张。几个优化方法:

  1. 减少PID和滤波器的窗口大小
  2. 降低传感器数据更新频率
  3. 精简调试输出信息
  4. 使用更小的数据类型(如用int16_t代替int32_t)

可以通过修改以下配置来节省内存:

#define ACC_WINDOW_SIZE 8 // 原值可能是16 #define GYRO_WINDOW_SIZE 8 #define BARO_WINDOW_SIZE 8

7. 编译与烧录

7.1 编译命令

完成所有修改后,就可以编译了:

make TARGET=FLYESF401

如果一切顺利,你会看到类似这样的输出:

Memory region Used Size Region Size %age Used FLASH: 235432 B 256 KB 89.81% SRAM: 45632 B 64 KB 69.61%

这说明我们的固件成功适配了F401的资源限制。

7.2 烧录方法

我推荐使用ST-Link烧录器,连接方式:

  1. SWDIO - PA13
  2. SWCLK - PA14
  3. GND - GND
  4. 3.3V - 3.3V(如果开发板没有单独供电)

烧录命令:

st-flash write obj/inav_FLYESF401.hex 0x08000000

如果没有ST-Link,也可以用串口DFU模式烧录,不过操作起来更麻烦一些。

8. 测试与调试

8.1 基础功能测试

烧录完成后,按这个顺序测试:

  1. 连接INAV Configurator,检查是否能正常连接
  2. 检查传感器数据:加速度计、陀螺仪、气压计、罗盘
  3. 测试接收机输入:摇动遥控器摇杆,观察通道数据是否变化
  4. 检查电机输出:通过电机测试功能,观察PWM输出是否正常

8.2 常见问题解决

我在测试中遇到过几个典型问题:

  1. 传感器无数据:通常是I2C地址不对或接线错误。用i2c扫描工具检查设备地址。
  2. GPS不定位:检查波特率设置(BN-880默认是9600),确认TX/RX没有接反。
  3. 飞行模式切换异常:检查模式配置和通道映射是否正确。

有个实用的调试技巧:在cli中输入"status",可以查看系统状态和错误信息,对排查问题很有帮助。

9. 飞行测试与参数调整

9.1 首次飞行准备

第一次飞行一定要做好安全措施:

  1. 在开阔无人的场地进行
  2. 先进行地面测试,确认所有控制面运动方向正确
  3. 设置失控保护(非常重要!)
  4. 准备随时切换到手动模式

9.2 PID调参建议

对于固定翼飞机,我的基础PID设置如下:

roll_rate = 50, 40, 20 pitch_rate = 50, 40, 20 yaw_rate = 50, -, 20

这些值需要根据实际飞行表现调整。建议先用小幅度机动测试,逐步增大动作幅度,观察飞机的反应。

10. 进阶优化方向

10.1 添加OSD支持

如果想增加OSD功能,可以考虑:

  1. 使用MAX7456芯片的OSD模块
  2. 修改代码重新启用OSD驱动
  3. 注意这会增加Flash和内存使用,可能需要进一步裁剪其他功能

10.2 支持更多传感器

F401的I2C接口还可以接更多传感器,比如:

  1. 空速计(如MS4525DO)
  2. 电流电压传感器(如INA219)
  3. 红外测距模块(用于自动降落)

添加新传感器需要:

  1. 在target.mk中添加对应驱动
  2. 配置I2C地址
  3. 在INAV Configurator中启用相应功能

经过这一整套流程,你应该已经成功在STM32F401CCU开发板上跑起了INAV飞控系统。虽然过程有些曲折,但看到自己改装的飞控带着飞机平稳升空的那一刻,所有的努力都值得了。

http://www.jsqmd.com/news/488703/

相关文章:

  • Python+Selenium实战:教你用自动化脚本搞定12306远程抢票(附邮箱交互技巧)
  • [无缝衔接3D工作流] 设计师与工程师的Rhino到Blender无损数据迁移方案
  • RK3576开发板ROS部署避坑指南:解决Ubuntu下5个最常见编译错误
  • Pi0开源机器人模型安全审计:代码漏洞扫描+第三方依赖风险评估
  • 插件管理的混沌困境:如何用ComfyUI-Manager构建AI创作的秩序引擎
  • apiSQL+GoView:从零到一构建高效数据大屏的实战指南
  • 软件工程学习必备:如何高效利用课后习题提升理解(附第四版答案)
  • Oracle|从进程句柄到数据重生:DBF文件误删的在线恢复实战
  • MogFace模型Claude Code协作编程:利用AI助手完成模型调用代码重构与优化
  • STM32F103RCT6基于CubeMX与XCP协议:从零构建openBLT BootLoader的工程实践
  • 避开这5个坑!用LoRA+SFT微调LLaMA-2的实战避坑指南
  • RimSort:开源环世界MOD管理效率提升解决方案
  • NBTExplorer:Minecraft数据编辑与修复的专业解决方案
  • 玩客云OneCloud刷机后必装!Docker安装与镜像源优化全攻略(附SSH连接技巧)
  • WeKnora产品文档系统:基于Vue3的前端界面开发指南
  • OBS多平台直播无缝整合:效能倍增的多平台推流技术解决方案
  • 立创开源DIY:基于STM32的多功能示波器音乐视频手表(ZHAO-Watch 2设)
  • 香橙派5分钟搞定Klipper固件刷写(2023最新避坑指南)
  • Phi-3-vision-128k-instruct开源生态:对接LangChain、LlamaIndex插件实践
  • Qwen2-VL-2B-Instruct在运维自动化中的应用:智能日志分析
  • TikTok双旋验证码实战:从算法原理到高性能API服务的工程化落地
  • 从BIOS到SSD:一文看懂ROM、RAM和FLASH在计算机系统中的实际应用
  • 通义千问2.5-0.5B实战案例:基于vLLM的高吞吐推理部署教程
  • Qwen3-14b_int4_awq镜像免配置:开箱即用的AWQ量化大模型Web服务体验
  • Phi-3-vision-128k-instruct行业落地:医疗影像文字描述生成实践
  • Win10蓝牙Link Key提取指南:绕过注册表权限的实用技巧
  • DIY智能家居必备:如何用Arduino和火焰传感器打造低成本火灾预警系统
  • AcousticSense AI效果展示:Pop与Electronic在中频段频谱纹理差异解析
  • 基于Carsim的轮胎侧偏刚度计算方法详解
  • 告别重复造轮子!用WorkfoxFormGenerator搭建企业级低代码表单平台(Vue 3/Element Plus)