Files
stm8loader/README_zh.md
2026-01-04 15:47:29 +08:00

5.8 KiB
Raw Permalink Blame History

STM8 Bootloader 模板项目

(English | 中文)

概述

本项目为 STM8 微控制器提供了一个灵活的 Bootloader 实现,使用 SDCC 编译器进行编译。Bootloader 存储在选项字节保留区域,支持通过 UART 通信进行在应用编程IAP功能。

注意:本 Bootloader 实现基于并受 STM8uLoader 项目的启发,为了集成到本模板结构中进行了重大修改和增强。

特性

  • 三阶段 Bootloader

    • Boot0用于加载 Boot1 的复位/TRAP 中断服务程序
    • Boot1存储在选项字节保留区的最小化 Bootloader
    • Boot2通过串口通信加载的完整功能 Bootloader
  • 灵活配置

    • 通过 Makefile 宏 ENABLE_OPTION_BOOTLOADER 启用/禁用 Bootloader
  • 完整工具链

    • PC 端编程工具,支持固件更新
    • 支持读、写、跳转和执行操作
  • 安全操作

    • Bootloader 完整性受选项字节保护
    • 超时或通信失败时回退到主应用程序

Bootloader 参考

本项目的 Bootloader 实现源自 ovsp 开发的优秀 STM8uLoader 项目。主要改进包括:

  • 集成到模块化的模板项目结构中
  • 三阶段 Bootloader 方法Boot1 在选项字节中Boot2 动态加载)
  • 增强的 Makefile 系统和配置宏
  • 扩展的命令集和错误处理

Bootloader 操作流程

  1. 上电/复位

    • MCU 从复位向量0x8000开始执行
    • 控制权转移到 bootloader_enter()
  2. 阶段 1Boot1

    • 从选项字节0x480E-0x483F复制 Boot1 到 RAM 并运行
    • 通过 UART 发送同步序列 0x00 0x0D
    • 等待 PC 端发送 Boot2 代码
  3. 阶段 2Boot2

    • 接收并验证来自 PC 的 Boot2 代码
    • 执行 Boot2提供完整的命令接口
    • 处理 PC 端的编程、读取和设备控制命令
  4. 应用程序启动

    • 在成功编程或超时后跳转到主应用程序0x8004
    • 可选择停留在 Bootloader 模式进行调试

Bootloader 集成

  1. 主应用程序包含 bootloader.h,该文件将 TRAP 中断向量重定向到 bsp/boot0.c 中的 bootloader_enter()

  2. 在构建过程中Makefile 交换复位向量0x8000和陷阱向量0x8004的位置。这确保启动时首先执行 Bootloader 入口程序。

  3. 它通过 UART1 发送握手信号(0x00 0x0D)并等待约 200ms 获取响应。在超时期限内,执行流程将进入主应用程序。

项目构建

先决条件

  • 已安装 SDCCSmall Device C 编译器)
  • stm8flash 或类似的编程工具
  • Python 3.x用于 PC 端工具)

编译选项

启用 Bootloader 支持:

make ENABLE_OPTION_BOOTLOADER=1

禁用 Bootloader直接执行应用程序

make ENABLE_OPTION_BOOTLOADER=0

构建目标

# 构建应用程序和 Bootloader 选项
make all

# 编程设备(需要 stm8flash
make flash

选项字节配置

Bootloader 使用保留的选项字节区域进行存储:

地址范围 内容 大小
0x4800-0x480A 设备选项字节 11 字节
0x480D-0x483F Boot1 代码 51 字节

重要提示:这些地址是针对 STM8S103/003 的。对于其他 STM8 型号需要相应调整。

PC 通信协议

连接参数

  • 波特率128000 bps
  • 数据位8
  • 校验位:无
  • 停止位1

命令集

命令 操作码 描述
CMD_READ 0xF1 从设备读取内存
CMD_WRITE 0xF2 向设备写入内存
CMD_GO 0xF3 跳转到指定地址执行
CMD_EXEC 0xF4 执行机器码

通信序列

  1. Boot1 发送同步字节:0x00 0x0D
  2. PC 响应 Boot2 反向字节
  3. Boot1 接收 Boot2 并校验和
  4. Boot2 执行并准备接收命令
  5. PC 发送带有适当参数的命令

使用示例

编程新固件

# 1. 构建应用程序
make flash

# 2. 进入交互模式
python scripts/stm8loader.py /dev/ttyUSB0

# 3. 使用命令行:
python scripts/stm8loader.py /dev/ttyUSB0 --write 0x8000 firmware.bin

支持的设备

当前已测试:

  • STM8S103/003默认配置

重要提示:移植到其他 STM8 型号需要验证外设寄存器定义

故障排除

常见问题

  1. 设备无响应

    • 验证波特率设置
    • 检查 UART 引脚连接TX/RX 是否接反?)
    • 确保选项字节已正确编程
  2. Bootloader 未启动

    • 验证编译时是否设置了 ENABLE_OPTION_BOOTLOADER
    • 检查 main.c 是否包含 bootloader.h
    • 检查 bsp/boot0.c
    • 确认选项字节配置

安全注意事项

  1. 电源稳定性:确保编程期间电源稳定
  2. 看门狗定时器:在 Bootloader 中禁用或正确处理看门狗
  3. 中断:在 Bootloader 操作期间保存/恢复中断上下文
  4. 内存保护:切勿覆盖选项字节中的 Bootloader 区域

参考资料


注意:本实现用于教育和开发目的。在部署前,请务必在您的具体应用场景中验证 Bootloader 行为。