手搓STM32H743开源飞控系列教程---(二)APM和BF固件源码下载,硬件定义修改、编译固件


 资料汇总(AI问答知识库)

物唯AI智慧文档

 CSDN系列文章

手搓STM32H743开源飞控系列教程---(一)飞控调研与方案设计-CSDN博客

手搓STM32H743开源飞控系列教程---(二)源码下载,修改引脚定义、编译固件-CSDN博客

手搓STM32H743开源飞控系列教程---(三)物唯飞控原理图讲解、硬件引脚讲解、一键适配官方固件

手搓STM32H743开源飞控系列教程---(四) 番外~~AI问答知识库上线-CSDN博客

手搓STM32H743开源飞控系列教程---(五) 飞控IMU与罗盘方向调整-CSDN博客

立创EDA开源地址:

WFG100A飞控硬件 - 立创开源硬件平台

B站飞行视频

F450机架,烧录Ardupilot固件首飞

210穿越机机架,烧录Betaflight固件首飞

穿越机外场花飞,作死视频

二、前言

        玩过单片机开发的电子爱好者们应该都知道,在完成硬件设计后,还需要进将固件烧录到MCU芯片上的,整个软硬件系统结合起来才能正常工作,飞控系统也不例外。

        在完成飞控硬件的设计后,我们就需要刷写飞控固件。在系列(一)的文章中,我们提到了这个飞控硬件我们是打算适配Ardupilot和Betaflight两种固件。这两个固件项目都是开源的,大家都可以在github上找到这两个项目的地址进行 “clone”下载,上述两个开源固件在整体架构设计的时候,就已经为大家做好了硬件移植的考虑,都可以非常方便的将源码适配到我们自己设计的硬件板子上。我们下载源码后,仅需对源码的引脚定义部分的代码进行修改,改为和我们自己设计的硬件相匹配后,再编译为固件。整体流程就是                  

        上述流程步骤说难不难,但还是有一些基本的操作门槛。比如需要懂一些Linux的基本操作指令、Vscode编译器使用基础、以及有一台Linux系统的电脑或者在Windows电脑上装有WLS子系统。如果你不会做源码的修改的话,那么你就只能下载别人编译的好的固件,或者在设计原理图的时候,芯片的引脚定义需要设计成和官方某个开源板子的引脚一致,然后使用它的固件。 当然这样的话,就是设计自主性上差了点意思,不能随心所欲的设计,始终感觉少了一点从0-1手搓意思,没有全链路打通~~~

所以在本章节,将给大家介绍一下APM和BF固件的引脚定义修改、源码下载、编译!

 后续有时间,我会专门拍摄个视频教程,因为做视频比写文章耗费更多的时间!


三、源码地址

3.1  Ardupilot固件的源码地址:

https://github.com/ArduPilot/ardupilot

3.2 Betaflight固件的源码地址:

https://github.com/betaflight/betaflight

四、如何选择飞控IMU、气压计、罗盘的型号 ?

        想玩无人机的朋友应该都清楚,其实飞控的核心硬件系统是非常简单的,就是一个主控MCU+IMU(惯性测量单元)+气压计+磁盘罗盘组成。那么我们在自己设计硬件画原理图的时候,不禁会问一个问题:我到底要怎么样选择飞控IMU、气压计以及磁罗盘的型号?  有三种方法:

1)参考市面上售卖的成品飞控,研究他们的传感器选型。

      因为商家选型肯定考虑了兼容性、性价比、开源支持性等等。


2)查看源码支持的传感器型号,我们就不需要额外的新增驱动代码,仅改配置文件即可。

      我本章节重点的就教大家如何查看APM固件、BF固件支持的全部传感器型号。


3)针对能够玩转源码底层的嵌入高手,传感器型号随便选择,甚至纯国产化都没问题。

      (此部分就暂时略过吧,因为三言两语讲不清楚,需要专门一个系列篇幅。。。)

4.1 APM支持的传感器

Ardupilot源码支持的传感器型号在“ardupilot/Tools/scripts/decode_devid.py”这文件下,

链接如下:

https://github.com/ArduPilot/ardupilot/blob/master/Tools/scripts/decode_devid.py





4.2 BF源码支持的传感器

Betaflight源码的传感器底层驱动都放在src/main/drivers这个文件夹下

气压计全部驱动文件路径: src/main/drivers/barometer/

https://github.com/betaflight/betaflight/tree/master/src/main/drivers/barometer


IMU全部驱动文件路径src/main/drivers/accgyro/

https://github.com/betaflight/betaflight/tree/master/src/main/drivers/accgyro


磁罗盘全部驱动文件路径: src/main/drivers/compass/

https://github.com/betaflight/betaflight/tree/master/src/main/drivers/compass

五、APM和BF的硬件配置文件解读

        大家在使用从淘宝采购的穿越机飞控或者雷迅飞控,只需要将数据线插入飞控地面站,地面站就可以识别飞控的板子型号,或者选择指定厂商的飞控板子就会自动匹配相应的固件。这是因为这些飞控厂商通过赞助/资助/合作的方式,与官方开发组(老外)建立了长期的迭代机制,官方代码在每次版本更新的时候,就会默认将这些飞控的硬件厂商都包含了进去,做好了适配。

        当然如果是自己DIY手搓的飞控,那官方代码里肯定没有我们的自己画的飞控硬件相关的引脚定义配置文件,所以必须要我们下载官方源码,然后自行添加或修改引脚配置文件,再自行编译固件去适配我们自己设计的飞控硬件。

5.1 APM硬件配置文件解读

5.1.1基本概述

        下载源码后,APM固件的所有外设设备的引脚定义在 “/ardupilot/libraries/AP_HAL_ChibiOS/hwdef”这个文件夹下。

如果你没有下载源码(具体怎么下载源码与编译见本文后面的章节),可在以下这个链接进行查看:

https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_ChibiOS/hwdef


        如下图所示,下面的每一个文件夹都代表着一个硬件的定义描述,这个硬件可以是飞控、可以是GPS模块、也可以是外设模块。所以假设我们自己设计了一个飞控硬件并命名为HAHAFC(意思为哈哈飞控),我们在编译源码生成源码的首先就在/ardupilot/libraries/AP_HAL_ChibiOS/hwdef这个目录层级下,创建一个“HAHAFC”的文件夹,然后在这个“HAHAFC”文件夹中编写我们的硬件描述定义。

    那么如何在文件夹中定义硬件描述?可以参考已有飞控厂商的定义文件照葫芦画瓢!


5.1.2 雷迅系列飞控定义

        /ardupilot/libraries/AP_HAL_ChibiOS/hwdef这个文件夹下,一直往下翻,就可以找到雷迅各系列飞控的引脚定义文件。

附:雷迅在售的飞控硬件型号


        我们分别展开CUAV-NoraCUAV-pixhack-v3CUAV-X7CUAVv5CUAVv5Nano的文件夹,会发现里面有2种不常见的后缀格式,分别是:“ .parm”   “.dat” 。

通过比对上述文件夹会发现:

.dat格式的文件,就是最重要的硬件引脚定义的描述文件。

其他的.pram、.JPG、.md文件都不是必须的文件:

.parm就是给某款特定的飞控设置的默认参数;,例如我把ADC的分压值默认写为多少。

.md类似是备注说明文件,和PDF格式类似,只不过程序里面更喜欢用md。

.jpg不用多说了,图片格式。

5.1.3 微空MicoAir743 V2硬件定义

1)微空科技的详细技术参数见以下链接。

MicoAir743-V2飞控用户手册-微空科技

2)飞控硬件配置图

3)在Ardupilot源码中找到的MicoAir743 V2的硬件定义,其目录路径如下:

ardupilot/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743v2

硬件定义重点就看:hwdef-bl.dat 和 hwdef.dat这两个文件。

其中:

  • hwdef.dat是必须的文件,所以外设硬件都必须有这个文件。
  • hwdef-bl.dat是bootloader的定义文件,用来关联生成bootloader。有些飞控没有这个文件,相当于不需要烧录专门定制的bootloader,STM32芯片默认出厂的时候是稍好了一个通用的bootloader。BootLoader专用配置文件,负责初始化基础硬件环境(如时钟、串口、USB),确保固件烧录流程正常。极简,仅包含BootLoader必需的最小硬件支持(通常仅串口/USB、时钟、GPIO等)

4)微空743 V2飞控的 hwdef.dat代码如下:

# hw definition file for processing by chibios_hwdef.py
# for the MicoAir743v2 hardware

# MCU class and specific type
MCU STM32H7xx STM32H743xx

# board ID. See Tools/AP_Bootloader/board_types.txt
APJ_BOARD_ID AP_HW_MicoAir743v2

# crystal frequency
OSCILLATOR_HZ 8000000

# ChibiOS system timer
STM32_ST_USE_TIMER 12
define CH_CFG_ST_RESOLUTION 16

# flash size
FLASH_SIZE_KB 2048
FLASH_RESERVE_START_KB 128

define HAL_STORAGE_SIZE 32768
STORAGE_FLASH_PAGE 14

# default to all pins low to avoid ESD issues
DEFAULTGPIO OUTPUT LOW PULLDOWN

# order of UARTs (and USB)
SERIAL_ORDER  OTG1 USART1 USART2 USART3 UART4 UART5 USART6 UART7 UART8

# USB
PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1

# UARTs
PA9  USART1_TX USART1
PA10 USART1_RX USART1
PA2  USART2_TX USART2
PA3  USART2_RX USART2
PD8  USART3_TX USART3
PD9  USART3_RX USART3
PA0  UART4_TX  UART4
PA1  UART4_RX  UART4
PB6  UART5_TX  UART5
PB5  UART5_RX  UART5
PC6  USART6_TX USART6
PC7  USART6_RX USART6
PE8  UART7_TX  UART7
PE7  UART7_RX  UART7
PE1  UART8_TX  UART8
PE0  UART8_RX  UART8

# SWD
PA13 JTMS-SWDIO SWD
PA14 JTCK-SWCLK SWD

# order of I2C
I2C_ORDER I2C2 I2C1

# I2C
PB8  I2C1_SCL I2C1
PB9  I2C1_SDA I2C1
PB10 I2C2_SCL I2C2
PB11 I2C2_SDA I2C2

# PWM
PE14 TIM1_CH4  TIM1  PWM(1)  GPIO(50) BIDIR
PE13 TIM1_CH3  TIM1  PWM(2)  GPIO(51)
PE11 TIM1_CH2  TIM1  PWM(3)  GPIO(52) BIDIR
PE9  TIM1_CH1  TIM1  PWM(4)  GPIO(53)
PB1  TIM3_CH4  TIM3  PWM(5)  GPIO(54) BIDIR
PB0  TIM3_CH3  TIM3  PWM(6)  GPIO(55)
PD12 TIM4_CH1  TIM4  PWM(7)  GPIO(56) BIDIR
PD13 TIM4_CH2  TIM4  PWM(8)  GPIO(57)
PE5  TIM15_CH1 TIM15 PWM(9)  GPIO(58)
PE6  TIM15_CH2 TIM15 PWM(10) GPIO(59)

# LED-pad
PD14 TIM4_CH3  TIM4  PWM(11) GPIO(60) #M11

# BUZZER
PD15 BUZZER OUTPUT GPIO(61) LOW
define HAL_BUZZER_PIN 61

# 11 PWM available by default
define BOARD_PWM_COUNT_DEFAULT 11

# LEDs
PE3 LED_RED   OUTPUT LOW GPIO(0)
PE2 LED_GREEN OUTPUT LOW GPIO(1)
PE4 LED_BLUE  OUTPUT LOW GPIO(2)

define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0
define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1
define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2

define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1

# ADC for Power
PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1)
PC1 BATT_CURRENT_SENS ADC1 SCALE(1)

# setup for battery
define HAL_BATT_MONITOR_DEFAULT 4
define HAL_BATT_VOLT_PIN 10
define HAL_BATT_CURR_PIN 11
define HAL_BATT_VOLT_SCALE 21.12
define HAL_BATT_CURR_SCALE 40.2

# compass
define HAL_COMPASS_DISABLE_QMC5883L_INTERNAL_PROBE
define HAL_PROBE_EXTERNAL_I2C_COMPASSES
COMPASS QMC5883L I2C:ALL_EXTERNAL:0x0D true  ROTATION_NONE
COMPASS QMC5883L I2C:ALL_INTERNAL:0x0D false ROTATION_NONE

# microSD support
PC12 SDMMC1_CK  SDMMC1
PD2  SDMMC1_CMD SDMMC1
PC8  SDMMC1_D0  SDMMC1
PC9  SDMMC1_D1  SDMMC1
PC10 SDMMC1_D2  SDMMC1
PC11 SDMMC1_D3  SDMMC1
define FATFS_HAL_DEVICE SDCD1

# SPI1 - OSD
PA5  SPI1_SCK        SPI1
PA6  SPI1_MISO       SPI1
PA7  SPI1_MOSI       SPI1
PB12 AT7456E_CS      CS

# SPI2 - BMI088
PD3  SPI2_SCK        SPI2
PC2  SPI2_MISO       SPI2
PC3  SPI2_MOSI       SPI2
PD5  BMI088_G_CS     CS
PD4  BMI088_A_CS     CS
PC15 DRDY1_BMI088_G  INPUT
PC14 DRDY2_BMI088_A  INPUT

# SPI3 - BMI270
PB3  SPI3_SCK      SPI3
PB4  SPI3_MISO     SPI3
PD6  SPI3_MOSI     SPI3
PA15 BMI270_CS     CS
PB7  DRDY3_BMI270  INPUT

# SPI devices
SPIDEV  bmi088_a  SPI2  DEVID1  BMI088_A_CS  MODE3  10*MHZ 10*MHZ
SPIDEV  bmi088_g  SPI2  DEVID2  BMI088_G_CS  MODE3  10*MHZ 10*MHZ
SPIDEV  bmi270    SPI3  DEVID3  BMI270_CS    MODE3   1*MHZ 10*MHZ
SPIDEV  osd       SPI1  DEVID4  AT7456E_CS   MODE0  10*MHZ 10*MHZ

# 2 IMUs
IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_ROLL_180_YAW_270
IMU BMI270 SPI:bmi270 ROTATION_ROLL_180

# barometers
BARO SPL06 I2C:0:0x77

# enable FAT filesystem support (needs a microSD defined via SDMMC)
define HAL_OS_FATFS_IO 1

# setup for serial ports
define DEFAULT_SERIAL2_PROTOCOL SerialProtocol_MSP_DisplayPort
define DEFAULT_SERIAL4_PROTOCOL SerialProtocol_MAVLink2
define DEFAULT_SERIAL6_PROTOCOL SerialProtocol_RCIN
define DEFAULT_SERIAL7_PROTOCOL SerialProtocol_ESCTelemetry
define DEFAULT_SERIAL8_PROTOCOL SerialProtocol_MAVLink2
define DEFAULT_SERIAL8_BAUD 115

# setup for OSD
define OSD_ENABLED 1
define HAL_OSD_TYPE_DEFAULT 1
ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin

# setup for BF migration
define HAL_FRAME_TYPE 12

5)微空743 V2飞控的 hwdef-bl.dat代码如下:

# hw definition file for processing by chibios_hwdef.py
# for the MicoAir743 hardware

# MCU class and specific type
MCU STM32H7xx STM32H743xx

# board ID. See Tools/AP_Bootloader/board_types.txt
APJ_BOARD_ID AP_HW_MicoAir743v2

# crystal frequency
OSCILLATOR_HZ 8000000

# flash size
FLASH_SIZE_KB 2048

# bootloader is installed at zero offset
FLASH_RESERVE_START_KB 0

# the location where the bootloader will put the firmware
FLASH_BOOTLOADER_LOAD_KB 128

# order of UARTs (and USB)
SERIAL_ORDER OTG1 USART1

# USB
PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1

# USART1
PA9  USART1_TX USART1
PA10 USART1_RX USART1

# pins for SWD debugging
PA13 JTMS-SWDIO SWD
PA14 JTCK-SWCLK SWD

# CS pins
PD5  BMI088_G_CS     CS
PD4  BMI088_A_CS     CS
PA15 BMI270_CS       CS
PB12 AT7456E_CS      CS

# LEDs
PE2 LED_ACTIVITY   OUTPUT LOW #green
PE4 LED_BOOTLOADER OUTPUT LOW #blue
define HAL_LED_ON 0

5.1.4 APM如何自定义硬件?

        看到这里大家就基本上知道硬件定义文件的目录在哪里以及要怎么去修改这个硬件定义文件。整体步骤就是:

1)先创建一个文件夹(这个文件夹就是你自定义飞控的名称)

2)从跟你类似的成品飞控硬件定义文件中,拷贝hwdef-bl.dat和hwdef.dat到你的文件夹。

3)照葫芦画瓢,开始魔改hwdef-bl.dat和hwdef.datt文件

        在魔改的过程中,如果不是很懂里面的每一句定义,大家可以直接把代码复制下来,问AI,他会帮你解释的非常清楚,甚至大家可以把上述微空的硬件定义文件复制下来,告诉AI你的硬件定义,再让AI参照上述格式给你仿写。 让AI来写硬件定义文件,本人也没试过。但是大家可以多参考几个飞控的硬件定义文件具体是怎么写的,其实都大同小异。这里也给出几个成品开源飞控的链接以及对应硬件定义目录,大家可以用来参考,然后我们照葫芦画瓢,多编译几次肯定是可以写出自己的硬件定义文件的!

飞控型号主控芯片硬件定义参考
雷迅X7+STM32H743https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_ChibiOS/hwdef/CUAV-X7
微空743 V2STM32H743https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743v2
MatekF405-TESTM32F405https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-TE
曼巴F405 V2STM32F405https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_HAL_ChibiOS/hwdef/MambaF405v2

        

5.2 BF硬件配置文件解读

        5.2.1 基本概述

      下载BF源码后,在源码文件中还无法直接查看所以的硬件定义文件,还需要先执行以下命令

将硬件配置文件拉取到本地电脑。(后续章节同样会介绍BF源码下载和编译)

cd betaflight
make configs

如果观众朋友没有下载源码,可在以下这个链接进行查看BF固件支持的所有飞控的硬件定义:

https://github.com/betaflight/config/tree/6f5fb58d9a4b8f98a086f9b26ec2d616f9c8f630/configs


5.2.2 微空MicoAir743  V2硬件定义

        还是老样子用微空MicoAir743  V2飞控,来解读BF源码中的硬件定义。源码链接如下:

https://github.com/betaflight/config/blob/6f5fb58d9a4b8f98a086f9b26ec2d616f9c8f630/configs/MICOAIR743/config.h

打开后可以看到硬件的定义文件也是相当简单,就是一个.h文件

5.2.3 微空MicoAir743 V2硬件定义代码

/*
 * This file is part of Betaflight.
 *
 * Betaflight is free software. You can redistribute this software
 * and/or modify this software under the terms of the GNU General
 * Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later
 * version.
 *
 * Betaflight is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this software.
 *
 * If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#define FC_TARGET_MCU   STM32H743

#define BOARD_NAME      MICOAIR743
#define MANUFACTURER_ID MICO

#define USE_ACC
#define USE_GYRO
#define USE_ACCGYRO_BMI270
#define USE_BARO
#define USE_BARO_DPS310
#define USE_SDCARD
#define USE_MAX7456

#ifndef USE_MAG
#define USE_MAG
#define USE_MAG_IST8310
#endif

#define MOTOR1_PIN PE14
#define MOTOR2_PIN PE13
#define MOTOR3_PIN PE11
#define MOTOR4_PIN PE9
#define MOTOR5_PIN PB1
#define MOTOR6_PIN PB0
#define MOTOR7_PIN PD12
#define MOTOR8_PIN PD13

#define UART1_TX_PIN PA9
#define UART2_TX_PIN PA2
#define UART3_TX_PIN PD8
#define UART4_TX_PIN PA0
#define UART6_TX_PIN PC6
#define UART7_TX_PIN PE8
#define UART8_TX_PIN PE1
#define UART1_RX_PIN PA10
#define UART2_RX_PIN PA3
#define UART3_RX_PIN PD9
#define UART4_RX_PIN PA1
#define UART6_RX_PIN PC7
#define UART7_RX_PIN PE7
#define UART8_RX_PIN PE0

#define I2C1_SCL_PIN PB6
#define I2C2_SCL_PIN PB10
#define I2C1_SDA_PIN PB7
#define I2C2_SDA_PIN PB11

#define SPI1_SCK_PIN PA5
#define SPI2_SCK_PIN PD3
#define SPI1_SDI_PIN PA6
#define SPI2_SDI_PIN PC2
#define SPI1_SDO_PIN PA7
#define SPI2_SDO_PIN PC3

#define SDIO_CK_PIN  PC12
#define SDIO_CMD_PIN PD2
#define SDIO_D0_PIN  PC8
#define SDIO_D1_PIN  PC9
#define SDIO_D2_PIN  PC10
#define SDIO_D3_PIN  PC11

#define ADC_VBAT_PIN PC0
#define ADC_CURR_PIN PC1

#define LED0_PIN           PE4
#define LED1_PIN           PE6
#define LED2_PIN           PE5
#define BEEPER_PIN         PD15
#define LED_STRIP_PIN      PD14
#define GYRO_1_CS_PIN      PA15
#define MAX7456_SPI_CS_PIN PB12
#define PINIO1_PIN         PD4
#define PINIO2_PIN         PD5
#define PINIO1_CONFIG      129
#define PINIO2_CONFIG      129

#define TIMER_PIN_MAPPING \
    TIMER_PIN_MAP( 0, MOTOR1_PIN, 1,  0 ) \
    TIMER_PIN_MAP( 1, MOTOR2_PIN, 1,  1 ) \
    TIMER_PIN_MAP( 2, MOTOR3_PIN, 1,  2 ) \
    TIMER_PIN_MAP( 3, MOTOR4_PIN, 1,  3 ) \
    TIMER_PIN_MAP( 4, MOTOR5_PIN, 2,  4 ) \
    TIMER_PIN_MAP( 5, MOTOR6_PIN, 2,  5 ) \
    TIMER_PIN_MAP( 6, MOTOR7_PIN, 1,  6 ) \
    TIMER_PIN_MAP( 7, MOTOR8_PIN, 1,  7 ) \
    TIMER_PIN_MAP( 8, LED_STRIP_PIN, 1, 12 ) \
    TIMER_PIN_MAP( 9, BEEPER_PIN, 1, -1 ) 
    
#define ADC1_DMA_OPT   8
#define ADC3_DMA_OPT   9
#define TIMUP1_DMA_OPT 0
#define TIMUP3_DMA_OPT 0
#define TIMUP4_DMA_OPT 0
#define TIMUP5_DMA_OPT 0
#define TIMUP8_DMA_OPT 0

#define GYRO_1_SPI_INSTANCE  SPI2
#define MAX7456_SPI_INSTANCE SPI1
#define SDIO_USE_4BIT        1
#define SDIO_DEVICE          SDIODEV_1
#define BARO_I2C_INSTANCE    I2CDEV_2
#define MAG_I2C_INSTANCE     I2CDEV_2
#define MAG_I2C_ADDRESS      14
#define MAG_ALIGN            CW90_DEG
#define MAG_ALIGN_YAW        900

#define BEEPER_INVERTED
#define DEFAULT_BLACKBOX_DEVICE      BLACKBOX_DEVICE_SDCARD
#define DEFAULT_CURRENT_METER_SOURCE CURRENT_METER_ADC
#define DEFAULT_VOLTAGE_METER_SOURCE VOLTAGE_METER_ADC
#define DEFAULT_CURRENT_METER_SCALE  402
#define DEFAULT_VOLTAGE_METER_SCALE  213

#define MSP_UART             SERIAL_PORT_USART1
#define MSP_DISPLAYPORT_UART SERIAL_PORT_USART2
#define GPS_UART             SERIAL_PORT_USART3
#define SERIALRX_UART        SERIAL_PORT_USART6
#define ESC_SENSOR_UART      SERIAL_PORT_USART7

5.2.4 BF如何自定义硬件?

和APM的自定义文件类似。

1)先创建一个文件夹(这个文件夹就是你自定义飞控的名称)

2)从跟你类似的成品飞控硬件定义文件中,拷贝config.h到你的文件夹中

3)照葫芦画瓢,开始魔改config.h.h文件

六、固件编译前准备

6.1 安装WLS子系统        

        由于APM固件和BF源码工程都是在Linux环境下进行编译,所以实现需要在Windws电脑上安装WLS子系统,具体怎么安装可参考以下链接,这里不在过多概述。

本人安装的软件如下:

windows子系统:WLS2

Linux系统:Ubuntu20.04.6LTS

WLS子系统安装教程:https://zhuanlan.zhihu.com/p/690428564


        安装完成后,可以在我的电脑中看到Linux Ubuntu20.04的文件。

       

6.2 魔法一下

        最好开启魔法,因为github的服务器在国外。当然没有魔法也可以,需要你的网络条件比较好,否则可能会有些文件因网络原因无法下载,最终导致编译过程中报一些奇怪的错误。开启后魔法,先ping一下谷歌,确保在子系统下能够成功访问谷歌。(因为可能出现在windows系统下已可以成功出去,但是在WLS子系统无法出去,遇到这种情况大家也百度以下)

ping www.google.com

 6.3 更新软件源以及升级软件

sudo apt-get update 
sudo apt-get upgrade -y

6.4 安装git相关的插件

        因为无论是APM固件还是BF固件都是放在github仓库进行管理,所以我们要在WLS子系统上先完成git相关插件的安装

sudo apt-get update
sudo apt-get install git
sudo apt-get install gitk git-gui

6.5 检查git是否安装成功

git version

如下图所示,会有版本号显示。(本人的版本可能会比较旧,因为是之前安装的)


七、 APM固件的下载与编译

7.1 打开ubutnu子系统


7.2 下载Ardupilot源码

输入指令,等待下载完成。

git clone https://github.com/ArduPilot/ardupilot.git


7.3 进入ardupilot文件夹

待源码下载完成后,进入ardupilot文件

cd ardupilot

7.4切换分支至多旋翼4.6.1分支

截止至2025年7月17日的稳定版分支是4.6.1

git checkout Copter-4.6.1

git branch    #查看分支是否切换成功

7.5 更新源码的子模块

非常重要,确保要成功,否则会编译报错

git submodule update --init --recursive 

7.6 安装编译环境

  • 非常重要,确保要成功,否则会编译报错!
  • 建议魔法出去,否则耗时很久.
Tools/environment_install/install-prereqs-ubuntu.sh -y


7.7 查看支持的板子类型

输入指令,可以查看所有的板卡命令。

./waf list_boards

大家如果细心一点,就会发现,这个就是硬件定义文件夹的名称。详见5.1章节回看一下。

7.8 编译成品飞控板:雷迅V5+固件。

执行命令,选定板卡型号为:CUAVv5

./waf configure --board CUAVv5

---------------------------------------------以下内容为重点-------------------------------------------------------

7.9 选择我们自定义的飞控硬件

    通过上面的指令,我们已经知道:

要编译的板子

硬件定义

文件夹名称

选定飞控硬件的waf指令
雷迅V5+CUAVv5./waf configure --board CUAVv5
微空743MicoAir743 V2./waf configure --board MicoAir743 V2
哈哈飞控HAHAFC./waf configure --board HAHAFC

        如果是我们自己的设计的飞控,假设飞控的文件夹名是HAHAFC;将HAHAFC这个文件夹拷贝到/ardupilot/libraries/AP_HAL_ChibiOS下,同时我们也在文件夹中写好了相关hwdef-bl.dat 和 hwdef.dat文件。

编译自定义的飞控硬件,需要执行2个步骤

1)生成bootloader

先执行以下命令,生成关联的bootloader;

 python3 Tools/scripts/build_bootloaders.py HAHAFC

//注释:  HAHAFC 就是我们自定义的飞控文件夹名称

2)编译我们自定义的飞控硬件型号

接下来,就和编译成品飞控一样了,执行以下指令,--board 后面接我们自定义的飞控文件夹名即可。

./waf configure --board HAHAFC

(我们之前自定义的引脚描述,就在指令“./waf configure --board XXX”生效)

---------------------------------------------以上内容为重点-------------------------------------------------

7.10 选定要编译的固件类型,执行编译。

此处我们的编译的是多轴固件,执行以下命令。

./waf copter

 注意:Ardupilot固件支持多个载机类型,编译指令如下图所示:


7.11 等待编译完成

编译时长和电脑的CPU性能有关。

如下图所示,在多轴4.6.1固件中,默认需要编译1218个文件。

固件编译完成,会显示以下信息。

7.12 编译小结:

其实编译过程中就是执行了2条指令,分别是:

./waf configure --board HAHAFC
//注释:选定要编译的板子类型,此处选定的为HAHAFC


./waf copter     //注释:执行编译多旋翼固件
//此外可编译固定翼、垂起、无人车、潜艇、无人机船、追踪器的固件

7.13 APM固件的生成目录

(在build文件目录下)

编译后的固件生成的路径(以下为本人的路径):

\\wsl.localhost\Ubuntu-20.04\home\xsp\ardupilot\build\HAHAFC\bin    (示范编译的哈哈飞控)

将.apj的文件拷贝出来,用missionplanner地面站即可进行烧录。

(注意:在烧录固件之前,首先要确保先成功烧录bootloader)

7.14 bootloader的生成目录

(在Tools/文件目录下)

编译后的bootloader生成的路径(以下为本人的路径):

\\wsl.localhost\Ubuntu-20.04\home\xsp\ardupilot\Tools\bootloaders

八、BF固件的下载与编译

8.1 打开ubuntu子系统

8.2 下载betalight源码

git clone https://github.com/betaflight/betaflight.git

8.3 进入betaflight文件夹

待源码下载完成后,进入betaflight文件

cd betaflight

8.4 拉取配置文件

make configs

执行完上述指令后,才能看到BF固件支持的所有飞控的硬件配置定义文件。

8.5 切换分支

        默认下载是Master最新版,截止至2025年7月18日,BF的稳定版固件是4.5版。

git checkout 4.5-maintenance

8.5 更新软件源以及升级软件

sudo apt update
sudo apt-get upgrade -y

8.6 安装make工具

sudo apt install make -y

8.7 检查make安装版本

make --version

8.8 安装编译工具链

此步骤非常重要,如果没有安装成功,也会导致编译失败,最好可以魔法一下!

make arm_sdk_install

8.9 查看官方BF源码支持的飞控硬件

1)通过在线链接查看(在前面的5.2.1章节有详细描述):

https://github.com/betaflight/config/tree/6f5fb58d9a4b8f98a086f9b26ec2d616f9c8f630/configs

2)在源码文件夹中查看,所有飞控硬件的定义文件的文件夹路径如下:

/betaflight/src/config/configs

输入以下指令

cd ~
cd ./betaflight/src/config/configs


/betaflight/src/config/configs这个路径下,输入指令ls,即可查看所有的飞控板卡型号。

ls


8.10 选定飞控硬件型号并编译固件

1)假设我们要编译 SOULF4的飞控

2)执行编译命令之前,我们首先要返回到betaflight的目录下:

cd  ~
cd betaflight

3)执行编译指令

make SOULF4

8.11 编译自定义的飞控固件

---------------------------------------------以下内容为重点-------------------------------------------------

假设我们自定义的 飞控,名称仍然叫HAHAFC

   通过上面的指令,我们已经知道:

要编译的板子

硬件定义

文件夹名称

选定飞控硬件的waf指令
SOULF4SOULF4make SOULF4
微空743MICOAIR743make MICOAIR743
哈哈飞控HAHAFCmake HAHAFC

       如果是我们自己的设计的飞控,假设飞控的文件夹名是HAHAFC;将HAHAFC这个文件夹拷贝到/betaflight/src/config/configs下,同时我们也在文件夹中写好了config.h文件。

只需执行make编译指令,即可编译代码

make HAHAFC

---------------------------------------------以上内容为重点-------------------------------------------------

8.11 固件生成目录

9、结尾

        至此,本章节的内容就全部完结了,主要介绍了BF源码和APM源码如何进行自定义硬件配置、源码的下载、编译等内容。相信对于有一定开发基础的朋友,本文足以让大家理解。

        但针对0开发基础的朋友,可能还是有点吃力,毕竟用文字描述这么多步骤仍然可能存在遗漏的地方或者各种报错。后续有时间的话,我会针对这个章节的内容录制一个完整版本的视频。在下一个章节,会详细介绍物唯科技的飞控原理图设计和引脚定义文件、再用本章节的方法将源码进行编译,此外还会用一种脚本包的方法一键适配官方固件不用繁琐的修改硬件配置文件。     

感谢大家的观看,如果喜欢的话,就高抬贵手点个赞或留个言吧!

你们的支持是我写下去的动力!

o(* ̄▽ ̄*)ブ

  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值