STC8PROG – Linux下的 STC8G STC8H 燒錄工具

STC8PROG – Linux下的 STC8G STC8H 燒錄工具

動機

在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位元組消失的情況, 還是串口屬性配置的問題, 需要關閉流控. 之後就是無聊且費時的掃尾工作, 整理程式碼, 美化輸出, 整理文檔, 建倉庫, 包括寫這篇記錄.

結果

在Ubuntu20.04下測試的, 理論上支援所有X86 64位的Linux環境, 經過測試可用的型號: STC8G1K08A, STC8H1K08, STC8H3K32S2, STC8H3K64S4, STC8A8K64D4, 測試失敗的型號: STC8A8K64S4A12, 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

從源碼構建

安裝 DEV-tools

sudo apt install build-essential

檢出項目

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

編譯

cd stc8prog
make

聲明

程式碼使用Apache-2.0授權, 雖然軟體並不修改硬體參數, 燒錄使MCU變磚的概率極小, 但不專業的操作以及各種意外情況依然存在變磚或者冒煙的可能性, 所以請謹慎操作, 本人不對閱讀及使用此軟體造成的任何直接的或間接的權益損害負責.