続いてルネサスの SH (Super Hitachi) マイコンです。本記事では最もよく使われているであろう SH7125 を対象にします。秋月の商品ページは以下。
このマイコンボード、先の H8/3694 と同じく品薄みたいです。
コンパイラ
H8 の記事と同じく、binutils は 2.30、gcc は 8.2.0、newlib は 2.4.0 です。
# binutils
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --disable-werror --disable-bootstrap
# gcc(1回目)
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-languages=c --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --enable-multilib --enable-lto --with-system-zlib --disable-werror --disable-bootstrap
# newlib
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-multilib --disable-werror --disable-bootstrap
# gcc(2回目)
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-languages=c,c++ --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --enable-multilib --enable-lto --with-system-zlib --disable-werror --disable-bootstrap
書き込み時のピン
ピン番号 | 機能 | 備考 |
---|---|---|
CH1-27, CH1-28 | VCC | 5V電源 |
CH2-27, CH2-28 | GND | |
CH1-25 | MD1 | 起動モード選択端子 |
CH1-26 | FWE | 起動モード選択端子 |
CH2-4 | RXD1 | 書き込みに使用 ホスト側の TXD に接続 |
CH2-5 | TXD1 | 書き込みに使用 ホスト側の RXD に接続 |
CH2-22 | RES | Active Low |
MD1 と FWE の電圧レベルは以下のようです。
モード | MD1 | FWE |
---|---|---|
ユーザー(通常起動) | 1 | 0 |
ブート(書き込み) | 0 | 1 |
これだと手動だと切り替えが面倒くさいから、スイッチとインバータの組み合わせで回路を作ったほうが良い気がします。
書き込みソフト
このシリーズに対応しているものとして、Python を用いた SH Tiny ライター があります。
こちらのライタは、出来上がる mot ファイルのアドレスが 128byte 境界にアラインメントされていないとエラーを吐くので、リンカスクリプトでうま〜く調節してやってください。これけっこう大変だったのよ。
プロジェクト例
ご査収ください。疲れた...
割り込みベクタは必要最低限しか組んでいないので、必要な分はマニュアルを読みながらご自身で実装してみてください。
アセンブリする際の注意点
分岐命令・ジャンプ命令は遅延分岐の場合があります。というかよく使う分岐命令は大体遅延です。遅延スロットを用いた遅延分岐では、1つ後の命令を先に実行してから分岐が始まります。不幸にもこのアセンブラにはそれを考慮して命令順を入れ替えるとか、nop
を挟むとかやってくれないので、自分でやりましょう。
この遅延分岐の際、更に分岐命令を実行しようとするとエラーが出て落ちるので、そこも要注意です。
意味がわからない人は「分岐命令の直後には nop
を置け」と理解しておけばいいです。
また、リンカスクリプトで書いた変数へアクセスする際も大変です。ARM のように一旦実行部に近いところに変数アドレスを配置して用いる必要があります。例えばアセンブリでリンカスクリプト上の変数 _sbss
のアドレスをレジスタにロードしようとすると「遠すぎる」と怒られます。
mov.l _sbss, r1
# 遠すぎると怒られる
なので、一度配置してからロードします。
mov.l addr_sbss, r1
# 自動的にPC相対に置換される
# long のアラインメント
.align 4
addr_sbss:
.lomg _sbss