少し前にlittleBitsのArduino Coding Kitを使ったハンズオンセミナーに参加してきたのですが、そのハンズオンでの楽しさと最近のIoTの盛り上がりに触発されたこともあって、随分前に購入して棚の奥で眠っていたH8-3067マイコンを引っ張り出し、来たるべくIoT時代に備えマイコンプログラミングに再挑戦してみたいと思います(ちなみに、以前はちょっと触っただけで終わってしまっていた)。
ちなみに、私の持っているマイコンは以下です。お値段はそこそこします。。このキットは、下記の本の題材としても扱われています。
H8マイコンによるネットワーク・プログラミング ~C言語ではじめる組み込みマイコン入門
技術評論社
売り上げランキング: 578,418
なんだが基盤をそのまま触るのもあれかと思い、弁当箱のフタにビス止めして取り付けています。使わないときはフタを閉めてコンパクトに収納でき、さらに埃も防げて重宝しています。
クロスコンパイル環境の構築
まず最初に、H8-3067マイコン上で動作するプログラムを開発する環境を構築します。「H8マイコンによる〜」本では、マイコンのスタータキット付属のCDに収録されている開発環境を使ってWindows上でのプログラム開発を行なうスタイルを想定したものになっていますが、私の所有しているマシンはMacなので今回はMac上で開発できる環境を構築したいと思います。参考にさせていただきました書籍は、参考リンクの12ステップ本です。コンパイラはgccを使います。
GCCのビルドに必要なライブラリ
gccをソースからビルドするにあたって、以下の依存ライブラリが必要になります。
- GMP
- https://gmplib.org
- MPFR
- http://www.mpfr.org
- MPC
- http://www.multiprecision.org/index.php?prog=mpc
- isl
GCC他のビルド
今回は、$HOME/workspace/h8-3067/tools
というディレクトリにソフトウェアライブラリをインストールしていきます。
GMP
1 2 3 4 5 6 |
curl -O https://gmplib.org/download/gmp/gmp-6.1.0.tar.bz2 bunzip gmp-6.1.0.tar.bz2 cd gmp-6.1.0 ./configure --prefix=$HOME/workspace/h8-3067/tools make make install |
MPFR
1 2 3 4 5 6 |
curl -O http://www.mpfr.org/mpfr-current/mpfr-3.1.4.tar.gz tar xvzf mpfr-3.1.4.tar.gz cd mpfr-3.1.4 ./configure --prefix=$HOME/workspace/h8-3067/tools --with-gmp=$HOME/workspace/h8-3067/tools make make install |
MPC
1 2 3 4 5 6 7 8 |
curl -O http://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz tar xvzf mpc-1.0.3.tar.gz cd mpc-1.0.3 ./configure --prefix=$HOME/workspace/h8-3067/tools \ --with-gmp=$HOME/workspace/h8-3067/tools \ --with-mpfr=$HOME/workspace/h8-3067/tools make make install |
binutils
1 2 3 4 5 6 7 8 9 10 11 12 |
curl -O https://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.gz tar xvzf binutils-2.26.tar.gz cd binutils-2.26 ./configure --target=h8300-elf \ --prefix=$HOME/workspace/h8-3067/tools \ --with-gmp=$HOME/workspace/h8-3067/tools \ --with-mpfr=$HOME/workspace/h8-3067/tools \ --with-mpc=$HOME/workspace/h8-3067/tools \ --disable-nls \ --disable-werror make make install |
gcc
コンパイル時のオプションは、以下のページを参考にさせていただきました。
https://gcc.gnu.org/install/configure.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
tar xvzf gcc-4.9.3.tar.gz cd gcc-4.9.3 mkdir build && cd build ../configure --target=h8300-elf \ --prefix=$HOME/workspace/h8-3067/tools \ --with-gmp=$HOME/workspace/h8-3067/tools \ --with-mpfr=$HOME/workspace/h8-3067/tools \ --with-mpc=$HOME/workspace/h8-3067/tools \ --enable-languages=c \ --disable-nls \ --disable-shared \ --disable-libssp \ --disable-threads make make install |
私の環境では、sspがenableだとエラーになったため上記では無効にしています。
h8write
マイコンボードのROMにプログラムを書き込むにあたっては、h8write.cというプログラムを公開してくださっている方がいらっしゃるので、そちらを利用させていただきました。
ビルドは簡単で単純に1ソースファイルをビルドするだけです。
1 |
gcc h8write.c -o h8write |
h8writeの使用方法はhelpを見れば大体分かりますが、例えばH8-3067CPU向けには以下のようにして実行します。デバイスファイルには、USB-RS232C変換ケーブルをPCに接続した時に認識されるデバイスファイルを指定します。例えば、私の環境では/dev/cu.usbserial-FTDXVFRB
になります。
1 |
h8write -3067 <書き込むmotファイル> <デバイスファイル> |
簡単なサンプルを実行してみる
クロスコンパイル環境を整えたので、実際にプログラミングして何か動作させてみます。マイコンキットにはLEDが付いているので、今回はLEDを点灯させてみたいと思います。参考にさせていただいた情報は、参考リンク・書籍に掲載しています。
今回用意したファイルは以下になります。とかく最小限のプログラムでLEDを点灯させることが目標です。
1 2 3 4 5 6 |
$ tree . ├── Makefile ├── ld.x ├── main.c └── startup.s |
main.c
ファイル先頭に定義しているマクロは、I/Oポートのレジスタのアドレスを指定しています。このアドレスにアクセスすることでI/Oポートを制御することができるようになっています。ポート5、AのレジスタをそれぞれP5xx、PAxxとしています。端子PA2、PA3にLEDが接続されており、mainのループの中でスイッチの開閉によってレジスタの値を変更しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#define P5DDR (*(volatile unsigned char*)0xEE004) #define P5DR (*(volatile unsigned char*)0xFFFD4) #define P5PCR (*(volatile unsigned char*)0xEE03F) #define PADDR (*(volatile unsigned char*)0xEE009) #define PADR (*(volatile unsigned char*)0xFFFD9) int main(void) { P5DDR = 0xF0; /* READ */ P5PCR = 0xFF; /* プルアップON */ PADDR = 0xFF; /* 出力に設定 */ PADR = 0xFF; /* 初期データを1に設定する */ while(1) { if (P5DR == 0xFD) { PADR = 0xFB; } else if (P5DR == 0xFE) { PADR = 0xF7; } else { PADR = 0xFF; } } return 0; } |
startup.s
スタックポインタだけ指定してmainにジャンプさせています。スタックポインタのアドレスは、モード7で動作させたメモリマップを参考に指定しています。
1 2 3 4 5 6 7 8 9 10 |
.h8300h .section .text .global _start _start: mov.l #0xfff20,sp jmp @_main 1: bra 1b |
ld.x
ベクタ領域の先頭にstartルーチンを指定しています。ROM領域は0x00100番地から始まるので、セクション.textの開始アドレスを0x00100に指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
OUTPUT_FORMAT("elf32-h8300") OUTPUT_ARCH(h8300h) ENTRY("_start") SECTIONS { . = 0x0; .vectors : { LONG(ABSOLUTE(_start)) } .text 0x0100 : { *(.text) } .rodata : { *(.strings) *(.rodata) *(.rodata.*) } .data : { *(.data) } .bss : { *(.bss) *(COMMON) } } |
H8-3067製品ページのマニュアル参照
Makefile
省略。12ステップ本を参考。
いざ点灯・・・
イルミネーションスタート!!オォ点灯した!
反対側のライトも・・・!?オォ、無事点灯!
最後に
littleBitsのようなモジュールでArduino IDEで開発するのに比べるとハードルは高かったですが、リンカスクリプトやアセンブラ、メモリマップなどローレベルの仕組みを理解することができるので非常に勉強になると思います。最初は、わからないことだらけでしんどいですが、自分自身わからないなりに色々と調べながら手を動かしていく中で少しずつ理解できるようになってきたように思います。
引き続きここで立ち止まらず、12ステップ本やH8本を参考にH8マイコンで遊んでみたいと思います。
参考リンク・書籍
- https://gcc.gnu.org/install/prerequisites.html
- http://d.hatena.ne.jp/satfy/20101226/1293370919
- https://gcc.gnu.org/install/configure.html
- http://mes.osdn.jp/h8/writer-j.html
- http://www.ertl.jp/~takayuki/readings/gnutoolkit.html
- http://japan.renesas.com/products/mpumcu/h8/h8300h/h83067/Documentation.jsp
- http://akita-nct.jp/yamamoto/comp/H8/C_linux/C_linux.php#led_sample
カットシステム
売り上げランキング: 22,354
リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY)
CQ出版
売り上げランキング: 86,075
H8マイコンによるネットワーク・プログラミング ~C言語ではじめる組み込みマイコン入門
技術評論社
売り上げランキング: 578,156
コメント