SNSへはこちら

Intel 8051マイコンを使う(STCマイコン)(1) - 環境構築とLチカ

部品箱の奥からとあるマイコンを引きずり出して来ました。その名も STCmicro 社が作っている、STC89 マイコンです。社名がパクリっぽいですね。それはともかく。
今回扱うのは、Intel 8051 を拡張させたものです(もっと厳密に言うと、8051 を拡張させた 8052 をベースにしている)。8051 について、詳しいことは調べてみてください。古のかほりがするマイコンです。

買ったもの

1年前くらいにaitendo にて「なんかよくわからないマイコンが売っているなぁ」と思い、取り敢えず購入したというのがきっかけです。以降は扱い方がよくわからないということでしまっておきました。それを取り出してみたという感じです。商品ページは以下。aitendo で売っている 8051 コアのマイコンの中で一番大きいサイズです。

●概要●仕様・機能STC社8051コア8ビットマイコン、最大動作周波数:48MHz、フラッシュ:8K、SRAM:512バイト、タイマー:3、UART、WDT、動作電源:3.3〜5.5V、パッケージ:D…

動作回路

極めて単純です。このマイコンはリセット時に一瞬だけブートローダーによる読み書きを許可しますので、モード選択ピンは必要ありません。
稚拙な絵ですが、こんな感じに接続しました。現代のマイコンとは違い、このマイコンは RST を High にしてリセットがかかります。

下の四角はセラロック(12MHz)で、真ん中のピンを GND に落としています。更に、P1.0 に LED をつけました。

開発ツール・書き込み方法

開発ツールは、Keil が使えるとのことですが、Windows 専用というクソ仕様なため、もちろん使用しません。
GUI でそれっぽく使えるツールはないので(というかこのレベルのマイコンを扱うのにわざわざ IDE を使う必要はまったくない)、ターミナルでコマンドをカタカタ打つことにします。

コンパイラ

コンパイラは gcc が対応していないので、sdcc を使います。Homebrew の方は簡単にインストールできます。それなりに癖があるので、ユーザマニュアルをダウンロードしておいたほうが良いでしょう。

$ brew install sdcc

書き込みソフト

書き込みに配線を変更する必要はありません。使うソフトですが、メーカーから[要出典]オープンソースのツールが出ているので、使わせてもらいましょう。動作には Python3 が必要です。
ソフト名は stcgalギャルですね。

Open Source STC MCU ISP flash tool. Contribute to grigorig/stcgal development by creating an account on GitHub.

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)ので、攻略は簡単そうです。最終的にはバイナリ手書きまで行きたいものですね。

Ad
Ad

SNSへはこちら

RSS等はこちら