ついにこの領域に手を出してしまった...
タイトルを見て「え?EPSON がマイコン???」って思った方、多いと思います。僕も思っていました。
EPSONのC17マイコンとは
聞いて驚け、なんと EPSON はオリジナルアーキテクチャの CPU を積んだマイコンを作っているのです!最近はやれ AVR だの ARM だので一辺倒な市場ですが、あの Renesas 以外にも現在 独自コアを開発している会社があったのです。これはもう一目惚れでしょう。
C17 は 16bit のアーキテクチャで、EPSON の S1C17 が先頭につく型番に入っています。他にも S1C31 という ARM Cortex-M コアを積んだマイコンもあります。ARM もやってるんだ。全然知らなかったよ。
ちなみに C31 は OpenOCD に対応していないみたい。そりゃあ B to B のやつだし(多分)。ってか C17 って C 言語の規格みたいですね。ググリビリティが低い。
実は前々から色々と調べていて、C17 の特徴的な点を1つ見つけたのでご紹介します。それはメモリ空間。
そう。24bit 空間なんですよ。しかも AVR のように ROM と RAM は分離しておらず、全て同一空間内に属します。
これだけだと RL78 とかと変わらないと思いますが、なんと以下のように レジスタのビット幅が 24bit です。これってもはや 24bit マイコンじゃん。
...でも命令長は 16bit なんですね~~。これは独特です。
ということで、国産で、独自コアで、24bit な 16bit マイコン(?)ということに魅力を感じて試食してみようと思いました。
購入したもの
はじめに言っておきますが、非常にお金がかかりますよ。
まあ一般向けではないやつなので仕方ないですね。多分組込機器の量産品に使うんでしょう。
まずは書き込み器。お察しの通り独自デバッガが必要となります。これが高い高い。
ICDmini というのですが、こちらに digi-key で売っています。価格はなんと 19,000円。この時点で買う気失せますね。でも僕はボーナス払いで買ったので実質無料です。
ターゲットは僕らしくないと思いますが、実装済みマイコン評価ボードを買いました。実装済みということはもれなく高いのですが、実際こちらも高いです。
買ったのは S1C17W18 のミニサイズ評価ボードで、SVTmini17W18 というものです。こちらから買えて、価格は 5,000円です。まあ普通かなって言う価格ですよね。この記事執筆中に見てみたら残り在庫が1になっていました。半導体不足ですかねえ...
S1C17W18の特徴
型番ってどこで区切るのがいいんですかね?よくわからないので全て記載しておきます。
このマイコンの特徴は以下。この型番以外にも存在する機能かもしれませんがそのへんは許して。マイコンシリーズ全体にある機能も含めて述べます:
- EPSON 独自コア C17
- RAM: 8 KByte, Flash: 128 KByte
- Flash の書き込み回数が 1,000 回なのはちょっと気になる所。まあどうせ問題なく出来るだろうね。
- 低消費電力を意識
- そのため、最大クロック周波数が 4.2MHz と遅い。高速動作アプリケーションは意図していない模様。
- 電源電圧範囲は 1.2V~3.6V という驚異の 1.2V 対応。さすが低消費だ... 電池1本で動くんですよね。
- 1.2V~1.6V では最大クロック周波数が 1.1MHz に制限される。
- そして Flash 書き換え時には 2.4V は最低でも必要。そりゃそうだよね。
開発環境の導入
では早速導入していきましょう。言い忘れましたが、Windows 限定です。僕は Mac や Linux で出来ることが一番の条件だったんですが、今回は妥協します。だって面白そうなんだもん。...という言い訳をしつつ進めていきます。
ではまず GNU17 をダウンロードして起動します。ワークスペースは普通に Documents 内にフォルダを作りました。
起動させた所...やっぱりまんま Eclipse だね。というより、下手に自作した使いづらい開発環境よりマシですね。ある意味業界標準で安心しました。ツールチェインの中身は、EPSON が独自に対応させた gcc とか binutils です。こちらも汎用品で好感が持てる。Linux から Wine を使ったら、Linux 上でプログラムが作れるかもしれないですね。書き込みはできないけど。
その他、ドキュメントを入手しておきましょう。
プロジェクトの準備
まだよく分かっていない状態なのでなんとも言えないのですが、IDE 側でプロジェクト生成をしてもリンカスクリプトやスタートアップコード、そして更にレジスタマクロも生成されません。デバッグ用の gdb 設定ファイルは流石に吐き出されるんですが、詳細はよくわかりません。流石にリンカスクリプトとスタートアップコードくらいは作って欲しいけど...後日報告します。
と思ったら、サンプルプロジェクトを発見。なんだかパッとしませんが、ひとまずインポートして使ってみます。ここから落とせます。
ひとまずインポートしていきましょうか。 GNU17 のプロジェクトブラウザ内で右クリックし、Import -> General -> Existing Projects into Workspace から、zip アーカイブを選択して V3 とある方のみをインポートします。どうやらこの GNU17 は Ver.3 らしい。よくわからんけど。
ひとまずこれで準備はできたっぽいです。
Lチカプログラムを書こう
マイコンといえば毎回恒例、Lチカですよね。そのためにビルドから書き込みまでやっていきます。
はんだ付け
ボードの CN1 にピンヘッダをはんだ付けしました。これ以外のボード上の CNx でもいいのですが、回路図を見る限り色々なピンが集まっていそうなんですよね。僕はこれを使うことにします。
ところで、この CN1 だけどこが1番ピンなのかのガイドがありません。備忘録がてら以下に示しておきますので参考にしてください。
プログラム
インポートしたプロジェクトの main.c
を開いて、main
関数の一番最初に以下を書きました。
int main(void)
{
/* <<< s1c17w18 demonstration start >>> */
P0IOEN |= 1 << 4;
while(1) {
P0DAT ^= 1 << (4 + 8);
}
main_clg();
...
一旦もとのサンプルプログラムは残しておきます。これで準備が整いました。
これをビルドすると、Debug フォルダ内に elf バイナリが生成されます。同時に saf とか psa とか複数吐かれますが、どう見ても Motorola S Record 形式(srec) ですよこれ。
ルネサスもこの形式を使っていましたね。なんか謎にルネサスとの共通点がある気がする。
ICDmini3 の接続・書き込み
早速 ICDmini を PC に接続するのですが、USB ポートに差しても自動でドライバがインストールされません。IDE 導入時に入れてくれればいいのにね。
デバイスマネージャーから不明なデバイスが見えるはずなので、ドライバパスを指定してインストールしてあげましょう。自分の環境では S5U~ で始まるデバイス名でした。パスは C:\EPSON\GNU17V3\utility\drv_usb\Mini3Driver
にあります。インストールすると、デバイスカテゴリが ICDmini3 Device になっているのがシュール。なんか異色です。
では書き込みのみを行っていきたいのですが、調べても書き込みのみを行う方法は見当たらず。どうやらデバッグセッションも同時に開始する必要があるっぽいです。ともかくやってみましょう。NXP の MCUXpresso と同じように、ツールバーの虫のボタンを押せば出来ます。なお ICDmini と正常に接続されていない場合は ブレークポイントがこれ以上設定できないよ っていう絶妙に初見殺しなメッセージが出てきます。ドライバ関連でここ地味に苦労した。
ビルドを押すと画面が必ずフリーズします。多分 ICD と接続待ちをしているんでしょうけれど、この辺の作りはちょっとお粗末ですね。地味に長いし。
たまにガチのフリーズをするのでそのときは察してあげて、悔しいですが強制終了してしまいましょう。
余談ですけど、書き込みだけでいい場合は別途コマンドラインでなんとかできそうな感じがあります。プロジェクト内部に存在する gdbmini3.ini
って言うスクリプトが名前的に明らかに gdb だし、中身を見ても普通に gdb でした。こいつを直接叩いてあげればいい感じに書けそう。まあ今後の課題ですかね。
んで実際に動かすとめっちゃ高速でピンがパタパタします。場所は P04 で、CN1-31 です。
流石にここに LED をつなげても見えないので、オシロを接続してみました。
この波形の測定結果により、58kHz でパタパタしていると分かりますね。デフォルト状態では結構低速なクロックで動いている?
ちなみに、オシロじゃなくて目視でパタパタさせたい!!という人に以下のプログラムをどうぞ(そんな人いるのか??)。単に無駄ループをさせているだけですが。
int main(void)
{
/* <<< s1c17w18 demonstration start >>> */
P0IOEN |= 1 << 4;
while(1) {
volatile long long int i;
for(i = 0; i < 5000; i++);
P0DAT ^= 1 << (4 + 8);
}
main_clg();
...
〆
ということで、実は前から虎視眈々と(?)狙っていた EPSON マイコンの試食をすることに成功しました~~
デバッガがかなり割高で正直オススメはしませんが、僕の鳴り止まぬマイコン評価衝動を満たすためにいい素材なのかなと思います。夏のボーナス入ったらこんなの無料のようなものだし。
どこまで続けていくかは、いつも通り未定です。ですがこれだけ金をかけているので(多分今までいじってきたマイコン史上最大)、弄り倒そうと思いますよ。一般のマイコン趣味の人でさえもほぼ絶対触らない機種であるからこそ燃えるものがあります。まあそれはどうでもいいので、皆さんはネタ or 教養として眺めていただければと思います。
もし興味がある方は購入を検討してはいかが?
補遺
そういえば、この記事を執筆し終わった後に EPSON から公式の GNU17 チュートリアル を見つけました。これでデバッグ方法わかりますね。
内容も詳細でさすがといったところです。