写在前面的入魔小记
好些年没到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的,由于两个芯片的封装、引脚定义、内部功能都有差异,就算编译出来,烧录到STM32F401上,也是运行不起来的。
差异表现在:
引脚定义不一样,需要针对数据手册改。
内部定时器数量不一样,也需要对应调整代码。
外接的总线数量也不一样,不过这里只用一个I2C来串接三个传感器,所以不重要。
重点:时钟晶振频率也不一样,F4V3用的是8MHz的晶振,F401用的是25MHz的晶振,按原有的初始化代码,直接超出了F401能跑的84MHz内部主频。
重点:片内FLASH容量不一样,F405有1MB的FLASH,而F401只有256K的FLASH,布局也不一样。芯片内的flash一定放不下F4V3的固件。
整个过程还有很多坑要踩,最终砍掉了所有不相关的功能:SD卡支持、OSD支持、仪表台、各种非PWM的电调协议、固定翼自动降落功能、可调节图传频道与功率等等,才勉强在256K的FLASH空间里放下了需要的功能。
之后的定制过程待续,如果只是想直接拿来用,可以直接去github下载已经定制好的源码自己编译来用了。