你自制的飞控大概率是基于STM32F405,如果不是,对于其它飞控的适配也基本一致。
对于飞控的适配,就是简单修改一下硬件描述文件,更为复杂的是编译环境的搭建等等。
这里是对硬件描述文件修改的笔记以及教程。
硬件描述文件位置:
src/main/target/*
大多数都是从MATEKF405移植的,例如正点原子F405飞控等等,我们也基于这个修改。
在target目录下找到MATEKF405文件夹
里面有:
CMakeLists.txt:用于控制这部分是否编译
target.c: 主要为定时器资源的描述
target.h: 主要硬件描述的位置
首先是这个CMakeLists.txt:
target_stm32f405xg(MATEKF405)
target_stm32f405xg(MATEKF405OSD)
这部分逻辑很简单就是当你输入make MATEKF405
的时候编译系统知道要编译什么
target.h
LED
#define LED0 PB9
#define LED1 PA14
这里定义LED的引脚
BEEPER蜂鸣器
#define BEEPER PC13
#define BEEPER_INVERTED
这里定义蜂鸣器的引脚,根据实际情况决定是否需要反相,无需反相去掉定义即可
SPI
#define USE_SPI
#define USE_SPI_DEVICE_1#define SPI1_SCK_PIN PA5
#define SPI1_MISO_PIN PA6
#define SPI1_MOSI_PIN PA7
这部分是指定使用哪个SPI外设,例如SPI1 SPI2等等,通过USE_SPI_DEVICE_1指定对应的总线编号,后面给出具体引脚的定义。注意这里不指定CS引脚,CS引脚属于具体芯片定义的部分,在后面会指定。
IMU
大部分IMU都是挂载在SPI总线上的
MATEKF405支持两种IMU:MPU6500 MPU6000
首先是选择你使用的IMU:
#define USE_IMU_MPU6500
#define USE_IMU_MPU6000
之后是指定IMU所在的SPI总线以及CS引脚:
#define MPU6500_SPI_BUS BUS_SPI1
#define MPU6000_SPI_BUS BUS_SPI1
#define MPU6500_CS_PIN PC2
#define MPU6000_CS_PIN PC2
最后是指定IMU的焊接方向:
#define IMU_MPU6500_ALIGN CW180_DEG
#define IMU_MPU6000_ALIGN CW270_DEG
IIC
#define USE_I2C#define USE_I2C_DEVICE_1#define I2C1_SCL PB6#define I2C1_SDA PB7
定义使用IIC外设并且指定具体总线编号 这里面指定使用IIC1
之后定义IIC1使用的引脚
随后需要定义一下默认的IIC总线:
#define DEFAULT_I2C_BUS BUS_I2C1
BARO气压计
#define USE_BARO
#define BARO_I2C_BUS DEFAULT_I2C_BUS
指定使用气压计并且指定所在IIC总线
指定支持的气压计型号:
#define USE_BARO_BMP280
#define USE_BARO_MS5611
#define USE_BARO_BMP085
#define USE_BARO_DPS310
#define USE_BARO_SPL06
只要可能用到,都可以选上,到时候可以在上位机在线选择
MAG磁力计
指定使用磁力计并且指定所在IIC总线
#define USE_MAG
#define MAG_I2C_BUS DEFAULT_I2C_BUS
#define USE_MAG_ALL
上述是支持所有磁力计
OPFLOW 光流
#define USE_OPFLOW
#define USE_OPFLOW_MSP
RANGEFINDER测距仪
#define USE_RANGEFINDER
#define USE_RANGEFINDER_MSP
指定RANGEFINDER所在IIC总线:
#define RANGEFINDER_I2C_BUS DEFAULT_I2C_BUS
LED STRIP LED灯带
#define USE_LED_STRIP
#define WS2811_PIN PB6
目前的LED灯带应该是支持WS2811 WS2812。但是都写作WS2811。
这里指定对应的引脚就可以了
UART&VCP
VCP(USB虚拟串口)
需要指定USB VBUS检测引脚,以及是否启用USB VBUS检测,这个主要是用于检测到连接到电脑。
#define USE_VCP
#define VBUS_SENSING_PIN PB12
#define VBUS_SENSING_ENABLED
硬件串口
#define USE_UART1
#define UART1_RX_PIN PA10
#define UART1_TX_PIN PA9#define USE_UART2
#define UART2_RX_PIN PA3
#define UART2_TX_PIN PA2#define USE_UART3
#define UART3_RX_PIN PC11
#define UART3_TX_PIN PC10#define USE_UART4
#define UART4_RX_PIN PA1
#define UART4_TX_PIN PA0#define USE_UART5
#define UART5_RX_PIN PD2
#define UART5_TX_PIN PC12
指定使用的串口外设以及对应的引脚。
软件串口
#define USE_SOFTSERIAL1
#define SOFTSERIAL_1_RX_PIN PA1 //RX4
#define SOFTSERIAL_1_TX_PIN PA0 //TX4#define USE_SOFTSERIAL2
#define SOFTSERIAL_2_RX_PIN PA2 //TX2
#define SOFTSERIAL_2_TX_PIN PA2 //TX2
指定IO模拟的软件串口
最后是定义所有串口的总数 包括VCP、硬件串口、软件串口,上述的总共有8个:
#define SERIAL_PORT_COUNT 8
FEATURE
设置默认FEATURE:
#define DEFAULT_FEATURES (FEATURE_OSD | FEATURE_CURRENT_METER | FEATURE_VBAT | FEATURE_TELEMETRY )
所有支持的FEATURE: "fc/config.h"
typedef enum {FEATURE_THR_VBAT_COMP = 1 << 0,FEATURE_VBAT = 1 << 1,FEATURE_TX_PROF_SEL = 1 << 2, // Profile selection by TX stick commandFEATURE_BAT_PROFILE_AUTOSWITCH = 1 << 3,FEATURE_UNUSED_12 = 1 << 4, //was FEATURE_MOTOR_STOPFEATURE_UNUSED_1 = 1 << 5, // was FEATURE_SERVO_TILT was FEATURE_DYNAMIC_FILTERSFEATURE_SOFTSERIAL = 1 << 6,FEATURE_GPS = 1 << 7,FEATURE_UNUSED_3 = 1 << 8, // was FEATURE_FAILSAFEFEATURE_UNUSED_4 = 1 << 9, // was FEATURE_SONARFEATURE_TELEMETRY = 1 << 10,FEATURE_CURRENT_METER = 1 << 11,FEATURE_REVERSIBLE_MOTORS = 1 << 12,FEATURE_UNUSED_5 = 1 << 13, // RX_PARALLEL_PWMFEATURE_UNUSED_6 = 1 << 14, // RX_MSPFEATURE_RSSI_ADC = 1 << 15,FEATURE_LED_STRIP = 1 << 16,FEATURE_DASHBOARD = 1 << 17,FEATURE_UNUSED_7 = 1 << 18, // Unused in INAVFEATURE_BLACKBOX = 1 << 19,FEATURE_UNUSED_10 = 1 << 20, // was FEATURE_CHANNEL_FORWARDINGFEATURE_TRANSPONDER = 1 << 21,FEATURE_AIRMODE = 1 << 22,FEATURE_SUPEREXPO_RATES = 1 << 23,FEATURE_VTX = 1 << 24,FEATURE_UNUSED_8 = 1 << 25, // RX_SPIFEATURE_UNUSED_9 = 1 << 26, // SOFTSPIFEATURE_UNUSED_11 = 1 << 27, // FEATURE_PWM_SERVO_DRIVERFEATURE_PWM_OUTPUT_ENABLE = 1 << 28,FEATURE_OSD = 1 << 29,FEATURE_FW_LAUNCH = 1 << 30,FEATURE_FW_AUTOTRIM = 1 << 31,
} features_e;
接收机相关配置
接收机接口类型
指定默认类型:
#define DEFAULT_RX_TYPE RX_TYPE_SERIAL
所有支持的接收机接口类型:"rx/rx.h"
typedef enum {RX_TYPE_NONE = 0,RX_TYPE_SERIAL,RX_TYPE_MSP,RX_TYPE_SIM
} rxReceiverType_e;
接收机类型/协议类型:
指定默认协议类型:
#define SERIALRX_PROVIDER SERIALRX_SBUS
所有支持的协议:
SERIALRX_SPEKTRUM1024 = 0,SERIALRX_SPEKTRUM2048,SERIALRX_SBUS,SERIALRX_SUMD,SERIALRX_IBUS,SERIALRX_JETIEXBUS,SERIALRX_CRSF,SERIALRX_FPORT,SERIALRX_SBUS_FAST,SERIALRX_FPORT2,SERIALRX_SRXL2,SERIALRX_GHST,SERIALRX_MAVLINK,SERIALRX_FBUS,SERIALRX_SBUS2,
指定接收机默认的端口:
#define SERIALRX_UART SERIAL_PORT_USART2
模拟 ADC
指定使用的ADC外设以及DMA
#define USE_ADC
#define ADC_INSTANCE ADC1
#define ADC1_DMA_STREAM DMA2_Stream0
指定使用的ADC通道:
#define ADC_CHANNEL_1_PIN PC5
#define ADC_CHANNEL_2_PIN PC4
#define ADC_CHANNEL_3_PIN PB1
为通道赋予功能:
#define VBAT_ADC_CHANNEL ADC_CHN_1
#define CURRENT_METER_ADC_CHANNEL ADC_CHN_2
#define RSSI_ADC_CHANNEL ADC_CHN_3
IO资源
指定此型号的MCU含有哪些引脚资源:
例如对于STM32F405RGT6 GPIOA GPIOB GPIOC全部引出 GPIOD仅仅引出PD2
#define TARGET_IO_PORTA 0xffff
#define TARGET_IO_PORTB 0xffff
#define TARGET_IO_PORTC 0xffff
#define TARGET_IO_PORTD (BIT(2))
common.h
TELEMETRY遥测输出
启用遥测:
#define USE_TELEMETRY
具体指定支持的遥测协议类型:
#define USE_TELEMETRY_LTM
#define USE_TELEMETRY_SIM
#define USE_TELEMETRY_MAVLINK
#define USE_TELEMETRY_SRXL
#define USE_TELEMETRY_GHST
#define USE_TELEMETRY_IBUS
#define USE_TELEMETRY_SMARTPORT
#define USE_TELEMETRY_CRSF
#define USE_TELEMETRY_JETIEXBUS
#define USE_TELEMETRY_SBUS2
#define USE_TELEMETRY_HOTT
#define USE_TELEMETRY_FRSKY_HUB