STC8G1K08Aを入手していましたので、開発環境とstcgalで書き込み、Lチカのプログラム実行を行って見たいと思います。

STC8G1K08Aは8bitマイクロコントローラで、8051コアで動作し、プログラムメモリサイズ8KB、データRAMサイズ1KB、EEPROMサイズ4Kで1.9V~5.5Vで動作し、8ピンサイズのSOP8、DIP8などのパッケージがあります。

入手先は、秋月電子、AliExpressなど

開発環境は、Raspberry Pi3 上のRaspbianです。まずは、アセンブラをインストールします。
アセンブラは、これまで使用していた、ASxxxxを使用します。

ASxxxxのインストールはこちらの「8051コアに萌えたい AT89S52でLチカ(開発環境と書き込み、実行)」を参考にインストールしてください。

STC8G1K08Aに書き込むためには、stcgalを使用します。stcgalの詳細についてはこちらを参照してください。
また、「8051コアに萌えたい STC12C2052 Lチカ」でもstcgalを使用しています。

stcgalをインストールします。
$ sudo pip3 install stcgal

$ sudo pip3 install stcgal
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: stcgal in /usr/local/lib/python3.9/dist-packages (1.10)
Requirement already satisfied: tqdm>=4.0.0 in /usr/local/lib/python3.9/dist-packages (from stcgal) (4.67.1)
Requirement already satisfied: pyserial>=3.0 in /usr/lib/python3/dist-packages (from stcgal) (3.5b0)

stcgalのヘルプを表示

$ stcgal -h
usage: stcgal [-h] [-e] [-a] [-A {dtr,rts}] [-r RESETCMD]
              [-P {stc89,stc89a,stc12a,stc12b,stc12,stc15a,stc15,stc8,stc8d,stc8g,usb15,auto}]
              [-p PORT] [-b BAUD] [-l HANDSHAKE] [-o OPTION] [-t TRIM] [-D]
              [-V]
              [code_image] [eeprom_image]

stcgal 1.10 - an STC MCU ISP flash tool
(C) 2014-2018 Grigori Goronzy and others
https://github.com/grigorig/stcgal

positional arguments:
  code_image            code segment file to flash (BIN/HEX)
  eeprom_image          eeprom segment file to flash (BIN/HEX)

optional arguments:
  -h, --help            show this help message and exit
  -e, --erase           only erase flash memory
  -a, --autoreset       cycle power automatically by asserting DTR
  -A {dtr,rts}, --resetpin {dtr,rts}
                        pin to hold down when using --autoreset (default: DTR)
  -r RESETCMD, --resetcmd RESETCMD
                        shell command for board power-cycling (instead of DTR
                        assertion)
  -P {stc89,stc89a,stc12a,stc12b,stc12,stc15a,stc15,stc8,stc8d,stc8g,usb15,auto}, --protocol {stc89,stc89a,stc12a,stc12b,stc12,stc15a,stc15,stc8,stc8d,stc8g,usb15,auto}
                        protocol version (default: auto)
  -p PORT, --port PORT  serial port device
  -b BAUD, --baud BAUD  transfer baud rate (default: 115200)
  -l HANDSHAKE, --handshake HANDSHAKE
                        handshake baud rate (default: 2400)
  -o OPTION, --option OPTION
                        set option (can be used multiple times, see
                        documentation)
  -t TRIM, --trim TRIM  RC oscillator frequency in kHz (STC15+ series only)
  -D, --debug           enable debug output
  -V, --version         print version info and exit

無事 stcgalがインストールされたようです。

Lチカする回路図は下記のようになります。
電源は、usbシリアルポートの電源から補給しています。
USBシリアルポートは、「KKHMF 2個 USB to UART TTL RS232 PL2303HX ワイヤーアダプタ変換ケーブルRaspberry Pi Arduino用(amazon)」を使用しました。

Lチカのプログラムを用意します。

以前に作成したSTC12C2052のプログラムを1部変更(LED出力するpin番号とdelayの数値変更)したものです。

STC8G1K08Aでの入出力端子の設定は次のようになっています。(仕様書から抜粋(英→和訳))

PnM1 PnM0
0  -  0   準双方向モード
        準双方向 (従来の 8051 I/O ポート、弱いプルアップ)
シンク電流は20mAまで、プルアップ電流は270~150μA(製造誤差がある可能性があります)

0 - 1 プッシュプル出力モード
プッシュプル出力 (強力なプルアップ出力、電流は最大 20mA、抵抗を使用する必要があります

1  -  0   高インピーダンス入力モード
        ハイインピーダンス(電流が流入も流出もできない)

1  -  1   オープンドレインモード
        オープンドレインモード。内部プルアップ抵抗は無効になります。オープンドレインモードも
        使用可能。外部ステータス読み取りと出力ハイまたはローの両方に対応します。外部状態を
        正しく読み取るには、または出力がハイレベルの場合は、外部プルアップ抵抗を接続する必
        要があります。それ以外の場合は、外部状態が読み出すことはできず、ハイレベルを出力す
        ることはできません。

     準双方向モード プッシュプル出力モード 高インピーダンス入力モード オープンドレインモード

PnM0   0         1           0             1             
PnM1   0         0           1             1

STC8G1K08Aシリーズ、STC8GIK08の場合-
8ピンシリーズでは、チップ全体の動作電流が35mAを超えないようにすることを推奨します。
Vcc から流れる電流は 35mA を超えないよう推奨され、Gnd から流れる電流は 35mA を超えないよう推奨されます。

1pin(P5.4)及び8pin(p3.3)が交互に点滅します。(入出力端子の設定に誤りがあったので訂正します。2025.3.19)

; STC8G1K08A  LED 点滅 1pin(P5.4),8pin(P3.3)

; Flash ROM 8Kbyte
; RAM       1Kbyte
; EEPROM    4Kbyte
; External clock 33MHz
 
; assembler
;  program start 000H 0000H-01fffH
;  main          100H
;
; assemblers  ASxxxx and ASlink V5.5
; file name STC8G1K08A_led.asm
; $ as8051 -l -s -o STC8G1K08A_led.asm
; $ aslink -i STC8G1K08A_led
; $ program download  stcgl STC8G1K08A_led.ixh  
;       

;P50	.equ	0xc8
;P51	.equ	0xc9
;P52	.equ	0xca
;P53	.equ	0xcb
P54	.equ	0xcc

CLKDIV	.equ	0xfe01
P_SW2	.equ	0xba

P3M0	.equ	0xb2
P3M1	.equ	0xb1

P5M0	.equ	0xca
P5M1	.equ	0xc9

	.area	TEST(ABS)

	.org	0x0000

	ljmp	main

	.org	0x0100
main:
;	mov	P_SW2,#0x80		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 有効
;	mov	DPTR,#CLKDIV		;Clock Division register set
;	mov	a,#0x02			;分周値を 1/2にセット
;	movx	@DPTR,a			;
;	mov	P_SW2,#0x00		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 禁止

	mov	P3M0,0b00000000		;P3.3 準双方向モード 
	mov	P3M1,0b00000000		;P3.7- P3.4 P3.2-P3.0 準双方向モード
	
	mov	P5M0,0b00000000		;P5.4 準双方向モード
	mov	P5M1,0b00000000		;P5.7- P5.5 P5.3-P5.0 準双方向モード

	setb	P3.3			;P3.3(8pin) H set
	clr	P54			;P5.4(1pin) L set
loop:	lcall	delay
	cpl	P3.3			;P3.3 = not P3.3
	cpl	P54			;P5.4 = not P5.4
	sjmp	loop

delay:
	clr	a
	mov	r0,a
	mov	r1,a
	mov	r2,#0x1c
delay1:
	djnz	r0,delay1
	djnz	r1,delay1
	djnz	r2,delay1
	ret

P5ポートは8051標準でサポートされていないので、直接.equ命令で、(P5.4)0xccで指定しました。
P3M0,P3M1及びP5M0,P5M1ポートを設定することで、準双方向モードにしています。

アセンブルします。

$ as8051 -l -s -o STC8G1K08A_led.asm

Linkします。

$ aslink -i STC8G1K08A_led

ASlink >> -i
ASlink >> STC8G1K08A_led

次に書き込みの手順ですが、電源SWをONの状態で、下記のメッセージが出たら、一旦電源SWをOFFにし再度、ONにします。すると書き込みが開始されます。
メッセージ 「Waiting for MCU, please cycle power: done」

$ sudo stcgal STC8G1K08A_led.hex
Waiting for MCU, please cycle power: done

初めて書き込みをすると最後の方に「Protocol error: uncalibrated, please provide a trim value」と表示されて書き込みに失敗します。

$ sudo stcgal STC8G1K08A_led.hex
Waiting for MCU, please cycle power: done
Protocol detected: stc8g
Target model:
  Name: STC8G1K08A-8PIN
  Magic: F794
  Code flash: 8.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 0.000 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
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: 293 bytes (Intel HEX)
Protocol error: uncalibrated, please provide a trim value
Disconnected!

ターゲットの周波数を指定していないためです。
STC8G1K08Aでは外付けクリスタル端子がないため、内蔵高精度IRCを指定できます。
IRC周波数は2バンドあり、20MHz帯と33MHz帯となっています
20MHz帯は約14.7MHz~26MHz(デフォルト)
33MHz帯は約24.5MHz~42MHz(ただし35MHz以下を推奨)

今回はデフォルトの20MHz帯を使用し、22.1184MHzに設定します。これはCLKDIVレジスタで1/2分周で11.0592MHzに設定し、後でシリアル通信を行う際に最適な数値になるからです。

stcgalでIRC周波数を指定するには、-tコマンドを使用します、単位はKHzです。

また、-Pでデバイスを指定できます、今回は 「-P stc8g」

$ sudo stcgal -P stc8g -t 22118.4 STC8G1K08A_led.hex

$ sudo stcgal -P stc8g -t 22118.4 STC8G1K
08A_led.hex
Waiting for MCU, please cycle power: done
Target model:
  Name: STC8G1K08A-8PIN
  Magic: F794
  Code flash: 8.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 0.000 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
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: 293 bytes (Intel HEX)
Target frequency: Target 22.118 MHz
Adjusted frequency: 22.123 MHz(0.022%)
Switching to 115200 baud: done
Erasing flash: done
Writing flash: 576 Bytes [00:00, 7951.21 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F794C4840AEBF6
Disconnected!

一度 -t 22118.4で書き込みすると次回からは、IRC周波数は覚えているようです。
$ sudo stcgal -P stc8g STC8G1K08A_led.hex

$ sudo stcgal -P stc8g  STC8G1K08A_led.he
x
Waiting for MCU, please cycle power: done
Target model:
  Name: STC8G1K08A-8PIN
  Magic: F794
  Code flash: 8.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 22.123 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
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: 293 bytes (Intel HEX)
Target frequency: Target 22.123 MHz
Adjusted frequency: 22.130 MHz(0.033%)
Switching to 115200 baud: done
Erasing flash: done
Writing flash: 576 Bytes [00:00, 7910.75 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F794C4840AEBF6
Disconnected!

書き込みが終了すると、1pinと8pinに接続しているLEDが交互に約250msの周期で点滅します。

ソースプログラムの下記部分のコメントを外すと、内部クロックが、22.1184MHzから1/2分周されて、11.0592MHzに設定されます。

	mov	P_SW2,#0x80		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 有効
	mov	DPTR,#CLKDIV		;Clock Division register set
	mov	a,#0x02			;分周値を 1/2にセット
	movx	@DPTR,a			;
	mov	P_SW2,#0x00		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 禁止

再度アセンブリし、書き込むと、1pinと8pinに接続しているLEDが交互に約500msの周期で点滅します。

STC8G1K08Aを使用してなんとか、Lチカを実行することができました。

おすすめの記事