ATmega32u4 (3)

Date: 2020/04/05 (initial publish), 2021/12/12 (last update)

Source: jp/note-00022.md

Previous Post Top Next Post

TOC

今回も引き続き基本のUSB AVRの ATmega32u4 を中心としたAVRチップに関して、Teensy 2.0の中華コンパチ評価ボード を用いて練習します。

割り込みVector表

アセンブラーとC言語で書かれたBootloaderからの起動を追いかけて、 電源投入(POR)やリセットボタンを押された際のMCU処理の流れが気に なりました。アセンブラーは、しっかり割り込みVector表があるのが 分かるのですが、C言語で書かれた場合特に明示的なテーブルが無いの にどうして割り込みVector表がプログラムされてくるのかがよく見え ませんでした。

C言語では割り込みルーチンはISR(<割り込みVector名>)という形で 関数として定義します。割り込みVector表自体は明示的にプログラムしません。

後で考えれば「なーんだ」でしたが、リンカーがコンパイル時に、 このISR()関数定義にあわせて、コンパイラー提供のスタートアップ コード中の確保されている割り込みVector表に、割り込みルーチンの アドレスを入れ完成するらしいと分かりました。確かによく見ると 割り込みVector表は、blink.lstに見当たらないが、blink.lss等 に定義されています。

ISP接続とUSB接続の干渉問題

ISP接続でブートローダーを導入した上で、その動作をUSB経由接続でアプリケーション のファームウエアーを導入して試そうとして見た際に、何度やっても電源投入で ファームウエアーが立ち上がらず、ブートローダーが立ち上がって悩みました。

問題はISP接続のリセット線が繋がっていたことです。通電時でも0.5Vぐらいの端子の ため、リセット線がPULL-DOWNされてリセットボタンが押されたのと同じ状態になって MCUが停止していたようです。さらにややこしくしたのは改造ISPではプログラマーの 電圧検知端子がプログラマーのVCCに繋がっているので、評価ボードからプログラマー に電気が供給され、電圧の高いリセットボタンが離された状態に一時的にでもなるのか 単にMCUの実行が止まるのではなくちゃんとリセットがかかり、ブートローダーが 立ち上がるようです。

少なくとも、プログラマーからのISP接続のリセット線だけは評価ボードから抜く 必要があります。まあ、VCCに繋がっている線も念のため抜くべきです。これらが ATmega32u4 (2) ISP接続 の「(使わないときは抜く)」という表記の背景です。

LED点滅 (Lチカ)

まず、ブートローダー動作確認用にATmega32u4用に単純なLEDの点滅(通称Lチカ) というアプリケーションのファームウエアーのコードをPD0:PD7ピン全部を点滅 させるように書き換えます。こうすることでLチカが、このアプリケーションに よるのか、それともブートローダー中のコードによるのかを、外部LED挙動で 簡単に判別できるようになります。

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void) {
  CLKPR = 0x80;
  CLKPR = 0; // set cpu prescale to 1 (disable CKDIV8)
  DDRD = 0xff;
  while (1) {
    PORTD = 0xff;
    _delay_ms(100);  // 0.1 ms delay
    PORTD = 0;
    _delay_ms(1000);  // 1.0 s delay
  }
}

ここで、Atmega328Pの場合 との大きな違いは、最初のCLKPRへの書き込みの2行です。これは、 FUSEがCKDIV8と設定された際にCPU供給周波数が分周され2MHzで ゆっくり走るので、ソフトからこの設定を解除し、CPU供給周波数を 確実に全速の16MHzに設定しています。これがないと、超低速Lチカ になってしまいます。

実際には、これをベースに2つのコードを作成しました。もちろんこれらの中のMakefileは、MCU = atmega32u4としています。

さらに、MCU = at90usb1286とした2つのコードも作成しました。

AVRISP mkIIを用いて、ATmega328Pと同じようにmake programを実行すれば FUSEテストと同じISP接続 でプログラムできます。

一度プログラムできると、ISP接続をキチッと外し(単に ISPプログラマーをPCから抜くのではなく評価ボード側の 少なくともリセットと電源供給を外す)、ミニUSBコネクター でPCとケーブル接続すると、PCから電源供給されLチカが始まります。

CDC, DFU, HID ブートローダー

USB AVRのブートローダーには CDC, DFU, HID ブートローダーの3種類あります。 TEENSY2++のボードを安く手に入れたので、ハンダ付けがしやすそうなので、 作りかけで放置されていたキーボードはTEENSY2++にし、TEENSY2は1キーや、 4キーの小型外付けキーボードに仕上げるようにします。

そこで、ブートローダーももう一度見直しました。

1年半ぶりに遊ぶに当たって、依然と共通点がないのでここにあった内容は削除し、 その内容相当を ATmega32u4 (4) にもう一度見直しかきました。久しぶりにやると忘れていることも多かったです。

Previous Post Top Next Post