PR 記事には広告が含まれています
スポンサーリンク
Translate

AVR32のDFU ブートローダーを復活させる方法

スポンサーリンク

スポンサーリンク

DFU Bootloader

AVR32のマイコンボードを作りました。

AVR32のマイコンボードが完成しました
基板が届きました先日設計した、AVR32の基板とステンシルが2週間くらいでSeeedStudioから届きました。いつもは...

このマイコンは出荷時に、DFU Bootloaderというプログラムが書き込まれています。DFUでブートすると、USBデバイスとしてパソコンに認識されて、USB経由でプログラムを書き込むことができます。

DFU Bootloaderを消してしまった

Atmel ICEがあるので、JTAG経由でプログラムを書き込んでみました。その際に普通にマイコンを消去してしまいました。消去したとしても、PA13をLowにしてリセットすれば再びDFU Bootloaderが起動するだろうと思っていました。

ところが、PA13をLowにしてRESETしても、書き込んだプログラムが実行されてしまい、DFU Bootloaderが起動しません。

あらら。DFU Bootloaderは、マイコンを消去してしまうと、一緒に消えてしまうんですね。DFU Bootloaderを使ったプログラムの書き込みもやってみたいので、DFU Bootloaderをなんとか元に戻したいです。ところが、簡単に戻せると思ったら、結構難しかったです。わかってしまえば簡単。折角なので、戻し方をご紹介します。

DFU Bootloaderはどこにあるの?

DFU Bootloaderのプログラムとデータは、0x80000000から8kB分の領域にBootloaderが、Flash User Pageの0x8008001FCにもGP Fuse Bitsというデータがあります。あとはヒューズビット。これら3つが必要なのですが、マイコンを初期化するとこれら全部含めて消えてしまいました。

DFU Bootloaderを吸い出す

AVR32のマイコンボードを2つ作ってあるので、何も手をつけていないもう一台のAVR32から、これらのデータを吸い出すことにします。吸い出すにはAtmel ICEが必要です。AVR32とAtmel ICEをJTAGで接続して、Atmel ICEをUSBでパソコンに接続します。

AVR32に対して書き込みや読み出しを行うには、atprogram というコマンドラインのソフトを利用します。GUIを使ったAteml studioのDevice Programingでは正しく書き込めませんでした。

atprogramはAtmel Studioをインストールすると、一緒にインストールされています。コマンドプロンプトを開いて、まずはその場所へ移動します。

cd \Program Files (x86)\Atmel\Studio\7.0\atbackend

Bootloader

最初にBootloaderを吸い出します。コマンドラインで

atprogram -t atmelice -i jtag -d at32uc3b064 read -o 0x80000000 -s 0x2000 -f C:\at32uc3b-flash.hex --format ihex

と実行します。AtlemICEのJTAG経由で、AT32U3B064というマイコンの、0x80000000から0x2000バイト分のデータを、hexファイルとしてC:¥at32uc3b-flash.hexに出力しなさい。というコマンドです。マイコンがAT32U3B256でしたら、-d at32uc3b256と置き換えてください。

Bootloaderのファイル、at32uc3b-flash.hexができました。Cのルートにファイルがありますが、このファイルは後で使うので、atprogramのある、\Program Files (x86)\Atmel\Studio\7.0\atbackend にコピーしておきます。

GP Fuse Bits

続いてGP Fuse Bitsを読みだすために、Flash User Page全体を読み出してみます。

atprogram -t atmelice -i jtag -d at32uc3b064 read -o 0x80800000 -s 0x200 -f C:\at32uc3b-user.hex --format ihex

at32uc3b-user.hexができました。このHexファイルを見てみると、最後に929E0D6Bとあるだけで、その他の領域は全てFFでした。

Flash User Pageは何も書かれていないということです。GP Fuse Bitだけ、アドレス0x808001FCに、0x929E0D6Bを書き込めばいいことがわかりました。

ヒューズビット

Atmel Studioの[Tools]->[Device Programing]を開き、ヒューズビットを確認します。

ヒューズビットは0xFC07FFFFでした。

DFU Bootloaderを書き込む

消去してしまった方のAVR32に、これらの情報を書き込みます。書き込みにもatprogramを使います。これには順番が重要でした。

  1. マイコンを消去する
  2. GP Fuse Bitを書き込む
  3. Bootloaderを書き込む+ヒューズを書き込む

の順番で書き込んでいきます。

まずは消去します。

atprogram -t atmelice -i jtag -d at32uc3b064 chiperase

続いてGP Fuse Bitを書き込みます。

atprogram -t atmelice -i jtag -d at32uc3b064 write -o 0x808001FC --values 929E0D6B

最後にBootloader+ヒューズビットを書き込みます。

atprogram -t atmelice -i jtag -d at32uc3b064 program -f at32uc3b-flash.hex --format ihex --verify write -fs -o 0x0 --values FC07FFFF

このヒューズビットを書き込むアドレスが、ハマるポイントでした。ネットでは

atprogram -t atmelice -i jtag -d at32uc3b064 program -f at32uc3b-flash2.hex --format ihex --verify write -fs -o 0xFFFE1410 --values FC07FFFF

というように、アドレス0xFFFE1410に書き込む方法がほとんどでした。現在のatprogramは、仕様が変更されてしまい、0x0を指定するそうです。

DFU Bootloader復活

リセットするとDFU Bootloaderが起動します。デバイスマネージャで確認すると、AT32UC3Bというデバイスが追加されているのがわかります。

Bootloaderのファイル

DFU Bootloaderのファイルは、吸いださなくても、at32uc3b-isp-1.0.2.hex や at32uc3b-isp-1.0.3.hex で検索するとネットで見つかります。DFU Bootloaderは現在たぶん1.1.0が最新のようです。ネットにあるのはバージョンよりも、私が吸い出した最新と思われるDFU Bootloaderファイルをここに置いておきます。

at32uc3b-flash.zip

もし、消去してしまった場合には、これをお使いください。

DFU Bootloaderが復活してよかったです。戻し方がわかったので、心置きなく書き込みができます。