固件编译&刷写

  • 本章介绍如何编译&刷写FMT固件至飞控硬件中。更多的信息,可以参考FMT用户手册

    提示:

    FMT的下载需要用到硬件中的bootloader并且不会破坏已有的bootloader,所以在刷写了FMT固件后,可以轻松刷回PX4或者APM固件。

下载工具链

  • 如果是第一次编译FMT,在编译前需要做些准备工作,比如下载编译器、构建工具以及配置环境变量等。总的来说,FMT的编译环境配置还是非常简单的。

    提示:

    FMT支持在Linux,Windows或者Mac OS下编译,这里仅以Linux为例,其它系统类似。

    首先下载如下编译工具链

  • 编译器: arm-none-eabi- toolchain: 版本: 7-2018-q2-update.

  • 构建工具: Scons: 可以使用 pip3 install SCons 来安装 scons. 然后将scons的路径加入到系统Path环境变量中.

  • STM USB Driver: STM32 USB Driver: 仅针对Windows平台需要下载。

    下载安装完工具链后,需要配置环境变量将编译器和构建工具的路径加入到系统路径中,比如:

    export RTT_EXEC_PATH=/usr/local/bin/gcc-arm-none-eabi-7-2018-q2-update/bin
    export PATH=/usr/bin/scons:$PATH
    

    笔记:

    可以将环境变量配置的指令加入到系统启动脚本中,如~/.bashrc,这样便不用每次开机都需要配置一遍。

编译固件

  • 针对Pixhawk以及其衍生的硬件,包含两颗MCU,主处理器FMU以及协处理器IO。所以FMT针对两颗MCU有分别的固件,fmt_fmu和fmt_io,需要分别编译和下载。

    fmt_io通过fmt_fmu来间接下载,所以我们需要先下载了fmt_fmu固件后,再来下载fmt_io。

    首先编译fmu固件,我们进入到目标板对应的target目录,然后输入如下指令:

    cd FMT-Firmware/target/cuav/v5_plus/
    scons -j4
    

    编译完成后如下所示,将在build目录下生成我们需要的固件。

    arm-none-eabi-objcopy -O binary build/fmt_cuav-v5.elf build/fmt_cuav-v5.bin
    arm-none-eabi-size build/fmt_cuav-v5.elf
    text	   data	    bss	    dec	    hex	filename
    656704	  27496	 121600	 805800	  c4ba8	build/fmt_cuav-v5.elf
    scons: done building targets.
    

    下面我们编译io固件,类似的,进入到io的目录,然后输入如下指令:

    cd FMT-Firmware/target/pixhawk/fmt-io/project
    scons -j4 
    

    编译完成后如下所示,将在build目录下生成io的固件。

    arm-none-eabi-objcopy -O binary fmt_io.axf build/fmt_io.bin
    arm-none-eabi-size fmt_io.axf
    text	   data	    bss	    dec	    hex	filename
    16680	    160	   4952	  21792	   5520	fmt_io.axf
    scons: done building targets.
    

刷写固件

  • 当前支持3种方式来刷写FMT固件,按复杂程度从易到难分别为:
  • 使用python脚本下载

    首先执行对应目标硬件平台目录下的uploader.py,然后通过USB将飞控连接到电脑上。在检测到飞控连接后,将自动开始下载,如下所示:

    ~/FMT-Firmware/target/cuav/v5_plus$ python3 uploader.py 
    waiting for the bootloader...
    Auto-detected serial ports are:
    Not found fmt_fmu,please connect fmt_fmu!
    Not found fmt_fmu,please connect fmt_fmu!
    Not found fmt_fmu,please connect fmt_fmu!
    
    Found board id: 50,0 bootloader version: 5 on /dev/serial/by-id/usb-3D_Robotics_PX4_BL_FMU_v5.x_0-if00
    sn: 0021001c3438510636363539
    chip: 10016451
    family: b'STM32F7[6|7]x'
    revision: b'Z'
    flash: 2064384 bytes
    Windowed mode: False
    
    Erase  : [====================] 100.0%
    Program: [====================] 100.0%
    Verify : [====================] 100.0%
    Rebooting. Elapsed Time 6.803
    
  • 使用QGC地面站下载

    打开QGC地面站,选择Firmware Setup界面,通过USB连接飞控,将弹出下载界面。如下所示,选择Advanced Settings->Custom firmware file, 然后选择编译好的固件build/fmt_cuav-v5.bin进行下载。

  • 使用JLink下载

    前两种方式需要用到硬件上的bootloader,而通过JLink下载则不需要,必要时,也可以通过JLink来更新硬件上的bootloader(有风险,需谨慎)。JLink的具体方式请参考FMT的用户手册

    在下载完fmu的固件后,用USB连接飞控,正常的话应该能看到飞控的呼吸灯开始闪烁。打开QGC地面站将自动连接上飞控。如下所示:

    下面需要将fmt_io的固件上传到飞控的SD卡中。我们首先点击QGC左上角的Widgets->Onboard Files,将弹出对应窗口。然后点击List Files将列出飞控上所有的文件/文件夹信息。这里我们选中usr文件夹,然后点击Upload Files上传刚刚编译好的fmt_io.bin至飞控的usr目录,如下所示:

    上传完成后,再次点击List Files将看到我们刚上传的io固件已经出现在usr目录下,如下图所示:

    下一步我们切换到QGC的Mavlink Console页面,敲击两次回车,将看到飞控的控制台输出,我们在控制台输入指令fmtio upload usr/fmt_io.bin,通过fmu下载刚刚上传的io固件。如下所示io固件下载成功:

    提示:

    若是第一次下载fmt_io固件,在输入fmtio upload指令后将返回sync error的错误。这是正常的,因为此时io芯片还没有fmt io的固件,故不能响应fmu发出的重启指令,所以无法进入bootloader从而开始io固件的下载。所以对于这种情况,我们需要连接GPS模块,按住GPS模块上的Safety安全开关按钮,然后给飞控上电。这时候io芯片将驻留在bootloader,然后我们再输入fmtio upload指令则可以正常下载。

    当io固件下载成功后,我们可以输入fmtio hello指令,若看到有返回值,则说明io固件运行正常,如下所示:

    msh />fmtio hello
    msh />[IO]:Hello, this is FMT IO!