部品箱の奥からとあるマイコンを引きずり出して来ました。その名も STCmicro 社が作っている、STC89 マイコンです。社名がパクリっぽいですね。それはともかく。
今回扱うのは、Intel 8051 を拡張させたものです(もっと厳密に言うと、8051 を拡張させた 8052 をベースにしている)。8051 について、詳しいことは調べてみてください。古のかほりがするマイコンです。
買ったもの
1年前くらいにaitendo にて「なんかよくわからないマイコンが売っているなぁ」と思い、取り敢えず購入したというのがきっかけです。以降は扱い方がよくわからないということでしまっておきました。それを取り出してみたという感じです。商品ページは以下。aitendo で売っている 8051 コアのマイコンの中で一番大きいサイズです。
動作回路
極めて単純です。このマイコンはリセット時に一瞬だけブートローダーによる読み書きを許可しますので、モード選択ピンは必要ありません。
稚拙な絵ですが、こんな感じに接続しました。現代のマイコンとは違い、このマイコンは RST を High にしてリセットがかかります。
下の四角はセラロック(12MHz)で、真ん中のピンを GND に落としています。更に、P1.0 に LED をつけました。
開発ツール・書き込み方法
開発ツールは、Keil が使えるとのことですが、Windows 専用というクソ仕様なため、もちろん使用しません。
GUI でそれっぽく使えるツールはないので(というかこのレベルのマイコンを扱うのにわざわざ IDE を使う必要はまったくない)、ターミナルでコマンドをカタカタ打つことにします。
コンパイラ
コンパイラは gcc が対応していないので、sdcc
を使います。Homebrew の方は簡単にインストールできます。それなりに癖があるので、ユーザマニュアルをダウンロードしておいたほうが良いでしょう。
$ brew install sdcc
書き込みソフト
書き込みに配線を変更する必要はありません。使うソフトですが、メーカーから[要出典]オープンソースのツールが出ているので、使わせてもらいましょう。動作には Python3 が必要です。
ソフト名は stcgal。ギャルですね。
Homebrew を使っている人は、以下のようにサクッとインストールできますよ。
$ brew install stcgal
書き込み方法ですが、どうやら対応デバイスが限られるよう。repo の FAQ を見てもらえばいいですが、現状以下の対応でした。ラズパイでは動かせないと書いてあります。
- FT232 family (OS: Linux, Windows)
- CH340/CH341 (OS: Windows, Linux requires Kernel 4.10)
- PL2303 (OS: Windows, Linux)
- CP2102 (OS: Windows, Linux, macOS)
実際、僕のお手製デバッグアダプタでは動かなかったので、諦めて FT232RL モジュールを使いました。
書き込みのためのコマンドはこちら。といってもコマンドを打つだけでは書き込めません。先程言ったように、ブートローダーの利用はマイコンのリセット直後に限られます。なので待機状態になったら一度リセットを掛けましょう。僕はいちいち GND を引っこ抜いています。
$ stcgal -p /dev/cu.usbserial-AH03I8LZ blinky.hex
参考までに、書き込みが完了した時のコンソール出力を示しておきます。
Waiting for MCU, please cycle power: done
Protocol detected: stc89
Target model:
Name: STC89C52RC/LE52R
Magic: F002
Code flash: 8.0 KB
EEPROM flash: 6.0 KB
Target frequency: 11.962 MHz
Target BSL version: 4.3C
Target options:
cpu_6t_enabled=False
bsl_pindetect_enabled=False
eeprom_erase_enabled=False
clock_gain=low
ale_enabled=True
xram_enabled=True
watchdog_por_enabled=False
Loading flash: 417 bytes (Intel HEX)
Switching to 19200 baud: checking setting testing done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 1740.30 Bytes/s]
Setting options: done
Disconnected!
Lチカやってみた
ということで動かしてみましょう。構造が単純なので、GPIO (当時はただの IO という言い方だったのかな)の使い方はかなり簡単にできます。
#include <8052.h>
#include <stdint.h>
int main(void){
while(1) {
P1_0 ^= 1;
for(volatile uint32_t _=0; _<10000U; _++);
}
}
コンパイル・書き込みはこんな感じ。若干 gcc と異なりますね。
$ sdcc -mmcs51 --std-c99 main.c # sdccで吐かれるihxファイルを使用
$ stcgal -p /dev/cu.usbserial-AH03I8LZ main.ihx # 書き込み時は要リセット
2Hz くらいで P1.0 の LED が点滅していれば成功です(12MHz クロックの場合)。
〆
案外すんなりと動いちゃいました。一番苦労したのは、シリアル通信モジュールによっては書き込みがうまくいかないということですね。
ちなみに何故このマイコンを触れたかと言うと、先の Intel 8080 エミュレータである ZK-80 ボードで遊んでいたからなんですね。前に買って放置していたマイコンが古のものだと分かったので早速、という感じでした。
このマイコンはペリフェラルがとても少ない(タイマー、IO、UART、EEPROM)ので、攻略は簡単そうです。最終的にはバイナリ手書きまで行きたいものですね。
コメント
8051のIDEは、MCU8051IDEがFreeでWindows, Linux, おそらくMac OS でも行けると思います。コンパイラはSDCC を使います。小生はこれをUBUNTUの上で走らせ、昔の1マシンサイクル12クロックの80C51 を使っています。
https://sourceforge.net/projects/mcu8051ide/
8051とは言えIDEがあると便利です。
コメントありがとうございます。
承認するのがだいぶ遅くなってすみません。
このようなIDEがあったとは...使いやすそうなUIをしていますね。
この間にいろいろとMacで実行しようと頑張っていますが、Tck-Tkのバージョン云々が面倒なことになっているようで、現状動作確認が出来ていません。
Windows等やUbuntuで色々とやってみた所、確かに便利だなあと感じました。
Macでの動作を目指して、(意地でも)こぎつけたいと思っています。