まぁ、こうなると思って名前に「ぼちぼち」と入れておいた訳で…実に5ヶ月ぶりの更新です。
さて、MP3プレイヤー計画については、AT90USBの導入を検討していましたが、最近になって32bitAVRでも良いかな、なんて考え始めました。
というのは、AT90USBとAVR32を比べると、ペリフェラルの充実度ではAVR32に軍配、消費電力ではおおよそ対等、プログラム容量やメモリ容量ではAVR32に軍配、と、AT90USBを採用する理由が無くなってしまったからです。
唯一の欠点といえば、AVR32はISPによる書き込みが出来ない(=JTAGツールが必須となる)ことですが、僕はJTAGICEmkIIを大枚はたいて買っちゃったので(笑)、そこんとこもクリア。
てな訳で、AVR32の評価です。国内ではまだUCシリーズの使用レポートが見あたらないので、このブログが最初なのかもしれません。データシートだけではいまいち分かりにくい所・使用上の注意点を挙げていきたいと思います。
使用デバイス:AT32UC3B0256-A2UT (約1,500円@Digi-Key)
(1) 電源
まず電源について。今回はUSBの5V→TA48033F→(3.3V)→VDDIO, VDDIN とし、コア電源はマイコン内部のレギュレータを使用して VDDOUT→(1.8V)→VDDCORE としました。
なお、アナログは使わないので、VDDANA, ADVREF共に3.3Vに接続。
また、電源ラインにはテスターを入れています(写真左)。これはオススメ。出力ピン短絡などのアクシデントにいち早く気づけます。マイコン単体のテストで、プログラムが空の時、5mA前後でした。もちろんピン入出力の設定をいじっていないので、マイコン本体に指を近づけると変動します。
(2) クロック
XIN1, XOUT1に12MHzの3本足セラロックを接続。これをPLLで50MHz程度にして使用したい…が、上手く行きません。
PLLの設定方法がまずいようです。LOCKしてくれない。
うーむ。さっそく問題がでてきました。
なんのこっちゃ、VDDPLLが未接続(笑)。VDDPLLをコア電圧1.8Vに接続したところ、すんなり動きました。
// pull-up enable
AVR32_GPIO.port[0].puer = 0xffffffff;
AVR32_GPIO.port[1].puer = 0xffffffff;
// clock setting
// CPU : PLL0(source:OSC1)
// enables OSC1
AVR32_PM.OSCCTRL1.startup = 2; // about 1ms
AVR32_PM.OSCCTRL1.mode = 7; // crystal (>=8MHz)
AVR32_PM.MCCTRL.osc1en = 1; // enable
while(!AVR32_PM.POSCSR.osc1rdy);
// enables PLL0
AVR32_PM.PLL[0].pllcount = 32;
AVR32_PM.PLL[0].pllopt = 3; // wide-band, fVCO/2, fVCO<180MHz
AVR32_PM.PLL[0].pllosc = 1; // source is OSC1
AVR32_PM.PLL[0].pllmul = 4; // x5
AVR32_PM.PLL[0].plldiv = 0; // x2 (-> fVCO=120MHz)
AVR32_PM.PLL[0].pllen = 1; // enable
while(AVR32_PM.POSCSR.lock0 == 0);
// change CPU clock
AVR32_PM.MCCTRL.mcsel = 2; // use PLL0
なお、上記コードにあるように、全てのピンのプルアップを有効にしてフローティングしないようにし、PLLで60MHzを生成して動作クロック(CPU,HSB,PBA,PBBすべて)として使用したところ、消費電流は18.9mAとなりました。