打印
[应用相关]

国产芯片飞控开源分享

[复制链接]
3666|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
muyichuan2012|  楼主 | 2022-10-17 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 muyichuan2012 于 2022-10-18 09:06 编辑

国产芯片飞控开源分享


作者:二木山人
经作者同意,本文转自B站:https://space.bilibili.com/29163672/video
为什么移植BF
2020年年底,从尘封的书架上翻到一本《飞行员知识手册》 一下子勾起了自己年少时的飞行梦,现在再投身飞行恐怕是晚了,玩玩模型吧。首先看的就是固定翼模型,模拟器、遥控器买了之后5边练习纯熟,发现自己身处的帝都要想找块场地起降固定翼基本不可能,这时候想起来13年的时候看到的四轴飞行器竞速赛, 穿越机又重回了视角。 在组装了一架5寸之后,意犹未尽,正好这时候身边一位朋友魏哥在自制F405、F722 的飞控,了解了初步的原理之后,自己用F411 开发版+ MPU6500 模块+自制OSD模块、电源模块等,先飞线拼了一个“飞控”出来并试飞成功。 这次拼装打开了我对穿越机飞控的大门,从此深陷飞控大坑,买了STM32开发相关的书籍自学MCU知识、阅读BF 的源代码。。。。。

2021年适逢STM32 系列MCU 价格大涨, 飞控价格也从百十元翻番,国产MCU 也百花齐放,难道这么多“32” ,就一个也没有能拿来替代的? 肯定有, 甚至有代码都不用修改的GD、APM 系列、自己独创度比较高的HD系列等。选来选去,目标定在了高频、便宜、IO丰富的雅特力芯片上,首先盯上的是AT32F403A, 和STM32F103 外设一样代码无需修改即可运行,但是觉得不彻底,就定上了 2021年8月份雅特力新上市的 AT32F437 系列, 大Flash、高频率、丰富IO 都很合适,预估不会比F405 差,于是启动了使用AT-BSP 库全面移植、重写BF底层驱动的目标。


选择国产芯片,一方面是想降低飞控的价格,让各位模友降低费用,另外一方面也是想着在过程中对比、学习MCU 的开发知识,以实际项目促进自己的学习,事实证明这确实是一条学习的捷径,使我快速了解了ST、AT 两套MCU 的基础知识,也掌握了BF 的代码结构,因此整理了整个移植过程,希望能够给其他同好留下一些线索,给自己做一次系统的知识总结。

MCU 的选型与IO 性能评估
针对一款飞控的mcu进行选型,需要综合考虑多重问题,比如在之前的选择中,曾经对比、评测过 esp32、联盛德W806、树莓派Pico、合宙105 、gd32f407等多种mcu,这些mcu的频率、flash大小、内存架构、外设架构、外设情况等,具体如下表

mcu 选型表
表格太大,可访问表格原地址查看:https://www.bilibili.com/read/cv18935442?spm_id_from=333.999.0.0

以上表格并未做完数据,但是重点需要考虑的因素有:

1、系统计算能力,主频在140mhz 以上(对比f405)

2、系统内存在 128kb 以上,flash在 512kb 及以上,如果是spi集成外部flash,执行效率会下降2-3倍,需要在主频上找

3、外设丰富程度,SPI 总线数量在2个以上(1 IMU 1OSD+blackbox),支持至少6路PWM输出,定时器数量额是主要考虑对象,在所有的选择里面,外设的丰富程度、速度、数量是首要选择部分。

4、资料丰富性: 相关用户手册、DATASHEET    是否清晰、完备,是移植工作重要考虑因素,如果资料不易获得,甚至需要签保密协议才可以获取,这种的芯片坑太多了,而且后期遇到硬件问题,必须找厂家支撑的时候基本是不可能支撑你这个人用户的。比如合宙的air105就属于这种情况, 基本无法获取c开发库的任何资料,即便是比较合适也只能放弃。

5、价格:必须得比当前的F405 价格低,而GD32系列因为可以平替对应的STM32,甚至代码都不需要做大的调整,确实是比较适合用来做替代的但是在淘宝上的售价和stm32 相差无几而且开发板价格爆贵, 这种确实也不太适合选择作为移植的对象。

经过综合对比、选择,最后雅特力的AT32F403A  AT32F435/7  这三款芯片是比较适合选择作为移植的对象,具体情况是 :

主频:240Mhz、288Mhz ,内存128KB-512Kb可调, 确实在所有一众国产芯片中拔得头筹, 即便是 at32 也存在flash 读写效率低的问题,但是通过较大的可调内存,通过调小内存将代码全部 load 到内存ZW(零等待区,CPU取指不需要等待,flash区需要等待 2-4个cpu 周期)方式,可以取得较好的执行效率

外设丰富程度:外设的数量、速度基本满足bf的需求 : 无论是spi、i2c、定时器还是adc都绰绰有余,当然at32 也存在短板,比如 spi的频率最高只有36Mhz 虽然在读取w25q128 黑匣子flash 导出飞行记录的时候速度会慢一些,但是对于OSD和 IMU 的通信已经绰绰有余。

资料丰富程度: at32 的相关开发资料相当丰富, 虽然赶不上stm32 的准确、清晰易懂,但是在一众国产芯片里也算是例程充足、文档完整了。当然at32也存在一些文档上的bug和瑕疵,但是官方更新的相当快。

价格:at32 的价格在15-22块之间,而且淘宝上可以直接买到。方便后期DIY 用户直接购买。

最后,是选择 403a  还是选择 最新的435/7 ?

既然是移植,就没必要使用性能第二的403a、虽然403a 价格便宜很多,差不多10块钱1片,但是本次移植不为商业利益,更是一种自己的学习挑战,所以选择了最新的at32 f437 作为移植目标。

目前已经支持的 AT32F435 、at32f437vmt7  at32f437vgt7


怎么把Betaflight 从STM32 移植到 AT32 系列 --大纲
经过接近5个月的努力,已经将betaflight 4.3.0 -rc2 从stm32 移植到 雅特力at32F437Zmt7,开发板已经对功能初步验证通过, 协同另外一个朋友(N.T.Jia)正在制作原型飞控板进行试飞验证。趁这段时间开一个坑,总结一下怎么把bf 移植到非STM32 系列的MCU上,以及遇到了哪些坑、怎么进行优化,以及后继如何对bf 固件进行定制等话题。
计划大纲(内容分批撰写):
  •    0. 序:为什么移植BF
第一章: 移植的准备工作

  • 从上而下看BF 对代码结构
  • MCU 的选型与IO 性能评估
  • bf 的Makefile 体系与移植
  • 编译环境的搭建

第二章:BF代码基础移植工作
  • 时钟树:MCU 的总动脉
  • RCC : RCC 与CRM 总闸开关
  • GPIO :点亮一盏灯,Step1 验证
  • DMA : 内存搬运工
  • TIMER : 计时器基础的PWM输出 第二次点亮灯
  • EEPROM :Flash 模拟EEprom 以及配置信息存储

第三章: BF数据总线、通讯部分移植   
  •   bus 、SPI、I2C
  • Serial、Usart、4Way Esc
  • Serial USB VCP
  • 点亮陀螺仪、气压计、磁力计、接收机、地面站通信

第四章: BF与ESC 通信部分移植
电调常见通信方式: PWM、Dshot、双向Dshot、Proshot
  • PWM 移植与验证(oneshot 、Multishot)
  • 硬件定时器实现Dshot (ProShot) 原理、移植、与验证
  • Dshot-bitBang 原理、移植、与验证
  • ESC Bhelis-32 验证

第五章: 系统启动优化与性能优化
  • 重新回到启动文件
  • 内存大小与ZW区调整
  • 内存RAM 分区调整

第六章: 雅特力的硬件局限性
  • TIMER 与DMA 中断问题与解决思路
  • DMA 性能瓶颈问题与解决思路

第七章: 原型飞控板的设计与制作

第八章: 测试、试飞 与调整优化。

第九章 : 后记  

betaflight 代码结构
betaflight 的代码结构主要如下, 整体上我们移植需要关注的是 src/main/drivers 文件夹下的驱动,其他文件夹各自用途标注

+---docs        -- bf 的文档文件夹,包括如何设置、搭建编译环境等,如果英语不太差建议多读
+---lib        -- MCU 以及引用的一些外部lib 文件,mcu 的驱动库比如HAL、at32 的bsp放这里

|   +---main
|   |   +---AT32F43x
|   |   +---BoschSensortec
|   |   |   \---BMI270-Sensor-API
|   |   +---CMSIS  --- ARM 核心的驱动,必须要
|   |   +---dyad
|   |   +---google   --google的glc序列化协议
|   |   \---MAVLink  --mavlink 数传协议
|   \---test            -- 自动化单元测试用例
+---make             -- makefile 的主要文件夹, 包括target引入、特定MCU 的编译链接配置等, at32 需要新建一个 makefile文件
|   \---mcu
+---src        --主要源代码文件夹
|   +---link    -- gcc 的ld 文件夹,主要声明程序的内存、flash布局,需要根据mcu 仔细调整, 声明内存起始、flash起始、程序的 bss、ess 等段声明,bf 的配置数据管理体系 PG (flash 模拟eeprom )重点在这里。F4的重启到bootloader 也是在这里

+---main
|   |   +---blackbox      黑匣子代码
|   |   +---build             构建的一些设置
|   |   +---cli                bf 地面站的cli 功能实现
|   |   +---cms             OSD 设置菜单的实现
|   |   +---common        通用配置文件
|   |   +---config            读写config 的配置
|   |   +---drivers            驱动层 ,mcu和传感器的驱动代码,移植的代码主要在这里
|   |   |   +---accgyro        加速度计与陀螺仪,基本不需要修改
|   |   |   +---accgyro_legacy   “史前”古老的加速度计和陀螺仪
|   |   |   +---barometer        气压计驱动
|   |   |   +---compass            罗盘驱动
|   |   |   +---rangefinder        遥控测试用的
|   |   |   \---rx             所有接收机的驱动,包括elrs、cc2500 、sbus 等,大部分不需要移植,ppm 、elrs 用到timer 需要修改
|   |   +---fc                init、飞控核心代码无需移植

|   |   +---flight            飞行状态代码,无需移植
|   |   +---io                对于输入输出的抽象代码,不需要修改
|   |   |   \---asyncfatfs
|   |   +---msc            U盘模式,需要移植
|   |   +---msp            bf configuator 和bf 串口配置通信的协议,无需移植
|   |   +---osd            OSD 的抽象层无需修改
|   |   +---pg               配置信息读写库,无需修改
|   |   +---rx                接收机上层代码,无需修改
|   |   +---scheduler    核心调度器,无需修改
|   |   +---sensors        传感器抽象代码,无需修改
|   |   +---startup          mcu 启动初始化代码,需要根据mcu配置 startup.s ,修改初始化静态变量、预加载内存变量等部分
|   |   +---target            硬件目标配置信息,需要根据板子自己定义
|   |   |   +---AT32F437DEV  本次移植用的开发板target.h target.c target.mk 文佳
|   +---test        --单元测试代码
|   |   \---unit
|   |       \---timer_definition_unittest.include
|   |           +---drivers
|   |           \---pg
|   \---utils            --工具代码无需修改
\---unified_targets        --统一化的固件配置信息,无需修改
    \---configs

整体上代码的结构,可以看下

可以看到bf 代码呈沙漏型,中间的driver文件夹对上下层进行了抽象隔离,也便于bf 向各个mcu移植。 不过总体来说stm32 系列mcu 的结构变化不是很大,除了F7、H7 内存、DMA有部分的差异之外, 代码中夹杂着宏定义来实现1套代码不同target 打包

飞控制作视频专辑:
二木山人B站主页:
https://space.bilibili.com/29163672/video
群友制作试飞成功@现代野人:

国产芯片飞控升级4.3.1 同步优化

详解第二版国产芯片飞控硬件

新飞控首飞

国产芯穿越机飞控

开源资料
由于资料是处于持续更新中,建议到如下地址下载
固件等其他:可加入BF飞控移植自制交流群下载,QQ群号:428787190


使用特权

评论回复
沙发
CJQ_ENJOY| | 2022-10-18 12:42 | 只看该作者
不错

使用特权

评论回复
板凳
XIVN1987| | 2022-11-1 10:38 | 只看该作者
厉害。。

使用特权

评论回复
地板
软核硬核| | 2022-11-3 17:05 | 只看该作者
软件代码开源吗?

使用特权

评论回复
评论
muyichuan2012 2022-11-3 17:38 回复TA
开源, 帖子后面有获取源码方式。 
5
软核硬核| | 2022-11-3 17:06 | 只看该作者
大佬总是无处不在,还没真正玩过四轴飞行器呢。

使用特权

评论回复
6
豌豆爹| | 2022-11-8 14:37 | 只看该作者
就凭我这技术看了也不知道能不能diy一个

使用特权

评论回复
7
james03| | 2022-11-9 17:28 | 只看该作者
厉害的楼主,也是无私的楼主

使用特权

评论回复
8
瞎折腾| | 2022-12-5 11:19 | 只看该作者
楼主上心了啊

使用特权

评论回复
9
weifeng90| | 2022-12-6 19:15 | 只看该作者
感谢大佬的分享,先收藏资料了。

使用特权

评论回复
10
macpherson| | 2023-1-5 12:25 | 只看该作者
AT32F403A是否带有硬件处理器?

使用特权

评论回复
11
i1mcu| | 2023-1-5 13:20 | 只看该作者
之前用st的试过,不知道AT的怎么样

使用特权

评论回复
12
macpherson| | 2023-1-5 14:36 | 只看该作者
这个可以pin2pin替换掉吗?

使用特权

评论回复
13
modesty3jonah| | 2023-1-5 15:44 | 只看该作者
140Mhz的频率,处理数据的速度翻了一般了。

使用特权

评论回复
14
mnynt121| | 2023-1-5 17:03 | 只看该作者
这个的性能怎么样?              

使用特权

评论回复
15
mickit| | 2023-1-5 17:33 | 只看该作者
四旋翼的设计都是开源的,网上有很多的资料。

使用特权

评论回复
16
uptown| | 2023-1-5 18:10 | 只看该作者
这个不错,新颖的设计。              

使用特权

评论回复
17
uiint| | 2023-1-6 12:26 | 只看该作者
现在的国产芯片针对太多了。              

使用特权

评论回复
18
sesefadou| | 2023-1-6 13:38 | 只看该作者
这个容易收到电机的干扰的吗?              

使用特权

评论回复
19
hearstnorman323| | 2023-1-6 14:18 | 只看该作者
怎么才能把芯片的芯片降低下来?              

使用特权

评论回复
20
vivilyly| | 2023-1-6 14:46 | 只看该作者
AT32做的东西比较高端了。              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

150

主题

1733

帖子

24

粉丝