ArduPilot JFB100 硬件定义全解析:JAE JFB-100 飞行控制板的 UART、PWM、电池监测与 GPIO 实战指南
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
JFB-100 是 ArduPilot 仓库中为 JAE JFB-100 飞行控制板定义的 ChibiOS 硬件目标板(board target),本文以 libraries/AP_HAL_ChibiOS/hwdef/JFB100/README.md 为核心,结合 hwdef.dat、hwdef-bl.dat 与 defaults.parm 的源码实现,系统讲解该板的 UART 映射、RC 输入、PWM/DShot 分组、电池监测、罗盘、GPIO、I2C/CAN 总线、调试口与固件加载方式。读完本文,你将能够正确理解 ArduPilot 串口/SPI/I2C 编号与 JFB-100 板载接口的对应关系,并完成 RC 输入、DShot 输出、GPIO 复用与电池参数的实际配置。
1. JFB-100 硬件特性概览
根据 README,JFB-100 由 JAE 销售,主要硬件特性如下:
- STM32F765 微控制器
- 两颗 IMU:ICM20602 与 SCHA63T
- MS5611 SPI 气压计
- 内置 I2C IST8310 罗盘(磁力计)
- microSD 卡槽
- 6 个 UART 加 USB
- 8 路 PWM 输出
- 4 个 I2C 和 2 个 CAN 接口
- 外部蜂鸣器
- 外部安全开关(safety switch)
- 舵机供电轨与 Vcc 电压监测
- 两个专用的外部电源砖(power brick)输入端口
hwdef.dat 中的实现与 README 完全对应,例如 MCU 定义为:
# MCU class and specific type. It is a F765, which is the same as F767 # but without the TFT interface MCU STM32F7xx STM32F767xx从源码结构看,该板复用 STM32F767xx 的 MCU 类(F765 与 F767 引脚资源相同,区别仅在没有 TFT 接口),Flash 大小配置为 2048 KB(FLASH_SIZE_KB 2048),晶振为 16 MHz(OSCILLATOR_HZ 16000000)。
双 IMU 与气压计在 SPI 设备表中定义:
SPIDEV ms5611 SPI4 DEVID1 MS5611_CS MODE3 20*MHZ 20*MHZ SPIDEV scha63t_g SPI1 DEVID1 SCHA63T_G_CS MODE0 10*MHZ 10*MHZ SPIDEV scha63t_a SPI1 DEVID2 SCHA63T_A_CS MODE0 10*MHZ 10*MHZ SPIDEV icm20602 SPI1 DEVID3 ICM20602_CS MODE3 2*MHZ 8*MHZ SPIDEV ramtron SPI2 DEVID1 FRAM_CS MODE3 8*MHZ 8*MHZIMU 实例化与旋转方向:
IMU SCHA63T SPI:scha63t_a SPI:scha63t_g ROTATION_NONE IMU Invensense SPI:icm20602 ROTATION_PITCH_180_YAW_270气压计实例化:BARO MS5611 SPI:ms5611。值得注意的是 hwdef 中还预留了 SPI2 上的 RAMTRON FRAM 作为参数存储:
define HAL_STORAGE_SIZE 32768 define HAL_WITH_RAMTRON 12. UART 映射:SERIAL0~SERIAL6 与物理接口对应关系
README 给出的 UART 映射表:
- SERIAL0 -> USB
- SERIAL1 -> UART2(Telem1)
- SERIAL2 -> UART3(Telem2)
- SERIAL3 -> UART1(GPS)
- SERIAL4 -> UART4(GPS2,丝印标注 UART/I2CB)
- SERIAL5 -> UART6(RC)
- SERIAL6 -> UART7(备用,debug)
Telem1 和 Telem2 两个端口带有 RTS/CTS 流控引脚,其余 UART 没有。UART7 的连接器丝印标注为 debug,但在 ArduPilot 中可作为通用 UART 使用。
该映射由 hwdef.dat 的SERIAL_ORDER行决定,串口编号按此顺序从 0 开始分配:
SERIAL_ORDER OTG1 USART2 USART3 USART1 UART4 USART6 UART7 OTG2逐一对应:OTG1(USB)为 SERIAL0,USART2 为 SERIAL1(Telem1),USART3 为 SERIAL2(Telem2),USART1 为 SERIAL3(GPS1),UART4 为 SERIAL4(GPS2),USART6 为 SERIAL5(RC),UART7 为 SERIAL6(备用/debug)。引脚级定义(摘录):
# USART2 is telem1 PD6 USART2_RX USART2 PD5 USART2_TX USART2 PD3 USART2_CTS USART2 PD4 USART2_RTS USART2 # USART1 is GPS1 PB7 USART1_RX USART1 NODMA PB6 USART1_TX USART1 NODMATelem1(USART2)与 Telem2(USART3)均定义了 CTS/RTS 引脚,而 GPS1/GPS2/RC/debug 口标注NODMA或未定义流控引脚,与 README “只有 Telem1/Telem2 有 RTS/CTS” 的描述一致。
2.1 默认 RC 输入串口配置(defaults.parm)
defaults.parm 为 JFB-100 提供了板级默认参数:
# JFB-100 board default definition SERIAL5_OPTIONS,8 SERIAL5_PROTOCOL,23其中SERIAL5_PROTOCOL取值 23,对应 AP_SerialManager.h 中的SerialProtocol_RCIN协议枚举。也就是说,该板出厂默认将 SERIAL5(即硬件 UART6,丝印 RC 口)配置为 RC 输入串口。结合 README 的 RC 输入说明,这个默认值让板子开箱即用:把 SBUS/CRSF 接收机插到 RC 口即可接收遥控信号。若将该串口改作他用(如第二路 GPS),需要手动覆盖SERIAL5_PROTOCOL与SERIAL5_OPTIONS。
3. RC 输入(DSM/SBUS RC 端口)
README 指出:RC 输入配置在标注为 DSM/SBUS RC 的端口上,该连接器支持所有 RC 协议,并配有两根线缆;若要通过软件绑定(software binding)Spektrum 卫星接收机,必须使用 Spektrum 卫星线。
hwdef.dat 中与该功能对应的硬件实现:
# RCInput on the PPM pin, for all protocols PI5 TIM8_CH1 TIM8 RCININT PULLUP LOW# Control of Spektrum power pin PE4 SPEKTRUM_PWR OUTPUT HIGH GPIO(73) define HAL_GPIO_SPEKTRUM_PWR 73 # Spektrum Power is Active High define HAL_SPEKTRUM_PWR_ENABLED 1可以看到 RC 输入使用 TIM8_CH1(PI5)作为 RCININT 中断输入;另有专用 GPIO(GPIO 73,PE4)控制 Spektrum 接收机电源,且为高电平有效(active high)。这正是“软件绑定需使用 Spektrum 卫星线”的硬件基础:只有在该供电脚有效的线缆上,ArduPilot 才能通过串口向卫星接收机下发绑定数据。
4. PWM 输出:8 路、3 个分组与 DShot 限制
README 说明 JFB-100 支持最多 8 路 PWM 输出,直接挂在 STM32F765 上,支持所有 PWM 协议;前 4 路支持 DShot。8 路输出分 3 组:
- PWM 1、2、3、4 在 group1
- PWM 5、6 在 group2
- PWM 7、8 在 group3
同一组内的通道必须使用相同的输出频率;若组内任一通道的协议设为 DShot,则该组所有通道都必须用 DShot。
这个分组限制直接来源于底层定时器的硬件归属,hwdef.dat 中 8 路 PWM 的定时器分配:
# PWM AUX channels PE14 TIM1_CH4 TIM1 PWM(1) GPIO(50) PA10 TIM1_CH3 TIM1 PWM(2) GPIO(51) PE11 TIM1_CH2 TIM1 PWM(3) GPIO(52) PE9 TIM1_CH1 TIM1 PWM(4) GPIO(53) PD13 TIM4_CH2 TIM4 PWM(5) GPIO(54) PD14 TIM4_CH3 TIM4 PWM(6) GPIO(55) # we need to disable DMA on the last 2 FMU channels # as timer 12 doesn't have a TIMn_UP DMA option PH6 TIM12_CH1 TIM12 PWM(7) GPIO(56) NODMA PH9 TIM12_CH2 TIM12 PWM(8) GPIO(57) NODMA从源码结构看,group1(PWM1~4)共用 TIM1,group2(PWM5~6)共用 TIM4,group3(PWM7~8)共用 TIM12——每组共享一个硬件定时器,同一定时器只有一个时基,因此同组通道频率必须一致;DShot 帧率要求决定了“组内混用协议”不可行。同时可以看到 PWM7/8 标注NODMA,原因是 TIM12 没有 TIMx_UP 对应的 DMA 通道,源码注释也明确说明了这一点。
5. GPIO:把 PWM 5/6 复用作通用 GPIO
README 的 GPIO 一节说明:6 路 PWM 口可以当 GPIO 使用(继电器、按键、RPM 等),做法是把BRD_PWM_COUNT设为小于 6 的值。例如把BRD_PWM_COUNT设为 4,则 PWM5 和 PWM6 可释放为 GPIO。ArduPilot 中 PIN 参数使用的 GPIO 编号为:
- AUX1 -> 50
- AUX2 -> 51
- AUX3 -> 52
- AUX4 -> 53
- AUX5 -> 54
- AUX6 -> 55
对照 hwdef.dat 的PWM(n) GPIO(m)双标识定义,PWM1~6 恰好对应 GPIO 50~55(PE14/PA10/PE11/PE9/PD13/PD14),与 README 的编号表一一对应。因此当你设置BRD_PWM_COUNT=4后,可在PIN_系列参数中填入 54(AUX5)、55(AUX6)来驱动继电器或读取 RPM 信号。此外 hwdef 还预留了捕获引脚与多个复用脚(如PA5 FMU_CAP1 GPIO(58)、PB10 WA4等),供扩展用途。
6. 电池监测:两个电源监测端口与电压/电流分压系数
README 说明板上有两个专用电源监测端口(8 pin 连接器),且正确的电池设置参数取决于所接电源砖类型。
hwdef.dat 给出了完整的 ADC 通道与标定系数:
# analog in PA0 BATT_VOLTAGE_SENS ADC1 SCALE(1) PA1 BATT_CURRENT_SENS ADC1 SCALE(1) PA2 BATT2_VOLTAGE_SENS ADC1 SCALE(1) PA3 BATT2_CURRENT_SENS ADC1 SCALE(1) ... PB0 RSSI_IN ADC1 SCALE(1) ... PC0 VDD_5V_SENS ADC1 SCALE(2) PC1 SCALED_V3V3 ADC1 SCALE(2) # setup for supplied power brick define HAL_BATT_VOLT_SCALE 18.182 define HAL_BATT_CURR_SCALE 36.364 define HAL_BATT_VOLT_PIN 0 define HAL_BATT_CURR_PIN 1 define HAL_BATT2_VOLT_PIN 2 define HAL_BATT2_CURR_PIN 3可以看到:
- 电池 1 电压/电流分别使用 ADC Pin0(PA0)与 Pin1(PA1);
- 电池 2 电压/电流分别使用 ADC Pin2(PA2)与 Pin3(PA3);
- 5V 与 3.3V 供电轨监测使用
VDD_5V_SENS(PC0)与SCALED_V3V3(PC1),即 README 提到的“舵机轨与 Vcc 电压监测”; - RSSI 电压监测接在
RSSI_IN(PB0); - 板上还定义了硬件版本识别脚
PC3 HW_REV_SENS、PC2 HW_VER_SENS,以及加热片控制PA7 HEATER_EN GPIO(80)。
默认电压分压系数 18.182、电流转换系数 36.364 是针对“supplied power brick”(出厂配套电源砖)的标定(源码注释保留了旧版 PixHackV5 电源砖 18.0/24.0 的被替换值)。这印证了 README 的提示:更换电源砖后需要重新计算BATT_VOLT_SCAL/BATT_AMP_SCAL一类参数。
7. 罗盘:内置 IST8310 与外部罗盘的配合
README 提示:JFB-100 内置 IST8310 罗盘,但由于潜在干扰问题,实际使用通常搭配 GPS/罗盘组合中的外部 I2C 罗盘。
hwdef.dat 中对应配置:
# probe external I2C compasses plus some internal IST8310 define AP_COMPASS_PROBING_ENABLED 1 define AP_COMPASS_IST8310_EXTERNAL_BUS_PROBING_ENABLED 0 define AP_COMPASS_IST8310_INTERNAL_BUS_PROBING_ENABLED 0 COMPASS IST8310 I2C:ALL_EXTERNAL:0x0E true ROTATION_ROLL_180_YAW_90 COMPASS IST8310 I2C:ALL_INTERNAL:0x0E false ROTATION_YAW_270从源码结构看,探测(probing)机制全局开启,因此接在外部 I2C 总线上的各种罗盘芯片(含 GPS 组合里的 IST8310,地址 0x0E)会被自动发现,且内置 IST8310 也以固定旋转ROTATION_YAW_270声明在内部总线上。这为“内置罗盘作备份、外部罗盘作主用”的常见部署提供了软件支持。
8. I2C 总线与 CAN 总线
8.1 I2C 总线编号
README 给出的 I2C 编号映射:
- 内部 I2C 口:ArduPilot bus 0(硬件 I2C3)
- 标注 I2CA 的口:ArduPilot bus 3(硬件 I2C4)
- 标注 I2CB 的口:ArduPilot bus 2(硬件 I2C2)
- 标注 GPS 的口:ArduPilot bus 1(硬件 I2C1)
hwdef.dat 中的总线排序决定了该映射:
I2C_ORDER I2C3 I2C1 I2C2 I2C4即 I2C3 排第一位成为 bus 0,I2C1(GPS 口)为 bus 1,I2C2(I2CB)为 bus 2,I2C4(I2CA)为 bus 3。四条总线的物理引脚分别为 PB8/PB9(I2C1)、PF1/PF0(I2C2)、PH7/PH8(I2C3)、PF14/PF15(I2C4)。配置COMPASS_BUS、GPS_BUS等参数时应使用 ArduPilot 编号(0~3)而非硬件编号。
8.2 CAN 总线
README 说明 JFB-100 有两路独立 CAN 总线。hwdef.dat 中的引脚与静音(silent)控制脚:
# CAN bus PI9 CAN1_RX CAN1 PH13 CAN1_TX CAN1 PB12 CAN2_RX CAN2 PB13 CAN2_TX CAN2 PH2 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(70) PH3 GPIO_CAN2_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(71) PH4 GPIO_CAN3_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(72)三路 GPIO 静音脚(CAN1/CAN2/CAN3)用于在总线空闲时将收发器置于高阻态,便于总线检测与故障定位。
9. 模拟输入(ADC)总表
README 列出 7 路模拟输入,结合 hwdef.dat 的完整 ADC 表如下:
- ADC Pin0 -> 电池电压(
PA0 BATT_VOLTAGE_SENS) - ADC Pin1 -> 电池电流传感器(
PA1 BATT_CURRENT_SENS) - ADC Pin2 -> 电池电压 2(
PA2 BATT2_VOLTAGE_SENS) - ADC Pin3 -> 电池电流传感器 2(
PA3 BATT2_CURRENT_SENS) - ADC Pin4 -> ADC 口 pin 2(
PC4 SPARE1_ADC1) - ADC Pin14 -> ADC 口 pin 3(
PA4 SPARE2_ADC1) - ADC Pin10 -> ADC 5V 监测(
PC0 VDD_5V_SENS) - ADC Pin11 -> ADC 3.3V 监测(
PC1 SCALED_V3V3) - ADC Pin103 -> RSSI 电压监测(
PB0 RSSI_IN)
其中前四路服务两个电源监测端口,其余为板载 5V/3.3V 供电轨监测、RSSI 与两路用户 ADC。注意 README 的编号体系中“Pin103”属于 RSSI(GPIO/引脚命名空间),而 0~14 属于 ADC 通道命名空间,二者不要混淆。
10. 调试(SWD)与固件加载
10.1 SWD 调试
README 说明 JFB-100 支持在 debug 口进行 SWD 调试。hwdef.dat 中的定义:
# these are the pins for SWD debugging with a STlinkv2 or black-magic probe PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD即标准 SWDIO(PA13)/SWCLK(PA14),可直接接 STlinkv2 或 Black Magic Probe。
10.2 预装 Bootloader 与 .apj 固件
README 指出该板出厂预装 ArduPilot 兼容 bootloader,可用任意 ArduPilot 兼容地面站刷入*.apj固件。对应的硬件定义见 hwdef-bl.dat:
APJ_BOARD_ID AP_HW_JFB100 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 32bootloader 从 Flash 0 偏移开始存放,应用固件被放置在 32 KB 偏移处;而正式固件(hwdef.dat)中FLASH_RESERVE_START_KB 32表示应用固件区从 32 KB 开始、保留前 32 KB 给 bootloader,两处定义严格互补。bootloader 阶段只启用 USB(OTG1)、USART2(Telem1)和 UART7(debug)三条串口(SERIAL_ORDER OTG1 USART2 UART7),因此通过 USB 或 Telem1 口均可完成刷写。
板级 ID 注册在 Tools/AP_Bootloader/board_types.txt 中:AP_HW_JFB100对应数值 1084,该 ID 会被编译进固件头供 bootloader 校验。
11. 构建与使用前提
JFB-100 作为 ChibiOS 目标板参与 ArduPilot 构建。从 Tools/ardupilotwaf/chibios.py 的构建逻辑看:
- 正式固件构建时,
generate_hwdef_h()会以libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat作为输入,调用hwdef/scripts/chibios_hwdef.py生成hwdef.h; - 构建 bootloader(AP_Bootloader)时,会把输入替换为同目录下的
hwdef-bl.dat。
因此在仓库根目录下使用标准 waf 流程并指定--board JFB100即可生成该板的 ArduCopter/ArduPlane 等固件(具体车型子命令遵循 ArduPilot 常规构建方式,如waf copter、waf plane)。适用前提与限制:
- 该目标板基于 STM32F7 系列、2 MB Flash 构建,工具链与依赖需满足 ArduPilot ChibiOS 构建的一般要求;
defaults.parm中的SERIAL5_PROTOCOL=23(RCIN)意味着该板默认把 RC 串口占用为遥控输入,改变用途时需显式修改串口参数;- 更换电源砖后,第 6 节所述的电池分压/电流系数需要按新硬件重新标定;
- DShot 受“同组同频率”的定时器分组约束,规划电调输出时需遵守第 4 节的分组规则。
12. 小结
JFB-100 在 ArduPilot 中的完整硬件画像由四个文件构成:README 描述面向用户的功能与接线约定,hwdef.dat定义引脚、定时器、总线与传感器实例,hwdef-bl.dat定义 bootloader 布局,defaults.parm提供板级默认串口参数。理解SERIAL_ORDER、I2C_ORDER这类排序行与PWM(n)/GPIO(m)双标识是正确配置该板的关键:ArduPilot 用户参数中出现的串口号、I2C 总线号、PIN 编号,都可以在 libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat 中找到其物理引脚出处。
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考