MacでH8-3067マイコンのクロスコンパイラ環境を構築してLEDを点灯させる

少し前にlittleBitsのArduino Coding Kitを使ったハンズオンセミナーに参加してきたのですが、そのハンズオンでの楽しさと最近のIoTの盛り上がりに触発されたこともあって、随分前に購入して棚の奥で眠っていたH8-3067マイコンを引っ張り出し、来たるべくIoT時代に備えマイコンプログラミングに再挑戦してみたいと思います(ちなみに、以前はちょっと触っただけで終わってしまっていた)。

ちなみに、私の持っているマイコンは以下です。お値段はそこそこします。。このキットは、下記の本の題材としても扱われています。

http://www.hokutodenshi.co.jp/7789/3067kit.htm

なんだが基盤をそのまま触るのもあれかと思い、弁当箱のフタにビス止めして取り付けています。使わないときはフタを閉めてコンパクトに収納でき、さらに埃も防げて重宝しています。

IMG_3784

クロスコンパイル環境の構築

まず最初に、H8-3067マイコン上で動作するプログラムを開発する環境を構築します。「H8マイコンによる〜」本では、マイコンのスタータキット付属のCDに収録されている開発環境を使ってWindows上でのプログラム開発を行なうスタイルを想定したものになっていますが、私の所有しているマシンはMacなので今回はMac上で開発できる環境を構築したいと思います。参考にさせていただきました書籍は、参考リンクの12ステップ本です。コンパイラはgccを使います。

GCCのビルドに必要なライブラリ

gccをソースからビルドするにあたって、以下の依存ライブラリが必要になります。

https://gcc.gnu.org/install/prerequisites.html

  • 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

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

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

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

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

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というプログラムを公開してくださっている方がいらっしゃるので、そちらを利用させていただきました。

http://mes.osdn.jp/h8/writer-j.html

ビルドは簡単で単純に1ソースファイルをビルドするだけです。

gcc h8write.c -o h8write

h8writeの使用方法はhelpを見れば大体分かりますが、例えばH8-3067CPU向けには以下のようにして実行します。デバイスファイルには、USB-RS232C変換ケーブルをPCに接続した時に認識されるデバイスファイルを指定します。例えば、私の環境では/dev/cu.usbserial-FTDXVFRB になります。

h8write -3067 <書き込むmotファイル> <デバイスファイル>

簡単なサンプルを実行してみる

クロスコンパイル環境を整えたので、実際にプログラミングして何か動作させてみます。マイコンキットにはLEDが付いているので、今回はLEDを点灯させてみたいと思います。参考にさせていただいた情報は、参考リンク・書籍に掲載しています。

今回用意したファイルは以下になります。とかく最小限のプログラムでLEDを点灯させることが目標です。

$ tree
.
├── Makefile
├── ld.x
├── main.c
└── startup.s

compile-process

main.c

ファイル先頭に定義しているマクロは、I/Oポートのレジスタのアドレスを指定しています。このアドレスにアクセスすることでI/Oポートを制御することができるようになっています。ポート5、AのレジスタをそれぞれP5xx、PAxxとしています。端子PA2、PA3にLEDが接続されており、mainのループの中でスイッチの開閉によってレジスタの値を変更しています。

#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で動作させたメモリマップを参考に指定しています。

  .h8300h
  .section .text
  .global _start

_start:
  mov.l #0xfff20,sp
  jmp   @_main

1:
  bra 1b

ld.x

ベクタ領域の先頭にstartルーチンを指定しています。ROM領域は0x00100番地から始まるので、セクション.textの開始アドレスを0x00100に指定しています。

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)
  }
}

mode07-memory-map

H8-3067製品ページのマニュアル参照

http://japan.renesas.com/products/mpumcu/h8/h8300h/h83067/Documentation.jsp

Makefile

省略。12ステップ本を参考。

いざ点灯・・・

イルミネーションスタート!!オォ点灯した!

IMG_3795

反対側のライトも・・・!?オォ、無事点灯!

IMG_3796

最後に

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
12ステップで作る組込みOS自作入門
坂井 弘亮
カットシステム
売り上げランキング: 22,354

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする