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チカを実行することができました。