STC8G1K 8051-core
2026.06.24

以前、KEYESTUDIO Micro:bit V2ロボットを使った
micro:bit & Pico 拡張ボード
という記事を書きましたが、そこで気になっていたのが、このロボットカーに搭載されている8051系マイコンSTC8G1K08です。

micro:bitはI2Cを介してSTC8G1K08に制御命令を送信し、ST8G1K08はモーター駆動ICにPWM信号を送信してモーターの回転を制御していました。
枠内の16ピンICがSTC8G1K08、キャパシタを挟んで下にSTC8G1K08へのコード書込み用シリアルポート(TX,RX,GND,3V)が実装されています。
このチップに焼かれているコードは公開されていないので、変に書き込んでしまうと復元できません。
そこで同様のチップを用意しました。


STC8G1K08 51 マイクロコントローラーチップモジュール
- フラッシュメモリ: 8 KB
- SRAM: 1.25 KB
- 電源電圧: 1.9 V 〜 5.5 V
- 内蔵発振器: 高精度RC発振器内蔵(外付け水晶発振子不要)
- リセット回路: 内蔵(外付けリセット回路不要)
- A/Dコンバータ: 10ビット分解能
- PWM: 最大3系統
- 通信機能: UART、SPI、I2Cサポート
- 動作温度範囲: -40 ℃ 〜 +85 ℃
8051(MCS-51)は、1980年にインテルが開発した伝説的な8ビットマイクロコントローラ(MCU)です。
シンプルで優れたI/O制御能力を持ち、現在でも世界中の多くのメーカーがそのアーキテクチャを継承した互換チップを製造・販売しています。
STC8マイコンは、中国のSTCmicro社が製造する高性能な8ビットマイコンのシリーズです。
8051マイコンの命令セットと互換性があり、ソフトウェア資産を活用しやすいのが特徴です。
1.9V〜5.5Vの広範囲な電圧で動作するため、乾電池などでも動かしやすい仕様になっています。
上記モジュールのシリアル端子はスキーマからもわかるようにTXD→P3.1、RXD→P3.0に接続されています。
ここでは、CLI(Command Line Interface:コマンドラインインターフェース)でのビルド環境を構築します。
ソースコードのビルドには、PlatformIOを使用します。
Arduino開発環境構築 PlatformIO
ボード情報を確認します
$ pio boards STC8G1K
====================================================================
ID MCU Frequency Flash RAM Name
---------- ---------- --------- ----- ------ ------------------
STC8G1K08 STC8G1K08 11MHz 8KB 1.25KB Generic STC8G1K08
STC8G1K08A STC8G1K08A 11MHz 8KB 1.25KB Generic STC8G1K08A
STC8G1K08T STC8G1K08T 11MHz 8KB 1.25KB Generic STC8G1K08T
STC8G1K12 STC8G1K12 11MHz 12KB 1.25KB Generic STC8G1K12
STC8G1K12A STC8G1K12A 11MHz 12KB 1.25KB Generic STC8G1K12A
STC8G1K17 STC8G1K17 11MHz 17KB 1.25KB Generic STC8G1K17
STC8G1K17A STC8G1K17A 11MHz 17KB 1.25KB Generic STC8G1K17A
STC8G1K17T STC8G1K17T 11MHz 17KB 1.25KB Generic STC8G1K17T
プロジェクトを作成します
$ pio init -b STC8G1K08
Resolving STC8G1K08 dependencies...
Platform Manager: Installing intel_mcs51
Downloading [####################################] 100%
Unpacking [####################################] 100%
Platform Manager: intel_mcs51@2.2.0 has been installed!
Tool Manager: Installing platformio/toolchain-sdcc @ >=1.40100.0,<1.40401.0
UnknownPackageError: Could not find the package with 'platformio/toolchain-sdcc @ >=1.40100.0,<1.40401.0' requirements for your system 'linux_aarch64'
このエラーは、ARM64環境(Raspberry PiなどのLinux aarch64)において、
PlatformIOの公式レジストリに64bit版のコンパイラ(toolchain-sdcc)が用意されていないために発生します。
PlatformIOはARM64を完全にネイティブサポートしていないため、手動でコンパイラをインストールします。
※STC8シリーズのビルド環境は、オープンソースのSDCC(Small Device C Compiler)またはKeil C51を利用するのが一般的です。
Keil C51(ケイル)は米国 Keil Software社が開発した商用の51シリーズ互換マイクロコントローラ向けのC言語ソフトウェア開発システムでWindows用です。
プラットフォーム情報を開いて確認します
~/.platformio/platforms/intel_mcs51/platform.json
"version": "2.2.0",
"packages": {
"toolchain-sdcc": {
"type": "toolchain",
"owner": "platformio",
"version": ">=1.40100.0,<1.40401.0"
},
ARM64(AArch64)向けのSDCCのスナップショットビルドをSourceForge SDCCからダウンロードします。

SDCC - Snapshot Builds
$ tar -xjvf sdcc-snapshot-aarch64-linux-gnu-20260528-16555.tar.bz2
解凍すると sdccフォルダが作成され、その下に展開されます。
PlatformIOのフォルダ(通常は~/.platformio/packages/)に配置します。
$ mv sdcc ~/.platformio/packages
展開したディレクトリ名を toolchain-sdcc にリネームします
$ cd ~/.platformio/packages
$ mv sdcc toolchain-sdcc
SDCCのバージョンを確認します
$ ./toolchain-sdcc/bin/sdcc --version
SDCC : mcs51/z80/z180/r2k/r2ka/r3ka/r4k/r5k/r6k/sm83/tlcs90/ez80/z80n
/r800/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/
pdk15/mos6502/mos65c02/f8/f8l TD- 4.6.0 #16555 (Linux)
published under GNU General Public License (GPL)
展開したフォルダ内に package.json を作成します。
$ vi toolchain-sdcc/package.json
{
"name": "toolchain-sdcc",
"version": "4.6.0",
"description": "SDCC Toolchain for linux_aarch64",
"keywords": ["toolchain", "compiler", "sdcc"],
"homepage": "http://sourceforge.net",
"license": "GPL",
"system": ["linux_aarch64"]
}
プロジェクト情報にSDCCを追加します
$ vi platformio.ini
[env:STC8G1K08]
platform = intel_mcs51
board = STC8G1K08
platform_packages =
toolchain-sdcc@file:///home/pi/.platformio/packages/toolchain-sdcc
STC8Gシリーズの開発では、レジスタ操作が複雑な公式マニュアルに代わり、C言語で扱いやすいラッパーライブラリを使用するのが一般的です。

IOsetting/FwLib_STC8
$ git clone https://github.com/IOsetting/FwLib_STC8.git FwLib_STC8
FwLib_STC8-master
┣ demo
┣ include → ~/include に複写
┣ src → ~/lib に複写
┗ user
ラッパーライブラリのincludeディレクトリの中身をPlatformIOのプロジェクトディレクトリのincludeへ、
srcの中身をlibに複写します。
$ vi platformio.ini
[env:STC8G1K08]
platform = intel_mcs51
board = STC8G1K08
board_build.mcu = stc8g1k08
board_build.stcgal_protocol = stc8g
board_build.f_cpu = 11059200L
platform_packages =
toolchain-sdcc@file:///home/pi/.platformio/packages/toolchain-sdcc
build_flags =
-I./include
lib_deps =
./lib
board_upload.stcgal_protocol = stc8g
upload_protocol = stcgal
upload_flags =
-b 19200
FwLib_STC8のCソースを srcディレクトリに置きたくなかったので、lib_deps で libディレクトリを指定しています。
FwLib_STC8のdemoディレクトリ内にあるサンプルプログラムを用いて、赤と緑のLEDを交互に光らせてみます。
demo -> gpio -> led_blink -> blink_stc8g1k08a.c
/***
* Demo: STC8G1K08A LED Blink
* Pin connection:
* ___
* P5.4 -| |- P3.3 <-- LED --> 4.7KR -> GND
* 3.3V -> VCC -| |- P3.2 <-- LED --> 4.7KR -> GND
* P5.5 -| |- TX
* GND -> GND -|___|- RX
*/
ソースコード内の解説に従い、P3.3、P3.2にLEDを繋いで抵抗を介してGNDに落とします。
また、GND、RX、TXには、USBシリアル変換モジュールを繋ぎ、Rasperry Pi と接続します。
VCCはまだ繋ぎません(後述)。

#include "fw_hal.h"
void GPIO_Init(void)
{
// P3.2, P3.3
GPIO_P3_SetMode(GPIO_Pin_2|GPIO_Pin_3, GPIO_Mode_Output_PP);
}
int main(void)
{
GPIO_Init();
while(1)
{
/* Set by bit, P32 outputs high and P33 outputs low */
P32 = SET;
P33 = RESET;
/**
* Or set by byte
* P3 = P3 & 0xF3 | 0x08;
*/
SYS_Delay(500);
/* Set by bit, P32 outputs low and P33 outputs high */
P32 = RESET;
P33 = SET;
/**
* Or set by byte
* P3 = P3 & 0xF3 | 0x04;
*/
SYS_Delay(500);
}
}
$ pio run -t upload
Tool Manager: Installing platformio/tool-stcgal @ ~1.110.0
Downloading [####################################] 100%
Unpacking [####################################] 100%
Tool Manager: tool-stcgal@1.110.0 has been installed!
Tool Manager: Installing platformio/tool-vnproch55x @ ~1.0.220407
UnknownPackageError: Could not find the package with 'platformio/tool-vnproch55x @ ~1.0.220407' requirements for your system 'linux_aarch64'
ビルド時にエラーが発生してしまいます。
tool-vnproch55x は、WCH社製の8ビットUSBマイコン(CH55xシリーズ:CH551、CH552、CH554など)に対して、ファームウェア(プログラム)を書き込むために使用されるアップローダー(コマンドラインツール)です。

platformio/tool-vnproch55x by PlatformIO - Compatibility
しかし、このツールはlinux_aarch64には対応していません
再度、intel MCS51の設定情報を開きます
$ vi ~/.platformio/platforms/intel_mcs51/platform.json
"packages": {
"toolchain-sdcc": {
"type": "toolchain",
"owner": "platformio",
"version": ">=1.40100.0,<1.40401.0"
},
"tool-stcgal": {
"type": "uploader",
"optional": true,
"owner": "platformio",
"version": "~1.110.0"
},
"tool-vnproch55x": {
"type": "uploader",
"optional": true,
"owner": "platformio",
"version": "~1.0.220407"
}
オレンジ色の部分を削除します
再度、アップロードを試みます
$ pio run -t upload
Linking .pio/build/STC8G1K08/firmware.hex
Checking size .pio/build/STC8G1K08/firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [ ] 4.3% (used 354 bytes from 8192 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: /dev/ttyUSB0
Uploading .pio/build/STC8G1K08/firmware.hex
Cycling power: done
STC8G1Kにはリセット端子が無いので、
Cycling power: done…というメッセージが出たところで
USBシリアル変換モジュールの3.3VをVCCに繋ぎます。
Target frequency: 0.000 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 34.875 KHz
Target ref. voltage: 1189 mV
Target mfg. date: 2023-03-14
Target options:
reset_pin_enabled=False
clock_gain=high
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=64
low_voltage_reset=False
low_voltage_threshold=2
eeprom_erase_enabled=True
bsl_pindetect_enabled=False
por_reset_delay=long
rstout_por_state=high
uart1_remap=False
uart2_passthrough=True
uart2_pin_mode=push-pull
epwm_open_drain=True
program_eeprom_split=8192
Loading flash: 354 bytes (Intel HEX)
Trimming frequency: 11.058 MHz
Switching to 19200 baud: done
Serial port error: read timeout
*** [upload] Error 1
シリアルポート・エラーでタイムアウトします。
STC8G1K08の設定ファイルを確認します
/home/pi/.platformio/platforms/intel_mcs51/boards/STC8G1K08.json
"upload": {
"maximum_ram_size": 1280,
"maximum_size": 8192,
"protocol": "stcgal",
"stcgal_protocol": "stc8",
"protocols": [
"stcgal"
]
"stcgal_protocol": "stc8" を "stcgal_protocol": "stc8g" に変更するか
platformio.ini
に下記を追記します
board_upload.stcgal_protocol = stc8g
$ pio run -t upload
Erasing flash: done
Writing flash: 0%| | 0/512 [00:00<?, ? Bytes/s]
Writing flash: 38%|???? | 192/512 [00:00<00:00, 1599.69 Bytes/s]
Writing flash: 75%|???????? | 384/512 [00:00<00:00, 1181.78 Bytes/s]
Writing flash: 100%|??????????| 512/512 [00:00<00:00, 1109.16 Bytes/s]
Writing flash: 576 Bytes [00:00, 1304.15 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F754C54E0C60BF
Disconnected!
========================== [SUCCESS] Took 30.96 seconds ==============

赤と緑のLEDが交互に光ります
●STC8G1K17-38I DIP16


ピン配置はSTC8G1K08と同じです。コードのアップロードには同様に、Vcc、Gnd、P3.1、P3.0を使用します。

$ pio init -b STC8G1K17
$ vi platformio.ini
[env:STC8G1K17]
platform = intel_mcs51
board = STC8G1K17
board_build.mcu = stc8g1k178
board_build.stcgal_protocol = stc8g
board_build.f_cpu = 11059200L
platform_packages =
toolchain-sdcc@file:///home/pi/.platformio/packages/toolchain-sdcc
build_flags =
-I./include
lib_deps =
./lib
board_upload.stcgal_protocol = stc8g
upload_protocol = stcgal
upload_flags =
-b 19200
$ pio run -t upload
Processing STC8G1K17 (platform: intel_mcs51; board: STC8G1K17)
PLATFORM: Intel MCS-51 (8051) (2.2.0) > Generic STC8G1K17
HARDWARE: STC8G1K178 11MHz, 1.25KB RAM, 17KB Flash
PACKAGES:
- tool-stcgal @ 1.110.0 (1.10)
- toolchain-sdcc @ 4.6.0
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 1 compatible libraries
Scanning dependencies...
Dependency Graph
|-- lib @ 0.0.0+20260604184950
Linking .pio/build/STC8G1K17/firmware.hex
Checking size .pio/build/STC8G1K17/firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [ ] 2.0% (used 354 bytes from 17408 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: /dev/ttyUSB0
Uploading .pio/build/STC8G1K17/firmware.hex
Cycling power: done
Waiting for MCU: done
Target model:
Name: STC8G1K17-20/16PIN
Magic: F757
Code flash: 17.0 KB
EEPROM flash: 0.0 KB
Target frequency: 11.065 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.375 KHz
Target ref. voltage: 1185 mV
Target mfg. date: 2026-01-27
Target options:
reset_pin_enabled=False
clock_gain=high
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=64
low_voltage_reset=False
low_voltage_threshold=2
eeprom_erase_enabled=True
bsl_pindetect_enabled=False
por_reset_delay=long
rstout_por_state=high
uart1_remap=False
uart2_passthrough=True
uart2_pin_mode=push-pull
epwm_open_drain=True
program_eeprom_split=16896
Loading flash: 354 bytes (Intel HEX)
Target frequency: Target 11.059 MHz
Adjusted frequency: 11.069 MHz(0.089%)
Switching to 19200 baud: done
Erasing flash: done
Writing flash: 0%| | 0/512 [00:00<?, ? Bytes/s]
Writing flash: 38%|???? | 192/512 [00:00<00:00, 1468.43 Bytes/s]
Writing flash: 75%|???????? | 384/512 [00:00<00:00, 1151.70 Bytes/s]
Writing flash: 100%|??????????| 512/512 [00:00<00:00, 1092.42 Bytes/s]
Writing flash: 576 Bytes [00:00, 1276.11 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F757C5C416BB03
Disconnected!
===================== [SUCCESS] Took 26.05 seconds =====================
STC8G1K17の型番が示す通り、こちらは17KBのフラッシュメモリを実装しています。

IOsetting/FwLib_STC8
今回もラッパーライブラリを使用します。
●FwLib_STC8/demo/uart/uart1_timer2_rx.c
UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
↓変更
UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 19200);
前回、Lチカで使用した配線をそのまま利用してビルドします

$ pio device monitor -p /dev/ttyS0 -b 19200

デバイスモニタで1234...と入力すると、UART接続されているSTC8G1K17で受信した内容をそのまま返信しています。
※Raspbery Pi 3V3 と STC8G1K17 Vccを繋ぐと文字化けしてしまいました。
●参考文献
今さらだけど、8ビットのチープマイコン「STC8」で遊んでみよう【2】
STC8G family of Microcontrollers (Shenzhen Guoxin AI Co., Ltd.)
今さらだけど、8ビットのチープマイコン「STC8」で遊んでみよう【3】
SDCC Compiler User Guide
|