入魔小记写在前面
好些年没到CSDN来记事吧。疫情来临的那一年,呆在家里真的很无聊。幸运的是,郊区没有人在乎空旷的地方,所以我买了一个KT板机和自稳飞控接收机开始玩固定翼。然后换了FS的一代神控i6.开源(山寨)F4V3S飞控慢慢进入魔法。
开始定制的原因:
因为记性不好,经常接错电源线。手里烧的飞行控制不是十块,而是七八块。本来,再买一次。结果,今年不知怎么的,芯片短缺引发,卖家买不到STM32F405,直接让连价格都没涨就断货了,想再烧几块,怕没有电装去飞场,就动了定制到其他板上的心思。
材料:
主控STM32F401CCU开发板,某宝买的,不到20大洋。
MPU6050六轴姿态传感器模块,不到10元。
BMP280大气压力传感器模块,贵10多元,便宜10元。
BN-880带罗盘的GPS模块(GNSS),原来有的。
TXS0108E电平转换模块(人懒,可以用模块解决,不要用三极管解决)不到5元。
目标:可实现固定翼模型飞行的自稳定控制(也应实现多轴飞机),并可基于GPS返航就好。
动手过程:
首先跑去github从inav将源码仓库分叉到自己手中:https://github.com/afilez/inav
然后切到了release_2.5.2分叉,分叉2.5.2-patch分叉后,代码在上面更改。
之所以选择2.5.2版本,因为我只有现成的下载交叉编译工具链环境,新版本改为更新的交叉编译工具链,必须经过漫长的下载过程,不想再来,我手中的配置工具 inav configurator也是2.5.2版的。
在开始定制之前,当然环境至少可以编译一个固件:
make TARGET=
我可以列出目前支持的飞行控制板目标,我最初使用它OMNIBUSF4.所以先试着编译OMNIBUSF4的固件。
make TARGET=OMNIBUSF4
一通编译链接之后,显示FLASH在使用内存空间时,输出输出hex文件了。
第一步,创造自己的target环境来了,这个target就先叫做FLYESF401吧。
cp -a src/main/target/OMNIBUSF4 src/main/target/FLYESF401
重命名main/main/FLYESF401/OMNIBUSF4V3.mk为main/main/FLYESF401/FLYESF401.mk
删除其他不必要的mk文件了。
这时候再次make TARGET=
就看到新的target了。
当然,这还是F4V3S毕竟,使用的固件只是复制环境。
第二步,修改main/target/FLYESF401/target.mk,修改这个板子要附加的源文件,可以看到里面有很多传感器驱动,MPU只留下你想要的,里面没有MPU6050,所以要加一行:
drivers/accgyro/accgyro_mpu6050.c\
其它的,明显不需要的罗盘驱动就删了,不需要的除BMP280以外的气压计驱动也被删除,只留下罗盘BN-880可能用到的QMC5883L或HMC5883L就够了。
暂时不需要OSD支持(MAX7456需要贴片焊,没有现成的开发模块),所以
drivers/max7456.c
也删掉了。
此时,您可以尝试编译和生成一次HEX文件,应用FLASH空间应该比原版小。
还是基于这里STM32F405RGT6 MCU是的,由于两个芯片的包装、引脚定义和内部功能不同,即使编译并燃烧STM32F在401上,也不能运行。
差异表现在:
引脚定义不一样,需要针对数据手册改。
内部定时器数量不同,代码需要相应调整。
外部总线的数量也不同,但这里只有一条I2C串联三个传感器并不重要。
重点:时钟晶振频率不同,F4V3用的是8MHz的晶振,F401用的是25MHz根据原始初始化代码,晶振直接超过F401能跑的84MHz内部主频。
重点:片内FLASH容量不同,F405有1MB的FLASH,而F401只有256K的FLASH,布局也不一样。芯片内部flash一定放不下F4V3的固件。
在整个过程中还有许多坑要踩,最终切断了所有不相关的功能:SD卡支持、OSD支持、仪表板、各种非PWM在256年,电调协议、固定翼自动降落功能、可调图传输频道和功率等。K的FLASH所需的功能放在空间中。
之后的定制过程即将继续。如果只是想直接用,可以直接用github下载自己编译的定制源代码。