diff --git a/README.md b/README.md index 02f9ce8..be8d0fc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # STM8 Bootloader Template Project +(English | [中文](README_zh.md)) + ## Overview This project provides a flexible bootloader implementation for STM8 microcontrollers using the SDCC compiler. The bootloader resides in the option bytes reserved area and enables in-application programming (IAP) capabilities via UART communication. diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..a2408b3 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,181 @@ +# STM8 Bootloader 模板项目 + +([English](README.md) | 中文) + +## 概述 + +本项目为 STM8 微控制器提供了一个灵活的 Bootloader 实现,使用 SDCC 编译器进行编译。Bootloader 存储在选项字节保留区域,支持通过 UART 通信进行在应用编程(IAP)功能。 + +注意:本 Bootloader 实现基于并受 [STM8uLoader](https://github.com/ovsp/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. **阶段 1(Boot1)**: + - 从选项字节(0x480E-0x483F)复制 Boot1 到 RAM 并运行 + - 通过 UART 发送同步序列 `0x00 0x0D` + - 等待 PC 端发送 Boot2 代码 + +3. **阶段 2(Boot2)**: + - 接收并验证来自 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 获取响应。在超时期限内,执行流程将进入主应用程序。 + +## 项目构建 + +### 先决条件 +- 已安装 SDCC(Small Device C 编译器) +- stm8flash 或类似的编程工具 +- Python 3.x(用于 PC 端工具) + +### 编译选项 + +启用 Bootloader 支持: +```bash +make ENABLE_OPTION_BOOTLOADER=1 +``` + +禁用 Bootloader(直接执行应用程序): +```bash +make ENABLE_OPTION_BOOTLOADER=0 +``` + +### 构建目标 +```bash +# 构建应用程序和 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 发送带有适当参数的命令 + +## 使用示例 + +### 编程新固件 +```bash +# 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 区域 + +## 参考资料 + +- [STM8uLoader](https://github.com/ovsp/STM8uLoader) +- [STM8S 参考手册](https://www.st.com/resource/en/reference_manual/cd00190271-stm8s-series-and-stm8af-series-8bit-microcontrollers-stmicroelectronics.pdf) +- [STM8 CPU 编程手册](https://www.st.com/resource/en/programming_manual/cd00161709-stm8-cpu-programming-manual-stmicroelectronics.pdf) +- [SDCC 用户指南](http://sdcc.sourceforge.net/doc/sdccman.pdf) +- [STM8 Bootloader AN2659](https://www.st.com/resource/en/application_note/cd00173937-stm8-swim-communication-protocol-and-debug-module-stmicroelectronics.pdf) + +--- + +**注意**:本实现用于教育和开发目的。在部署前,请务必在您的具体应用场景中验证 Bootloader 行为。