AcmeIot-2-基于PX4硬件的Nuttx开发环境

这一篇我们聊一下如何搭建使用PX4硬件的Nuttx的系统开发环境,这里我们脱离PX4的软件框架,单独搭建Nuttx的开发环境,使用Nuttx的make进行编译,并在Nuttx系统上编写应用程序。

搭建开发环境

前几年玩Nuttx的话搭建Nuttx的开发环境还是有点麻烦的,对新手不是很友好,这两年Nuttx加入apache开源基金会后,文档上有一些完善,提供了比较全面的入门教程,开发环境按照官方文档就没有什么问题,以下是官方文档:

https://nuttx.apache.org/docs/latest/quickstart/install.html

开发环境主要包括及部分

  • 依赖库安装

  • 配置工具安装

    KConfig在ubuntu20上有包可以直接安装,在20版本之前的系统上需要手动编译,按照步骤来即可,当然很可能会出现编译错误,这里之前整理了遇到的问题,如果有需要可以在我的公众号回复 Nuttx配置环境 获取,太长了不在这里展开。

  • 安装编译工具链

    对于stm32或者其他arm-m内核的单片机的工具链和PX4中使用的是一致的,可能不需要单独安装。如果要开发其它内核的单片机,可能需要单独安装对应的工具链,比如esp32,可以参考 这一系列的上一篇文章

  • 下载Nuttx源码

    源码包括两部分,一部分是系统源码,另外一部分是App仓库。

    App仓库是基于Nuttx的一些应用程序组件或者示例应用,这里面的程序都可以参考,去编写自己的应用程序,比如串口读写操作、socket操作、任务线程创建等等。

    当然里面也有一些第三方组件的支持,比如图形UI组件 LVGL。

生成配置文件

Nuttx目前支持非常多的芯片和开发板,demo配置在nuttx/boards目录下,可以找到自己使用的开发板配置,比如常用的stm32f4开发板 nuttx/boards/arm/stm32/stm32f4discovery,在这个目录下的configs下放置了很多编译配置文件

.
├── configs
│   ├── canard
│   ├── cxxtest
│   ├── ipv6
│   ├── netnsh
│   ├── nsh

在nuttx根目录下运行./tools/configure.sh脚本

cd nuttx
./tools/configure.sh -l stm32f4discovery:nsh

该操作的目的是使用configs目录下nsh配置文件defconfig生成根目录下的.config文件,用于对系统进行配置

配置

创建了配置文件后,可以直接make,目前的系统已经由./tools/configure.sh按照stm32f4discovery/configs/nsh/defconfig文件配置完成。

当然也可以基于当前配置修复配置

cd nuttx/
make menuconfig

执行该指令后会调用上面安装的KConfig工具,进行图形化的配置,可以重新配置Nuttx使用的mcu、mcu开启的外设(串口、spi、gpio、iic、usb等)、系统组件、系统应用等等。

编译

配置完成后直接make即可完成编译,编译完成会在根目录下创建.bin的目标文件,即可进行烧录

PX4硬件的Nuttx配置

很多同学手上由PX4的飞控,也可以用于玩Nuttx的系统开发,它有丰富的外设接口和集成传感器,如果想深入学习Nuttx和飞控底层开发,基于PX4的硬件和Nuttx的系统,写一个简单的飞控程序也是学习飞控非常好的方式,自己动手写和只是看代码很多遍收获是不一样的。

使用PX4的硬件的方法简单讲分为几步,以PX4 fmu-v2版本,stm32f427单片机为例:

  • 创建board目录

    这里可以参考nuttx/boards/arm/stm32/stm32f4discovery,里面包括

    • configs:编译配置文件,可以仅保留nsh一个配置
    • src:系统底层外设的配置文件,Nuttx底层驱动调用这些文件完成外设的定制化配置,比如spi、sd卡、iic等外设的io配置,这里需要根据PX4的io定义做一些调整
    • include:主要就是board.h文件,包括一些系统底层需要的宏配置
    • scripts:链接脚本文件,基本不用修改直接使用即可

    这里可以参考PX4/boards/px4目录下的文件,这是px4对nuttx的底层配置文件,不过不能直接移植使用,因为里面调用了很多px4的头文件和类。

  • 创建.px4固件

    为了将nuttx生成的bin固件通过px4的boot写入PX4硬件中,需要生成px4格式的固件,这里我们可以参考PX4项目中自带的格式转换工具

    PX4/Tools/px_mkfw.py,并参考platforms/nuttx/CMakeLists.txt中调用方式:

    ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/px_mkfw.py
    --prototype ${PX4_SOURCE_DIR}/boards/${PX4_BOARD_VENDOR}/${PX4_BOARD_MODEL}/firmware.prototype
    --git_identity ${PX4_SOURCE_DIR}
    --parameter_xml ${PX4_BINARY_DIR}/parameters.xml
    --airframe_xml ${PX4_BINARY_DIR}/airframes.xml
    --image ${PX4_BINARY_DIR}/${PX4_BOARD}.bin > ${fw_package}
    

    当然这里只是一个参考,需要修改px_mkfw.py去掉一些没有的内容,比如parameters.xml和airframes.xml,是PX4需要的文件,而Nuttx项目中不包含。这里还是会有一些坑,不过怎么能难倒身为开发爱好者的同学们呢。

  • 烧录固件

    生成了.px4固件以后,我们就可以使用px4的固件烧写脚本,和正常的px4固件一样写入飞控了,直接调用PX4/Tools/upload.sh

好了,这就是基本的步骤了,如果对Nuttx和PX4的底层不太熟悉的话这部分还是有一定难度的,不过如果能搭建起这样一个框架,那么对这个系统也就有了不少的认识吧。如果对这部分感兴趣的同学不妨动手试试吧。

我的微信公众号,文章同步更新,欢迎关注。

微信公众号