将APM固件移植到自制硬件

本文为《无人机飞控固件开发教程》系列视频的辅助资料,已经在“网易云课堂”上线 , 链接:点我

无人机调试、飞控硬件定制、固件修改,日志分析,请QQ联系:3500985284


 本节课讲述如何将APM固件移植到自制硬件上面。从4.0版本之后,受益于软件框架的大幅优化,APM固件在不同硬件间移植变得非常简单,因此本节课比想象中的要简单许多。

 这节课我们将以“怒飞垂云-鹏心-通用型飞控”为例来给大家讲述具体操作,此飞控的原理图、规格书、使用说明等资料下载链接:https://gitee.com/junzixing/Hardware 怒飞垂云“鹏心”通用型飞控淘宝链接:点我

一、编写硬件描述文件

 在“ardupilot\libraries\AP_HAL_ChibiOS\hwdef”文件夹下面定义一个名称为你自己飞控硬件名字的文件夹,参考此文件夹下其他与你的硬件最接近的硬件的写法,修改出适合你的硬件的硬件描述文件。

 以“鹏心”飞控为例,在我的代码库中(链接),切换到“NFCY-Copter-4.0.5”这个分支后,你会在“ardupilot\libraries\AP_HAL_ChibiOS\hwdef”目录中发现“NFCYv5”文件夹,这就是“鹏心”飞控对应的硬件描述文件。文件夹中有三个文件:

  • hwdef-bl.dat:这个定义的是BootLoader程序对应的硬件描述,由于BootLoader只用到了很少一部分硬件外设,因此此文件内容明显比“hwdef.dat”少;
  • hwdef.dat:这个定义的是飞控程序对应的硬件描述,其中包含了STM32时钟配置,串口、SPI、IIC、CAN等接口配置,IMU芯片型号描述,PWM以及定时器配置等等关键信息。具体内容见视频教程(链接
  • defaults.parm:这个文件定义了针对此电路板的默认参数。比如默认不使用串口的流控制、电源电压检测的比例系数等。注意,此文件不是必须的,如果你没有哪些参数是特有的,可以没有这个文件。

 注意,上述三个文件的文件名是固定的(hwdef-bl.dat、hwdef.dat、defaults.parm),不能改为其他的名字。

 特别注意:从Copter-4.0.4版本开始,APM对硬件定义文件(hwdef)的部分格式进行了修改,因此Copter-4.0.4、Coper-4.0.5版本与Copter4.0.3的硬件定义文件内容略有不同,建议在Copter-4.0.5版本基础上修改自己的固件。

二、编译BootLoader

// 第一步,清理之前的编译中间文件,一定要清理一下,能避免很多奇怪的问题
./waf distclean

// 第二步,设置编译目标为针对你的硬件的BootLoader
./waf configure --board YourBoard --bootloader
// 注意,这里的“YourBoard”就是上面步骤中你自己新建的文件夹的名字,对于“鹏心”飞控,就是“NFCYv5”
./waf configure --board NFCYv5 --bootloader

// 第三步,编译BootLoader
./waf bootloader

 编译生成的BootLoader文件为“ardupilot\build\YourBoard\bin\AP_Bootloader.bin”。

 请大家注意一下几点:

 1、固定翼、多旋翼、无人车等使用的是同一个BootLoader,就像一台电脑使用一个BIOS(类比BootLoader),但是既可以装windows(类比多旋翼固件),又可以装Linux(类比固定翼固件)一样。因此即使你编译的是固定翼固件,也请尽量在Copter-4.0.7版本基础上编译BootLoader,毕竟这是经过我们验证过的;

 2、BootLoader的功能不像飞控固件一样进化很快,它基本上几年内也不会改一行程序,因此不必在Copter-4.1.x上死磕BootLoader,用Copter-4.0.7版本的即可。

三、刷BootLoader

 BootLoader编译完成后,就可以通过ST-link、Jlink、STM32专用烧写器等工具将BootLoader烧写到飞控里了(具体方法与下面第六步的方法类似)。只要BootLoader烧写成功,即使飞控中还没有烧写过飞控固件,就已经可以直接使用MissionPlanner通过USB烧写飞控固件了,不过需要遵循如下步骤

  1. 先不要通过USB连接飞控;
  2. 打开MissionPlanner,初始设置 -> 安装固件 -> 加载自定义固件 -> 选择前面编译的飞控固件“xxxx.apj” -> 等待5秒后弹窗“请拔下控制板,点击OK后再插入” -> 点击“OK” -> 立即通过USB连接飞控,然后你就会发现开始擦除飞控,然后开始烧写。(注意这一步的精髓在于:先点击“请拔下控制板,点击OK后再插入”小窗口中的“OK”按钮,再插入USB

四、为编译含BootLoader的固件做准备

 第三步中先刷BootLoader,然后通过MissionPlanner加载自定义固件的方法固然不错,但是不如用烧写器一次性地将BootLoader和飞控固件一起烧写到飞控中方便,为此,我们需要先进行如下步骤:

 1、按照本文第二段的方法生成针对你的硬件的BootLoader,将其复制到“ardupilot/Tools/bootloaders”文件夹下面,并重命名为“YourBoard_bl.bin”,以“鹏心”飞控为例,重命名为“NFCYv5_bl.bin”;

注意,你在前面将你的硬件命名为什么,此处就重命名为“该硬件名_bl.bin”,注意是“硬件名”后面加“_bl.bin”,不是“.bin”。

 2、安装“intelhex”python包;注意,如果你是2021年3月3日之后使用第一节课中我修改后的脚本文件建立的编译环境,这一步不需要做,因为那个脚本已经帮你按照好了“intelhex”python包。

pip2 install intelhex
pip3 install intelhex

五、编译飞控固件

// 第一步,清理之前的编译中间文件,一定要清理一下,能避免很多奇怪的问题
./waf distclean

// 第二步,设置编译目标为针对你的硬件的飞控固件
./waf configure --board YourBoard

// 第三步,编译飞控固件(此处以编译多旋翼固件为例),方法参考本课程课时3、课时4
./waf copter

 以多旋翼为例,编译完成后在“ardupilot\build\YourBoard\bin”文件夹下有“arducopter_with_bl.hex”文件,即为包含了BootLoader的飞控固件。而此文件夹下的“arducopter.apj”文件即为单纯的不含BootLoader的飞控固件,使用MissionPlanner加载自定义固件时用的就是这个。

六、同时刷BootLoader和固件

 需要将hex文件刷的STM32单片机中,我使用的是“正点原子Mini-Pro脱机下载器”,淘宝链接:链接。使用常用的Jlink、ST-Link也可以烧写,具体方法与之类似,请大家自行探索,搜索关键字“ST-Link 烧写 bin文件”即可。

七、使用MissionPlanner刷固件

 事实上,只要我们将BootLoader刷到飞控里之后(不管是单独刷的BootLoader还是刷的BootLoader与固件一体的文件都一样),就可以使用MissionPlanner给飞控刷固件了,具体方法请参考如下链接的第三部分:http://www.nufeichuiyun.com/?p=246

八、疑难解答

1、如下图所示,编译飞控固件时可以正常编译,但是编译BootLoader时报错“Permission denied”

 从程序输出来看,出错前调用的是“python3 ${SRCROOT}…”,但是提示的却是“/cygdrive/c/Users/xingz/AppData/Local/Microsoft/WindowsApps/python3: Permission denied”,程序调用路径跑出了cygwin64环境,直接去调用windows下面的python3了,然后非常尴尬地被windows拒绝了。

 实时上,我们在cygwin64环境内部已经安装了python3,但是名字不是python3,而是python3.6,从而程序调用python3时没有找到这个程序,就进一步去windows里找,然后被windows拒绝了。这个也很好解决,在cygwin64中创建python3.6的链接文件即可(类似于windows下的快捷方式,但有有所区别):

// 使用cd命令进入到cygwin64/bin文件夹下,我们安装在cygwin64环境内的python3.x就在这里面
cd /cygdrive/c/cygwin64/bin/

// 为python3.6文件创建名称为python3的链接文件,如果你的这个路径下面没有python3.6,但是有python3.7文件,那么就将下面的3.6换为3.7
ln python3.6 python3

 重新启动cygwin64,应该就可以编译了。

2、对于小容量单片机 ,固件放不下咋办?

 目前APM固件功能越来越多,体积自然也越来越大,对于Flash只有1M的单片机来讲已经放不下了,不过我们可以通过移除用不到的功能来减小固件体积,请参考如下链接进行操作:http://www.nufeichuiyun.com/?p=2461

 此外,还有一种方法是在“hwdef.dat”文件结尾加入如下代码,会自动屏蔽一些不常用的功能(仅限于Copter-4.3.x以上的版本)。

# minimal drivers to reduce flash usage
include ../include/minimal.inc

 不过很奇怪的是目前在源代码中并没有搜索到这个“minimal.inc”文件,估计这个文件会在编译的预处理阶段自动生成。


本文为《无人机飞控固件开发教程》系列视频的辅助资料,已经在“网易云课堂”上线, 链接如下:

https://study.163.com/course/introduction/1209568864.htm?share=1&shareId=1448054983

无人机调试,飞控硬件定制、固件修改,日志分析,请QQ联系:3500985284

京ICP备19049723号   |   京公网安备 11010502039327号