目录

MS2612 BMC 控制器固件

面向星脑 AI 处理机 MS2612 系列的高可靠卫星 BMC 固件
基于 STM32F105RC · 支持双镜像 OTA · 插件式可扩展星务协议 · MIT 许可证


目录


项目简介

本项目是星脑 AI 处理机(MS2612 系列)的 BMC(Baseboard Management Controller)控制器固件,运行于 STM32F105RC 微控制器,负责卫星数据处理机的通用平台管理。它为 MS2612/MS2612A/MS2612C/MS2612D 等硬件变体提供电源管理、星务通信、工作模式管理、状态监测、故障恢复、GPU 刷机与在线升级等能力。

设计目标是在资源受限的嵌入式环境中(256 KB Flash、64 KB SRAM),提供一套稳定、可维护、可远程升级的卫星载荷 BMC 方案。固件采用 FreeRTOS 多任务调度、STM32 HAL 驱动、双镜像冗余启动与 CRC 校验机制,确保在卫星复杂工况下保持高可用性。


功能特性

功能域 说明
电源管理 基于 Moore 状态机的 GPU 电源控制(SHUTDOWN / POWER_UP / RUNNING / POWER_DOWN / FAULT / FAILURE),支持温度保护、看门狗、启动超时与过流保护。
星务通信 支持 HSS(航升卫星)与 HIT(工大卫星)两种 IBC 协议,通过 CAN / I2C 与星务主机交互。
状态监测 多路电源轨电压、电流、功率采样;温度监测;接口运行统计。
故障恢复 自动温度保护、GPU 看门狗超时重启、启动失败重试与失败锁定,支持状态持久化。
双镜像 OTA Image1 与 Image2 双热备镜像,配合 Bootloader 实现安全固件升级,升级过程中断电不砖。
GPU 刷机 支持 FORCE_RECOVERY 引脚控制与 GPU 强制恢复模式。
USB 调试 内置 USB CDC 虚拟串口,支持 AT 指令与 UART1 双向透传。
环境变量 基于 EasyFlash 的 Flash 环境变量持久化,可通过 AT 指令或 IBC 协议动态配置。
RTC 时钟 外部 32.768 kHz 晶振,支持时间设置与保持。

硬件平台

  • MCU:STM32F105RCTx(ARM Cortex-M3,72 MHz,256 KB Flash,64 KB SRAM)
  • 适用硬件:MS2612 / MS2612A / MS2612C / MS2612D
  • 通信接口
    • 3 路 USART(115200-8N1)
    • 2 路 CAN(500 kbps)
    • 2 路 I2C(100 kHz / 400 kHz)
    • 1 路 SPI(从机模式)
    • 1 路 USB FS(CDC-ACM 虚拟串口)
  • 模拟量:7 通道 ADC 扫描(电源轨电压 / 电流 + 内部温度 + 参考电压)
  • 实时时钟:LSE 32.768 kHz,带闹钟输出
  • 看门狗:独立看门狗 IWDG,超时约 4 秒

更详细的引脚配置、时钟树和外设参数请参阅 doc/HARDWARE_zh.md


系统架构

graph TB
    subgraph 主机侧
        HOST[星务主机 / 调试 PC]
    end

    subgraph MS2612 BMC
        APP[应用固件
FreeRTOS + HAL] BL[Bootloader
32 KB] APP --> PWR[power 状态机] APP --> SLV[IBC 从机层
HSS / HIT] APP --> SENSOR[传感器与采样] APP --> ENV[环境变量 EasyFlash] APP --> VCP[USB CDC VCP] APP --> UART[UART 驱动] APP --> CAN_DRV[CAN 驱动] APP --> I2C_DRV[I2C 驱动] APP --> RTC_DRV[RTC] APP --> LOGGER[日志系统] end subgraph 被管对象 GPU[GPU / SOM 模块] end HOST -.->|CAN / I2C| SLV HOST -.->|USB CDC| VCP VCP -.->|AT 指令 / 透传| UART UART -->|串口| GPU PWR -->|SOM_SHUTDOWN / RESET / RECOVERY| GPU SLV -->|电源目标| PWR SENSOR -->|温度 / 电压 / 电流| PWR
graph LR
    SHUTDOWN[GPU_SHUTDOWN] -->|power_target=1 & 无故障| POWER_UP[GPU_POWER_UP]
    POWER_UP -->|启动完成| RUNNING[GPU_RUNNING]
    POWER_UP -->|超时 / 故障| POWER_DOWN[GPU_POWER_DOWN]
    RUNNING -->|故障 / 关机请求| POWER_DOWN
    POWER_DOWN -->|正常关机| SHUTDOWN
    POWER_DOWN -->|故障且目标仍开机| FAULT[GPU_FAULT]
    FAULT -->|恢复时间到 & 无故障| POWER_UP
    FAULT -->|连续失败达上限| FAILURE[GPU_FAILURE]
    FAILURE -->|重新请求开机| SHUTDOWN
    FAILURE -->|请求关机| SHUTDOWN

软件组件

组件 源文件 说明
电源状态机 Core/Src/power.c GPU 电源状态管理、故障聚合、GPIO 时序控制。
IBC 协议层 Core/Src/hss/Core/Src/hit/ HSS 与 HIT 两种星务协议从机实现。
通信抽象 Core/Src/message.cCore/Src/fifo.c 协议消息解析与通用 FIFO。
串口驱动 Core/Src/uart.cCore/Src/uart_cfg.c 3 路 UART 的 FIFO + DMA 封装。
CAN 驱动 Core/Src/can.c 双路 CAN 帧收发与统计。
I2C 从机 Core/Src/i2c_slave.cCore/Src/i2c_memory.c I2C 从机寄存器模型与回调。
Flash 环境变量 Core/Src/env.cMiddlewares/EasyFlash 持久化环境变量,支持磨损均衡。
USB 虚拟串口 Core/Src/vcp.cCore/Src/io_on_cdc.c USB CDC ↔ UART1 透传 + AT 指令处理。
AT 指令 Core/Src/at_cmd.c 运行时调试与参数配置命令。
传感器采样 Core/Src/sensor.cCore/Src/ina226.c 温度、电压、电流与功率采样。
GPU 恢复 Core/Src/gpu_recovery.cCore/Src/gpu_stats.c GPU 强制恢复与统计。
Bootloader Core/Src/bootloader.c 双镜像验证与跳转。
日志 Core/Src/logger.c 分级日志输出。
RTC Core/Src/rtc.c 实时时钟读写。
版本生成 Core/Src/version.c 基于 git 信息的自动版本号。

构建系统

依赖要求

工具 版本要求 说明
交叉编译器 arm-none-eabi-gcc >= 10.0 ARM Cortex-M 编译工具链
CMake >= 3.22 构建系统生成
Ninja >= 1.10 构建加速器
Python3 >= 3.6 镜像头 CRC 生成与合并脚本
STM32CubeCLT / OpenOCD / st-flash 任意 烧写与调试

Linux 安装示例

sudo apt-get install cmake ninja-build gcc-arm-none-eabi python3

macOS

brew install cmake ninja arm-none-eabi-gcc python3

Windows 推荐使用 STM32CubeCLT(已包含 arm-none-eabi-gcc、CMake、Ninja)。

构建目标

预设 用途 说明
Debug 开发调试 固定位于 0x08000000,含调试符号
Release 正式发布 固定位于 0x08000000,-Os 优化
Image1 应用镜像1 重定位至 0x08008000,含 CRC 头,与 Bootloader 配合使用
Image2 应用镜像2 重定位至 0x08024000,含 CRC 头,与 Bootloader 配合使用
Bootloader 引导加载程序 固定位于 0x08000000,32KB,与应用固件一同构建

Flash 存储布局

STM32F105RC 共有 256KB Flash,按以下方式分区:

地址范围                  大小    用途
──────────────────────────────────────────────────────────
0x08000000 - 0x08007FFF   32KB   Bootloader
0x08008000 - 0x08023FFF  112KB   Image1(含镜像头 + 应用代码)
0x08024000 - 0x0803FFFF  112KB   Image2(含镜像头 + 应用代码)

Bootloader 工作原理

Bootloader 源码已集成在本项目中,通过 Bootloader 预设独立编译,烧写至 Flash 首 32KB。

上电复位后的执行流程:

  1. 从 0x08000000 启动,初始化时钟和 Flash
  2. 依次读取 boot_table 中预定义地址处的镜像头(先 Image1,后 Image2)
  3. 对每个镜像头执行以下验证:
    • 检查魔数 0x665599AA
    • 检查 rom_base 是否与目标地址一致
    • 验证头部 CRC-32(0x3C 字段)
    • 逐段验证应用数据 CRC-32
  4. 选择所有验证通过的镜像中版本号(uint32)最大的一个
  5. 关闭中断、清除 NVIC 状态,设置 MSP,跳转至该镜像的入口地址执行
  6. 若两个镜像均验证失败,Bootloader 停留(等待在线烧写)

容错机制:Image1 和 Image2 互为热备份。若 OTA 升级写入一个镜像时发生断电, 另一个完整镜像仍可被 Bootloader 选中启动,不会导致变砖。

镜像头格式

二进制文件中插入了一个头,Bootloader 和固件工具通过它读取构建信息。其内容如下:

# hd ms2612_f105.bin | head  
00000000  aa 99 55 66 b6 fa 6b 68  00 80 00 08 00 c0 01 00  |..Uf..kh........|  
00000010  58 c7 00 08 00 82 00 08  2c 24 01 00 b5 73 51 90  |X.......,$...sQ.|  
00000020  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000030  ff ff ff ff ff ff ff ff  ff ff ff ff a4 36 38 96  |.............68.|  
00000040  42 75 69 6c 64 3a 20 4a  75 6c 20 20 39 20 32 30  |Build: Jul  9 20|  
00000050  32 35 20 31 36 3a 32 30  3a 31 32 20 52 65 76 3a  |25 16:20:12 Rev:|  
00000060  20 30 34 32 37 65 39 34  20 32 30 32 35 2d 30 37  | 0427e94 2025-07|  
00000070  2d 30 38 20 30 30 3a 34  39 3a 35 38 20 2b 30 38  |-08 00:49:58 +08|  
00000080  30 30 20 63 6c 65 61 6e  00 ff ff ff ff ff ff ff  |00 clean........|  
00000090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  

64字节的头包含多个以小端序排列的uint32字段:

偏移量        字段  
0x0            魔数0x665599aa  
0x4            版本号  
0x8         ROM段基址  
0xc            ROM段长度  
0x10        入口地址  
0x14        段0地址  
0x18        段0长度  
0x1c        段0 CRC-32校验值  
0x20        段1地址  
0x24        段1长度  
0x28        段1 CRC-32校验值  
0x2c        段2地址  
0x30        段2长度  
0x34        段2 CRC-32校验值  
0x38        保留  
0x3C        头CRC-32校验值  
0x40        信息文本块  

对于重定位配置(Image1 和 Image2),头位于 .bin 文件的开头(偏移 0x0)。 对于 Debug 和 Release 配置,为保持格式兼容性,头被保留并放置在向量表后的 0x200 偏移位置。

镜像版本号

版本号字段(偏移 0x4)为无符号 32 位整数,格式自定义。Bootloader 按照数值大小比较,选择数值最大的有效镜像启动。版本号由构建系统从 git 信息自动生成,写入镜像头。

快速开始

Linux / macOS

# 1. 构建全部预设(自动合并为 flash_rom.hex / flash_rom.bin)
./scripts/build.sh all

# 2. 单独构建某个预设
./scripts/build.sh Debug

# 3. 选择 HIT 协议构建
./scripts/build.sh all -DPROTOCOL=HIT

# 4. 清理构建目录
./scripts/clean.sh all

Windows(PowerShell)

# 构建全部预设并自动合并
.\build.ps1 all

# 选择 HIT 协议
.\build.ps1 all -DPROTOCOL=HIT

# 清理
.\clean.ps1 all

构建产物位于对应预设目录下,例如:

  • Debug/ms2612_f105.elfDebug/ms2612_f105.bin
  • Image1/ms2612_f105.hexImage2/ms2612_f105.hex
  • flash_rom.hexflash_rom.bin(合并后的完整固件)

固件部署

烧写方式

合并完整固件后烧写

# 使用 STM32CubeProgrammer CLI
STM32_Programmer_CLI -c port=SWD -w flash_rom.hex -v -rst

# 使用 st-flash
st-flash --format ihex write flash_rom.hex

# 使用 OpenOCD
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg \
    -c "program flash_rom.hex verify reset exit"

单独烧写应用镜像(OTA 升级)

# 烧写 Image1 到 0x08008000
STM32_Programmer_CLI -c port=SWD -w Image1/ms2612_f105.hex -v -rst

详细烧写与合并流程请参阅 doc/BUILD_zh.md


使用指南

AT 指令调试

MCU 固件通过 USB CDC(虚拟串口)接收 AT+ 指令并执行相应操作。每条指令以换行符 \n 结尾。支持的指令包括:

指令 功能
AT+RECOVERY 强制 GPU 恢复
AT+RESET 系统复位
AT+POWERON GPU 上电
AT+POWEROFF GPU 断电
AT+SHUTDOWN GPU 立即关机
AT+ENV=<key> / AT+ENV=<key>,<value> 查询 / 设置环境变量
AT+ENV? 查询全部环境变量
AT+PWRSTAT 打印 GPU 电源状态与故障标志
AT+TASKSTATS 打印 FreeRTOS 任务统计
AT+IFSTAT 打印外设接口状态
AT+SENSORS 打印温度与电源轨采样
AT+GETTIME 获取 RTC 时间
AT+SETTIME<yyyymmddHHMMSS> 设置 RTC 时间
AT+VERSION 打印固件版本信息

完整指令说明与参数范围请参阅 doc/AT_COMMANDS.md

USB 虚拟串口透传

USB CDC 下行数据(Host → MCU)默认透传到 UART1,用于与 GPU 串口通信;UART1 上行数据(GPU → MCU)通过 USB CDC 回传至主机。以 AT+ 开头的数据包被拦截为本地命令,不再转发到 UART1。

  • 默认波特率:115200-8N1
  • 包大小:USB FS Bulk 64 B/包
  • 关键缓冲:tx_buf / rx_buf 1000 B、UART FIFO 1024 B、CDC FIFO 1024 B

详细实现与性能限制请参阅 doc/USB_VCP_development_guide.md

环境变量

通过 AT+ENV 可配置的运行时参数包括:

键名 说明 默认值
log_lvl 日志输出级别 4
gpu_wdt GPU 看门狗超时(秒,0 禁用) 0
gpu_tmin / gpu_tmax 温度保护阈值(°C) -25 / 85
gpu_thyl / gpu_thyh 温度恢复迟滞(°C) 5 / 15
gpu_dst 开机默认 GPU 状态 1
ovc0 ~ ovc6 电源轨 0~6 过流保护阈值(mA) 0
gpu_put / gpu_pdt GPU 上电 / 下电超时(秒) 0 / 0
gpu_frt GPU 故障恢复等待时间(秒) 30
gpu_mfc GPU 最大连续启动失败次数 3
console USB ↔ UART 控制台透传使能 1

协议选择

通过 CMake 参数 PROTOCOL 选择 IBC 协议类型:

PROTOCOL 值 定义的宏 协议说明
HSS HSS_PROTOCOL HSS卫星协议
HIT HIT_PROTOCOL HIT卫星协议
# Linux / macOS
./scripts/build.sh Debug -DPROTOCOL=HIT

# Windows PowerShell
.\build.ps1 Debug -DPROTOCOL=HIT

默认值为 HSS。修改参数后需清理构建目录重新配置。


项目目录

ms2612_f105/
├── Bootloader/          # Bootloader 构建产物
├── Core/
│   ├── Inc/             # 应用头文件
│   ├── Src/             # 应用源文件
│   │   ├── hit/         # HIT 协议实现
│   │   ├── hss/         # HSS 协议实现
│   │   └── ...          # 各业务模块
│   └── Startup/         # 启动文件
├── cmake/               # 工具链与 CubeMX 生成的 CMake 配置
├── Debug/               # Debug 构建产物
├── doc/                 # 项目文档
├── Drivers/             # STM32 HAL / CMSIS 驱动
├── Image1/              # Image1 构建产物
├── Image2/              # Image2 构建产物
├── Middlewares/         # FreeRTOS、EasyFlash、USB 设备栈
├── Release/             # Release 构建产物
├── scripts/             # 构建、合并、CRC 脚本
├── USB_DEVICE/          # USB CDC 配置
├── CMakeLists.txt       # 主构建配置
├── CMakePresets.json    # CMake 预设
├── LICENSE              # MIT 许可证
├── README.md            # 英文 README
└── README_zh.md         # 中文 README(本文件)

相关文档


参与贡献

欢迎提交 Issue 与 Pull Request!贡献前请确认:

  1. 使用 arm-none-eabi-gcc 完成所有预设的构建验证;
  2. 保持 C11 代码风格,函数使用 snake_case,宏与常量使用 UPPER_SNAKE
  3. 不要破坏 STM32CubeMX 生成的 /* USER CODE BEGIN */ / /* USER CODE END */ 边界;
  4. 更新相关文档以反映变更。

详细代码规范请参阅 AGENTS.md


许可证

本项目采用 MIT 许可证 开源。

Copyright (c) 2025 Maiar Star / MS2612 Project Contributors.


致谢

本项目基于 STMicroelectronics STM32CubeF1 HAL 库、FreeRTOS、EasyFlash 与 ST USB 设备栈构建。感谢所有卫星载荷与 BMC 固件领域的开源贡献者。

关于

本项目是**星脑 AI 处理机(MS2612 系列)的 BMC(Baseboard Management Controller)控制器固件**,运行于 STM32F105RC 微控制器,负责卫星数据处理机的通用平台管理。它为MS2612A/C/D/E等硬件变体提供电源管理、星务通信、工作模式管理、状态监测、故障恢复、GPU 刷机与在线升级等能力。

1.5 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号