AVR というと、あの悪名高い Microchip 有名な Atmel 社が開発するプロセッサおよびマイコンシリーズですが、その 32bit 版が存在するんですねえ。
実際に Google 先生で検索をかけてみると、大体「AVR」に解釈し直されてしまう。ふむ、さてはこのアーキテクチャ、マイナーだな??
となると、マイコンオタクの僕が好むところです。秋葉原でも売っているみたいですし、ちと挑戦してみます。
開発環境
どのマイコンをやる上で一番苦戦するのが開発環境です。今回は諸事情によってアセンブラ類のみを取り揃えることにします。諸事情といいますとこのマイコンは...
- binutils ではサポートされていない
- 対応させたバージョンが GitHub にあるが、公式なものなのかよく分からない
- このマイコン、とにかく情報が少ないのです。マイナーだからね。
- 最新版ではないものの、avr32-binutils-gdb なるものを見つけたので、とりあえずインストール
- gcc 版もあるが、バージョンが古くて気が向かなかったので今回はスキップ
- 追々 C 言語で開発できるようにする予定なので、多分これも導入することになると思います。
使用マイコン
秋月で売っている AT32UC3L064 を買う。ざっと調べてみた & コマンドカタカタしてみた結果はこんな感じ。
- アーキテクチャモデルは AVR32UC3L。
- FPU はなし。
- どのモデルかはよく見ていないのでわからないが、Java のバイトコードを低オーバヘッドで実行できるらしい??なにそれ!?
- 要調査(ローエンドモデルではできなさそう(多分))
ld
のエミュレーションは型番をそのまま指定して-m -m avr32elf_uc3b064
とすればいいらしい。avr32-ld -V
とavr32-ld --help
でわかる。- なんとなく、ああ、リンカスクリプトとか要らないのかという雰囲気を感じる。
アセンブル
適当にやってみる。スタートアップコードは無し。「多分この命令あるだろう」と適当に打ったらアセンブル通っちゃってビックリしましたね。
.text
.org 0x000
.global _start
_start:
ld.w r0, 100
rjmp .
以下のコマンドでビルドします。割と適当な引数ですが。
$ avr32-as -o obj/blink.o blink.s
$ avr32-ld -m avr32elf_uc3b064 --gc-sections -o output.elf obj/blink.o
$ avr32-objdump -d output.elf > output.dmp
$ avr32-size output.elf
text data bss dec hex filename
4 0 4104 4108 100c output.elf
む!?ちょっと奇妙です。
- 1命令 2bytes (16bit)
- ARM の Thumb-2 でもこんな事ありましたね。
.bss
に謎のエリア- 流石に何もしていないのに 4kBytes 食っているのはちょっと...
後者の件は気持ち悪いので、調べてみます。
$ nm output.elf
00000008 b __bss_start
00003000 b __heap_end__
00000008 b __heap_start__
00000008 b _edata
00000008 b _end
00004000 B _estack
00003000 B _stack
00001000 a _stack_size
80000000 T _start
_estack
の位置がやけに領域後方にありますね。どうやらスタックが食っているらしいです。
リンカスクリプトを見てみましょう。
.stack ORIGIN(CPUSRAM) + LENGTH(CPUSRAM) - _stack_size :
{
_stack = .;
*(.stack)
. = _stack_size;
_estack = .;
} >CPUSRAM
ふむふむ。どうやら常に _stack_size
だけのサイズを食うように記述してあるらしい。
なんか気持ち悪いけど、デフォルトでこういうように用意されているのだから、甘んじて受け入れよう。
書き込み・回路構成
かんたんなアセンブルが通ったので、次はハードウェア構成です。
書き込み
どうやら DFU や JTAG という通常の規格に加えて、aWIRE という独自規格が使えるらしいです。どうせ ICE が高いから aWIRE なんて使わんけどね。
また、DFU は USB ペリフェラルがあるもの限定なようで、記事冒頭で示したリンクの商品はそれが付いていません。一方で48pinなので扱いやすそうだよね。
秋月では USB が搭載されているものも売っていますが、64pinのものしか無いようなので、やめました。ピン数多すぎるし、何よりピッチ変換基板が不便なんですよね。
JTAGを使うぞ
ということで、JTAG 一択です。一般に JTAG インターフェイスは高いですが、FT2232 や FT232H を活用すればとても安価にできます。くれぐれも電源レベルにはお気をつけあれ。
どうやって PC と接続するのかですが、それは簡単で、OpenOCD を使えばいいのです。
回路構成
データシートをさらっと読んでみましたが、なんかいくつも電源ピンがあって面倒くさそうです。外部電源は 3.3V で良いのですが、CPU コア電源は 1.8V になっていて、内蔵のレギュレータを使う必要があるみたいです。
僕がいつも使っているマイコンくんたちは大体チップ内で内蔵レギュレータの結線が行われているんですが、このマイコンは自力で外部配線を行わなければなりません。う〜ん。。。
まあ、これまで目を向けてこなかった新しいコアで遊べると思うと、ここらへんは許容範囲と言ったところか。
〆
ということで、理屈だけを示しておしまいです。
記事が長くなるので、実際にやってみたレポートは次回にします。