news 2026/9/14 9:43:53

ArduPilot JFB100 硬件定义全解析:JAE JFB-100 飞行控制板的 UART、PWM、电池监测与 GPIO 实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArduPilot JFB100 硬件定义全解析:JAE JFB-100 飞行控制板的 UART、PWM、电池监测与 GPIO 实战指南

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*MHZ

IMU 实例化与旋转方向:

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 1

2. 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 NODMA

Telem1(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_PROTOCOLSERIAL5_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_SENSPC2 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_BUSGPS_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 32

bootloader 从 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 copterwaf 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_ORDERI2C_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 9:42:34

轻量级分布式日志标记追踪:traceId 生成、MDC 注入与跨服务透传实战

简介:这是一款面向Java开发者的轻量级分布式日志标记与链路追踪工具,专为微服务、Dubbo RPC等分布式场景设计,可帮研发人员在排查跨服务请求时快速串联日志、定位慢调用与异常源头。资源包共124个文件,以76个Java源码文件为主干&a…

作者头像 李华
网站建设 2026/9/14 9:41:35

AICoding元数据驱动开发框架与高效实践

1. AICoding快速开发的核心挑战在软件开发领域,AICoding正逐渐成为提升效率的新范式。但许多团队在实际应用中常遇到两个核心痛点:开发速度不够快,以及AI生成的代码质量不稳定。这就像让一位天才画家用左手作画——虽然天赋仍在,但…

作者头像 李华
网站建设 2026/9/14 9:40:01

零基础转行AI的5个实操方向与就业路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华