inav向STM32F401CCU开发板定制的过程(一)

写在前面的入魔小记

好些年没到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下载已经定制好的源码自己编译来用了。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…