muyichuan2012 发表于 2022-10-17 13:00

国产芯片飞控开源分享

本帖最后由 muyichuan2012 于 2022-10-18 09:06 编辑

国产芯片飞控开源分享

作者:二木山人经作者同意,本文转自B站:https://space.bilibili.com/29163672/video为什么移植BF2020年年底,从尘封的书架上翻到一本《飞行员知识手册》 一下子勾起了自己年少时的飞行梦,现在再投身飞行恐怕是晚了,玩玩模型吧。首先看的就是固定翼模型,模拟器、遥控器买了之后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 相差无几而且开发板价格爆贵, 这种确实也不太适合选择作为移植的对象。
经过综合对比、选择,最后雅特力的AT32F403AAT32F435/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 、at32f437vmt7at32f437vgt7

怎么把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 代码结构图 https://blog.csdn.net/github_37459410/article/details/126372389可以看到bf 代码呈沙漏型,中间的driver文件夹对上下层进行了抽象隔离,也便于bf 向各个mcu移植。 不过总体来说stm32 系列mcu 的结构变化不是很大,除了F7、H7 内存、DMA有部分的差异之外, 代码中夹杂着宏定义来实现1套代码不同target 打包
飞控制作视频专辑:二木山人B站主页:https://space.bilibili.com/29163672/video群友制作试飞成功@现代野人:https://www.bilibili.com/video/B ... id_from=333.999.0.0
国产芯片飞控升级4.3.1 同步优化https://www.bilibili.com/video/BV1WB4y1E7ZN?spm_id_from=333.999.0.0
详解第二版国产芯片飞控硬件https://www.bilibili.com/video/BV1fd4y1B7zE?spm_id_from=333.999.0.0
新飞控首飞https://www.bilibili.com/video/BV16T411F7VQ?spm_id_from=333.999.0.0
国产芯穿越机飞控https://www.bilibili.com/video/BV1Ld4y1d7TX?spm_id_from=333.999.0.0
开源资料由于资料是处于持续更新中,建议到如下地址下载硬件相关:https://oshwhub.com/pdwdw/at32f437固件等其他:可加入BF飞控移植自制交流群下载,QQ群号:428787190

CJQ_ENJOY 发表于 2022-10-18 12:42

不错

XIVN1987 发表于 2022-11-1 10:38

厉害。。

软核硬核 发表于 2022-11-3 17:05

软件代码开源吗?

软核硬核 发表于 2022-11-3 17:06

大佬总是无处不在,还没真正玩过四轴飞行器呢。

豌豆爹 发表于 2022-11-8 14:37

就凭我这技术看了也不知道能不能diy一个

james03 发表于 2022-11-9 17:28

厉害的楼主,也是无私的楼主

瞎折腾 发表于 2022-12-5 11:19

楼主上心了啊

weifeng90 发表于 2022-12-6 19:15

感谢大佬的分享,先收藏资料了。

macpherson 发表于 2023-1-5 12:25

AT32F403A是否带有硬件处理器?

i1mcu 发表于 2023-1-5 13:20

之前用st的试过,不知道AT的怎么样

macpherson 发表于 2023-1-5 14:36

这个可以pin2pin替换掉吗?

modesty3jonah 发表于 2023-1-5 15:44

140Mhz的频率,处理数据的速度翻了一般了。

mnynt121 发表于 2023-1-5 17:03

这个的性能怎么样?            

mickit 发表于 2023-1-5 17:33

四旋翼的设计都是开源的,网上有很多的资料。

uptown 发表于 2023-1-5 18:10

这个不错,新颖的设计。            

uiint 发表于 2023-1-6 12:26

现在的国产芯片针对太多了。            

sesefadou 发表于 2023-1-6 13:38

这个容易收到电机的干扰的吗?            

hearstnorman323 发表于 2023-1-6 14:18

怎么才能把芯片的芯片降低下来?            

vivilyly 发表于 2023-1-6 14:46

AT32做的东西比较高端了。            
页: [1] 2
查看完整版本: 国产芯片飞控开源分享