zl程序教程

您现在的位置是:首页 >  其他

当前栏目

STC8PROG - Linux下的 STC8A, STC8F, STC8G, STC8H 烧录工具

2023-03-07 09:38:50 时间

动机

在Linux下用 VSCode + PlatformIO 做开发, 因为VSCode的界面字体代码提示, 以及自定义的类JetBrain风格快捷键, 开发体验非常好. 在这个环境下, 有两个基础工具链必不可少, 一个是SDCC, 另一个是stcgal. 前者是MCS-51的编译工具, 后者是用于STC系列MCU的烧录工具. 在前一阵开始使用STC8后, stcgal这个工具链掉链子了, 无法烧录STC8系列的芯片. 进一步了解后发现的几个问题:

PlatformIO 的 MCS-51 Platform 停止更新

PlatformIO 项目是活跃的, 但是这个平台模块子项目处于停滞状态, 项目地址 platformio/platform-intel_mcs51, 可以看到最后一次有效更新在14个月前, PR也一直未合并, pull/41. 在 MCS-51 Platform 上整合的 stcgal 还停留在 1.5 版本, 需要升级到 1.6 版本才能提供 STC8A 的支持. 好在这个问题可以通过手工升级解决, PlatformIO手工升级stcgal到1.6版本. 升级完之后, 可以对 STC8A8K64S4 写入了.

stcgal 停止更新

stcgal 1.6 只支持 STC8A8K64S4A12 和 STC8F 系列(后者未验证), 不支持 STC8G,STC8H,STC8A8K64D4系列.

stcgal项目地址 grigorig/stcgal, 可以看到最后一次有效更新在12个月前, PR也一直未合并. 也许作者已经放弃这个项目了. 这才是真正的问题, 因为没有其它可以在Linux下烧录这些STC8芯片的替代品. 所以后面几个月, 要写只能在Windows下用Keil MDK写, 太难用了.

成因

一周前我应该是不会去写的, 因为STC没公开协议, 如果自己通过逻辑分析仪去反向, 要花的时间没法估计, 加上对串口通信也不熟悉, 所以一直没有想法. 但是最近遇到的两个项目使得这件事可行了.

  • w80xprog John-sanpe/w80xprog, 这是一个C语言写的, Linux下的W806烧录工具, 使用termios做串口通信, 代码风格不错, 可以作为串口编程的参考.
  • stc.ninja aguegu/stc.ninja, 一个JS单页应用, 做STC8G/STC8H的串口烧录, 很遗憾这并不是开源项目, 但是在项目主页stc.ninja/上提供了一个信息, "Thankfully, there is a code sample for flash programming on STC8H datasheet, Page 978", 现在看到的手册应该已经更新过了, 实际页码对应不上, 但是可以确定是STC8H手册的附录N"使用第三方 MCU 对 STC8H 系列单片机
    进行 ISP 下载范例程序", 里面提供了完整的C代码, 用于实现STC MCU去烧录STC MCU, 这里面提供了启动握手, 切换波特率和烧录部分的协议细节. 虽然还缺乏信息解析和硬件设置的协议部分, 但是用于实现一个烧录过程足够了.

行动

  • 12月22日, 下午做了一些验证, 通过termios走通了启动响应, 但是设置波特率这步一直没成功
  • 12月23日, 上逻辑分析仪, 解决了昨天的问题, 因为串口设置要增加偶校验位, 后面又解决了0D被转换为0A导致校验失败的问题, 也是串口的属性配置. 还遇到了一个FF被接收为两个FF的问题, 这个在重新拔插USB2TTL后就消失了, 太坑人了. 在晚上出去同学聚会前, 已经将写入搞定了, 但是程序没跑起来, 和正确的流程比对了一下, 字节全部不对, 才发现还有一个HEX到BIN的转换问题. 晚上回来, 把这部分也改好了.
  • 12月24日, 对能找到的STC15和STC8系列都做了测试, 遇到了0x13字节消失的情况, 还是串口属性配置的问题, 需要关闭流控. 之后就是无聊且费时的扫尾工作, 整理代码, 美化输出, 整理文档, 建仓库, 包括写这篇记录.
  • 12月26日, 增加了STC型号数据库(从stcgal导出并加上stc8g, stc8h手册上的新型号), 优化代码结构, 增加了对STC8A/STC8C/STC8F系列的支持

结果

在Ubuntu20.04下测试的, 理论上支持所有X86 64位的Linux环境, 经过测试可用的型号: STC8G1K08A, STC8H1K08, STC8H3K32S2, STC8H3K64S4, STC8A8K64D4, 测试失败的型号: STC15F60S2, 不过这个是stcgal能支持的

代码已经上传, 可以自行编译, 也可以直接下载二进制可执行文件

使用

烧录时需要对MCU重新加电, 过程和stcgal, 以及Windows下的stc-isp工具是一样的. 使用中不需要指定芯片类型, 会自动检测.

参数列表

Usage: stc8prog [options]...
  -h, --help            display this message
  -p, --port <device>   set device path
  -s, --speed <baud>    set download baudrate
  -f, --flash <file>    flash chip with data from hex file
  -e, --erase           erase the entire chip
  -d, --debug           enable debug output
  -v, --version         display version information

Baudrate options: 
   4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000,
   921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000,
   4000000

检查

与MCU作握手通信, 过程不作任何写入. 过程中先通过2400波特率握手, 再切换到115200波特率握手

# 2400 baud -> 115200 baud
./stc8prog -p /dev/ttyUSB0

可以使用参数-s指定其它的波特率(必须在可选的波特率列表里)

# 2400 baud -> 1152000 baud
./stc8prog -p /dev/ttyUSB0 -s 1152000

擦除

擦除整块MCU

./stc8prog -p /dev/ttyUSB0 -e

烧录

建议在烧录时带上擦除参数

./stc8prog -p /dev/ttyUSB0 -e -f foo.hex

使用更高的波特率可以加速烧录

./stc8prog -p /dev/ttyUSB0 -s 1152000 -e -f foo.hex

集成到 PlatformIO

1. 添加到 packages 目录

PlatformIO的packages目录默认路径是 /home/[username]/.platformio/packages

  1. 在下面新建一个目录 tool-stc8prog
  2. 将可执行文件 stc8prog 复制到这个目录下

2. 配置 platformio.ini

在项目的platformio.ini中新建一个env, 可以用现有的env复制创建, 修改upload为custom, 并增加对应的配置参数, 下面是一个例子

[env:stc8h3k32s2-stc8prog]
platform = intel_mcs51
board = stc8h3k32s2
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_flags =
    -p
    $UPLOAD_PORT
    -s
    1152000
    -e
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE

如果需要将其设置为默认, 在 default_envs 中设置

[platformio]
default_envs = stc8h3k32s2-stc8prog

更多说明和配置项请参考文档 platformio section_env_upload

3. 运行并查看详细输出

以上面的stc8h3k32s2-stc8prog为例, 先执行编译生成hex,

  1. 点击左侧导航栏中PlatformIO的图标
  2. 在PROJECT TASKS中, 点击展开stc8h3k32s2-stc8prog
  3. 在里面点击展开 Advanced
  4. 点击 Verbose Upload, 这样会输出完整的命令行信息

如果烧录没问题, 之后就可以直接用Ctrl+Alt+U快捷键启动默认烧录.

正常的烧录输出

> Executing task in folder stc8h_test002: platformio run --target upload <

Processing stc8h3k32s2-stc8prog (platform: intel_mcs51; board: stc8h3k32s2)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/intel_mcs51/stc8h3k32s2.html
PLATFORM: Intel MCS-51 (8051) (1.2.3) > Generic STC8H3K32S2
HARDWARE: STC8H3K32S2 11MHz, 3.25KB RAM, 32KB Flash
PACKAGES: 
 - tool-stcgal 1.104.0 (1.4) 
 - toolchain-sdcc 1.30804.10766 (3.8.4)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 1 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <FwLib_STC8> 1.0
Building in release mode
Compiling .pio/build/stc8h3k32s2-stc8prog/src/main.rel
Compiling .pio/build/stc8h3k32s2-stc8prog/src/uart.rel
Linking .pio/build/stc8h3k32s2-stc8prog/firmware.hex
Checking size .pio/build/stc8h3k32s2-stc8prog/firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [          ]   1.0% (used 328 bytes from 32768 bytes)
Configuring upload protocol...
AVAILABLE: custom, stcgal
CURRENT: upload_protocol = custom
Uploading .pio/build/stc8h3k32s2-stc8prog/firmware.hex
Loading hex file:    Loaded 321 bytes between: 0000 to 0140
Opening port /dev/ttyUSB0: done
Waiting for MCU, please cycle power: .......................detected
Chip model: STC8A8K64S4A12
Protocol: STC8A/8F
Switching to 1152000 baud, chip: set, host: set, ping: succ
Erasing chip: done
Writing flash, size 321: 0x0 - 0x80 - 0x100 - done
================================================================ [SUCCESS] Took 7.89 seconds

Environment           Status    Duration
--------------------  --------  ------------
stc8h3k32s2-stc8prog  SUCCESS   00:00:07.889
================================================================ 1 succeeded in 00:00:07.889

从源码构建

安装 DEV-tools

sudo apt install build-essential

检出项目

# GitHub
git clone https://github.com/IOsetting/stc8prog.git
# Gitee
git clone https://gitee.com/iosetting/stc8prog.git

编译

cd stc8prog
make

声明

代码使用Apache-2.0授权, 虽然软件并不修改硬件参数, 烧录使MCU变砖的概率极小, 但不专业的操作以及各种意外情况依然存在变砖或者冒烟的可能性, 所以请谨慎操作, 本人不对阅读及使用此软件造成的任何直接的或间接的权益损害负责.

更新

  • 2021-12-26: STC8A8K64S4A12 的烧录也已经通过. 增加了对STC8A, STC8F, STC8C 系列的支持.
  • 2022-01-12: 增加对MCU固件版本和频率的显示, 增加对STC15部分芯片型号的烧录支持