🤖 roboto_origin_03 Wiki
首页 / 固件 / 硬件架构与接口规范

roboto_usb2can 是一款面向机器人系统调试与总线分析的单通道 CAN 转 USB 适配器,其硬件设计围绕 STM32G431CBT6 微控制器展开,通过 Zephyr RTOS 的设备树(DeviceTree)机制将 MCU 外设、GPIO 引脚分配及收发器拓扑进行结构化抽象。本文档从第一性原理出发,系统阐述核心处理器选型逻辑、时钟树设计、引脚映射规范以及板级硬件抽象层(Board Support Package)的组织方式,为固件开发、硬件二次设计及故障排查提供权威的接口参考。

Sources: roboto_usb2can.dts

系统架构概览

适配器采用经典的 "MCU + 隔离收发器 + USB 设备" 三段式架构。主控 STM32G431CBT6 通过内部全速 USB PHY 与上位机建立 USB 2.0 连接,同时利用 FDCAN1 外设与 TI ISO1050 隔离收发器耦合至 CAN 总线。三颗独立 LED 分别由 GPIO 直接驱动,形成 USB 状态、CAN 状态与总线活动的三维视觉反馈。整个系统的时钟由片内 PLL 统一衍生,确保 USB 与 CAN 外设具备独立且稳定的时钟源。

graph TD
    subgraph MCU["STM32G431CBT6"]
        PLL["PLL 时钟树<br/>SYSCLK 160MHz"]
        USB["USB 2.0 FS<br/>PA11/PA12"]
        FDCAN["FDCAN1<br/>PB8/PB9"]
        GPIO["GPIO 控制器"]
        TIM["TIM2 计数器<br/>1MHz 时间戳"]
    end
    subgraph PHY["物理层"]
        USB_PHY["Type-C 接口"]
        ISO1050["TI ISO1050<br/>隔离收发器 ×2"]
        LEDS["三通道 LED<br/>蓝/绿/黄"]
    end
    subgraph BUS["总线接口"]
        HOST["USB Host<br/>WinUSB / SocketCAN"]
        CAN["CAN 总线<br/>CAN 2.0 / CAN FD"]
    end
    PLL --> USB
    PLL --> FDCAN
    USB --> USB_PHY --> HOST
    FDCAN --> ISO1050 --> CAN
    GPIO --> LEDS
    GPIO --> ISO1050
    TIM -.-> USB

Sources: roboto_usb2can.dts

核心处理器与存储器

主控芯片选用 STM32G431CBT6(Cortex-M4 + FPU),其官方标称最高主频为 170 MHz,但本设计出于功耗与 USB 时钟匹配的考量,将系统时钟稳定配置在 160 MHz。该 MCU 集成 128 KB Flash 与 32 KB SRAM,足以承载 Zephyr RTOS 内核、CANnectivity gs_usb 协议栈及应用程序代码。板级描述文件将架构标识为 arm,并支持 zephyrgnuarmemb 两套工具链,为持续集成与交叉编译提供灵活性。

参数 规格 备注
MCU STM32G431CBT6 Cortex-M4 + FPU
Flash 128 KB 固件存储
SRAM 32 KB 运行时数据
最高主频 170 MHz 设计运行 160 MHz
架构 ARMv7E-M Thumb-2 指令集
工具链 Zephyr SDK / GNU Arm Embedded 官方 west 构建支持

Sources: roboto_usb2can.yaml

时钟树与总线架构

时钟系统是嵌入式硬件的"血液循环"。本设计以 HSI 16 MHz 作为 PLL 输入基准,经分频/倍频后产生三个关键输出:PLL_R(160 MHz)驱动系统总线,PLL_Q(80 MHz)供给 FDCAN1 外设,而 USB 48 MHz 时钟则由独立的 HSI48 直接提供,避免 PLL 抖动对 USB 信号完整性的影响。AHB、APB1、APB2 总线预分频均设为 1,因此所有总线外设均运行在 160 MHz 的同频域下,简化了定时器与外设波特率的计算。

graph LR
    HSI["HSI 16MHz"] --> PLL["PLL<br/>M=4, N=80<br/>VCO=320MHz"]
    PLL --> R["PLL_R ÷2<br/>160 MHz<br/>→ SYSCLK"]
    PLL --> Q["PLL_Q ÷4<br/>80 MHz<br/>→ FDCAN1"]
    PLL --> P["PLL_P ÷2<br/>160 MHz<br/>→ ADC"]
    HSI48["HSI48 48MHz"] --> USB["USB CLK48"]
    R --> AHB["AHB<br/>160 MHz"]
    AHB --> APB1["APB1<br/>160 MHz"]
    AHB --> APB2["APB2<br/>160 MHz"]
时钟节点 频率 消费者
SYSCLK PLL_R 160 MHz CPU / AHB / APB1 / APB2
FDCAN1 PLL_Q 80 MHz CAN 控制器位时序引擎
USB 48MHz HSI48 48 MHz USB 全速 PHY
LPTIM1 LSI ~32 kHz Zephyr 系统时钟 / 低功耗 tick

Sources: roboto_usb2can.dts

引脚映射与接口分配

所有外设引脚均通过 Zephyr 的 pinctrl 机制在设备树中显式声明,避免了传统寄存器配置中的"魔法数字"问题。下表汇总了适配器的关键引脚功能,这些定义直接决定了 PCB 布局与调试时的测量点选择。

功能域 信号 引脚 方向 有效电平 说明
USB DM PA11 I/O 内置全速 PHY 差分对
USB DP PA12 I/O 内置全速 PHY 差分对
CAN RX PB8 输入 FDCAN1 接收,5V 容忍
CAN TX PB9 输出 FDCAN1 发送,5V 容忍
LED Status / 蓝灯 PA15 输出 低电平有效 USB 系统状态
LED Activity / 绿灯 PA0 输出 低电平有效 CAN 数据收发活动
LED CAN / 黄灯 PA7 输出 低电平有效 CAN 总线状态
收发器 CAN-PHY0 使能 PC13 输出 低电平有效 ISO1050 #1 电源控制
收发器 CAN-PHY1 使能 PC14 输出 低电平有效 ISO1050 #2 预留使能

三颗 LED 均配置为 GPIO_ACTIVE_LOW,即引脚输出低电平时 LED 点亮。这种设计在 STM32 GPIO 默认上电浮空/高阻状态下可避免 LED 误亮,提升开机体验。值得注意的是,PC13 与 PC14 同时控制两片 ISO1050 的 STB(待机)引脚,尽管当前固件仅注册了单通道 FDCAN1,但硬件层面已为双 CAN 通道预留了收发器占位。

Sources: roboto_usb2can.dts

CAN 总线接口设计

CAN 侧采用 TI ISO1050 隔离收发器,支持最高 5 Mbps 的 CAN FD 物理层速率,并提供系统侧与总线侧的电气隔离。FDCAN1 控制器通过 PLL_Q 提供的 80 MHz 外设时钟运行,配合 Zephyr 的 CAN 子系统,可在主机端通过 gs_usb 协议实现 SocketCAN 级别的标准帧与扩展帧收发。设备树中 cannectivity 节点将 FDCAN1 绑定为 channel0,并关联蓝灯作为状态灯、绿灯作为活动灯,形成硬件与固件语义的统一。

graph LR
    STM32["STM32 FDCAN1<br/>80MHz 时钟"] --> PB8["PB8 RX"]
    STM32 --> PB9["PB9 TX"]
    PB8 --> ISO["TI ISO1050"]
    PB9 --> ISO
    PC13["PC13 使能<br/>GPIO_ACTIVE_LOW"] --> ISO
    ISO --> CANH["CAN_H"]
    ISO --> CANL["CAN_L"]
    ISO --> GND_ISO["隔离地"]

Sources: roboto_usb2can.dts

USB 设备接口

USB 接口采用 USB 2.0 Full Speed(12 Mbps) 规格,通过 Type-C 连接器与上位机通信。设备树中兼容标识设置为 candlelightfd,配合厂商 ID 0x1D50 与产品 ID 0x606F,确保与 candleLight 生态的驱动兼容性。固件在 USB 描述符层面实现了 Microsoft OS 2.0(MSOS 2.0) 平台描述符,包含 WinUSB 兼容 ID 与 GUID {c6e515a2-8dc6-4fc4-a03c-9325555d68e6},使得 Windows 8.1 及以上系统可免驱动自动识别设备。

sequenceDiagram
    participant Host as Windows Host
    participant Dev as roboto_usb2can
    Host->>Dev: GET_DESCRIPTOR (DEVICE)
    Dev-->>Host: Device Descriptor (bcdUSB=2.0.1)
    Host->>Dev: GET_DESCRIPTOR (BOS)
    Dev-->>Host: BOS + MSOS 2.0 Platform Desc
    Host->>Dev: Vendor Request 0x01 (MSOS 2.0)
    Dev-->>Host: MSOS 2.0 Descriptor Set<br/>WinUSB Compatible ID + GUID
    Host->>Dev: WinUSB Driver Bind

Sources: main.c, roboto_usb2can.h

状态指示硬件

适配器板载三颗 LED,分别对应三个正交的状态维度:蓝色指示 USB 层生命周期,黄色指示 CAN 总线健康度,绿色指示总线实时流量。LED 的硬件连接全部落在 GPIOA 端口(PA0、PA7、PA15),便于利用 Zephyr 的 gpio-leds 子系统进行统一抽象。这种"一灯一域"的设计策略,使得开发者在不连接上位机的情况下,仅凭视觉即可快速定位故障域——例如蓝灯快速闪烁代表 USB 握手异常,黄灯慢闪提示 CAN 总线处于错误警告态。具体的闪烁时序与状态机转换逻辑将在 状态指示与 LED 控制系统 中深入剖析。

Sources: roboto_usb2can.dts, led.c

调试与烧录接口

硬件调试接口采用标准的 SWD(Serial Wire Debug) 协议,板级 OpenOCD 配置文件默认选用 CMSIS-DAP 调试器,适配器速率设为 4 MHz。为兼顾不同开发者的工具链习惯,board.cmake 中注册了五种官方烧录器支持:J-Link、PyOCD、OpenOCD、STM32CubeProgrammer(推荐配合 STLINK-V3MINIE)以及 probe-rs。这种多 runner 策略意味着无论您使用商业调试器还是开源工具链,均可通过 west flash --runner <runner> 一键完成固件部署,无需手动维护烧录脚本。

烧录工具 目标芯片参数 接口
J-Link STM32G431CB SWD
PyOCD stm32g431cbtx SWD
OpenOCD stm32g4x CMSIS-DAP / SWD
STM32CubeProgrammer SWD + 硬件复位
probe-rs STM32G431CBTx SWD

Sources: openocd.cfg, board.cmake

设备树板级抽象

在 Zephyr 构建体系中,硬件的"真相来源"是设备树而非 C 源码。roboto_usb2can 的板级定义由四个关键文件协同构成:board.yml 声明板卡身份与 SoC 变体;Kconfig.roboto_usb2can 选中 SOC_STM32G431XX 配置符号;roboto_usb2can_defconfig 开启 GPIO、MPU 等基础内核选项;roboto_usb2can.dts 则最终以层次化节点的方式固化了引脚、时钟与外设拓扑。CMake 构建脚本通过 set(BOARD_ROOT ${CMAKE_CURRENT_LIST_DIR}) 将本目录注册为自定义板根,使得 west build -b roboto_usb2can 能够正确定位上述板级文件,实现应用代码与硬件描述的彻底解耦。

Sources: board.yml, CMakeLists.txt

固件版本与构建标识

硬件能力最终通过固件版本呈现给用户。CMakeLists.txt 中定义了语义化版本号(当前主版本 3.0.0),并通过 configure_file 机制将版本注入到 version.h 中。该版本号同时以 ASCII 字符串与 BCD 编码两种形式存在:前者用于开机串口/日志输出,后者嵌入 USB 设备描述符的 bcdDevice 字段,使得上位机工具能够通过标准 USB 请求读取固件版本,实现多设备场景下的版本一致性校验。

Sources: CMakeLists.txt, version.h.in

延伸阅读

硬件架构是理解整个固件系统的基石。若您希望深入探究 Zephyr RTOS 的 USB 新栈(usbd_next)如何与 gs_usb 类驱动交互,以及 MSOS 2.0 描述符的注册流程,建议继续阅读 Zephyr RTOS 与 USB 协议栈。若您的关注点在 CAN 总线的错误帧监测、Bus-Off 自动恢复及错误洪水抑制策略,则可跳转至 CAN 总线监控与错误保护机制。对于 LED 状态机的具体实现细节,请参阅 状态指示与 LED 控制系统