自作電子小物/TIPS/SDカードブートローダ/AVR

 
 

アトメル社のマイクロコントローラのAVRシリーズ用の、SDカードを媒体としたブートローダ(セルフプログラマ)です。書込み器等を使わずに、単独でのプログラムアップデートが可能になります。ATMELのATmega328P用として作成しました。この、ブートローダを書込んでおけば、アプリケーションプログラムの変更が、とても簡単になり、場合によってはISPコネクタを無くせます。

 

SDcard BootLoader for AVR

2010年9月4日

仕様

 プログラム書込み機能:

     電源オンやリセット時、SDカード内にHEXファイルがあればAVR内のFlashメモリに書込みます。

     ユーザプログラムの最大コードサイズは28kバイト (0x0000-0x6fff)

     越えた部分は書込みされませんので、ビルド時に87%以下になるようにして下さい。

     ユーザプログラムは、特にブートローダを意識する必要はありません。

     サムチェックや書込み確認は行っていません。

     ヒューズビットの変更機能はありません。

 SDカードメディア:

     2GB未満、MMC,SDHCは未対応、マスタブートレコードの付いたFAT12とFAT16ファイルシステム(※1)

     ルートディレクトリ直下のファイル”M328P.HEX”が対象。

     ファイルフォーマットはプレーンテキストでインテル形式です。

 SDカードインタフェース:

     ハードウエア接続はSPIを使用。

     ポートはSS=B2, SCLK=B3, MISO=B4, MOSI=B5で固定です。

 書込みスイッチ:

     オンにすると、書込み機能が有効になります。

     アクティブロー(有効=0V、無効=電源電圧)です。

     ポートB1(変更可)にトグル、スライド、プッシュスイッチ等を接続して下さい。

     カードコネクタのCD/DET(カード検出信号)で代用する場合、

       必ずブート時に.HEXファイルを検索するように出来ます。

     カードコネクタのWP(書込み保護)で代用する場合、

       書込み保護されたカード内に.HEXファイルが存在する時だけ、機能するようになります。

 ステータス表示LED:

     ポートD2(変更可)にLEDを接続して下さい。

     アクティブロー(点灯=0V、消灯=電源電圧)です。

     書込み中は点滅、正常時は消灯、エラー時は点灯します。

 対応CPU: ATMEL社ATmega328P

 ブートローダ本体プログラムメモリ量: 4kバイト (0x7000-0x7fff)

 開発環境: AVR Studio 4.18.700 + WinAVR-20100110(GCC 4.3.3)

     AVRISP mkII


注意:

1 基本的には、SDカードの規格を決めているSDアソシエーションが提供するユーティリティ・SDフォーマッターをお使い頂き、FAT16で初期化して下さい。Windows用、Mac用の両方があります。Windows自体が持つフォーマット機能を使用する場合は、FAT32にならない様に注意して下さい。Mac OS Xの付属のディスクユーティリティは、FAT16でフォーマットが出来ないようです。2GB以下のSDカード購入時のフォーマットはFAT16になっている事がほとんどのようなのでそのまま使えると思います。


ダウンロード

関連ソース全てとサンプルプログラムが入ったAVR Studioプロジェクトファイル

SDcard_BootLoader_for_AVR_files/SDBootLoader01.zip
SDBootLoader01a.zip(108kB)  V0.1a (2010.12.20 bug fix)

回路のEAGLEプロジェクトファイル


使い方

・ブートローダ本体書込み

ダウンロードしたファイル内のSDBootLoader01.HEXファイルを、AVRISP等のプログラム書込み器でデバイスに書込みします。通常のプログラムコードとは異なり、ブートローダ用の位置0x7000〜に書かれます。次に、ヒューズビット中のブートローダを有効にするビットを、やはりプログラム書込み器で変更します。下図参照。

よほどの事が無い限り、ブートローダ本体は消えませんので、以後プログラム書込み器は不要になります。もし、プログラム書込み器でアプリケーションプログラムを書込んでしまうと、ブートローダが機能しなくなります。


・アプリケーションプログラム書込み

ユーザプログラムの.HEXファイルを、SDカードにコピーし、”M328P.HEX”のファイル名に変更しておきます。これをターゲットに挿入し、書込みスイッチを有効にし、電源を投入します。2〜3秒すると書込みが始まり、LEDが約1秒間隔で点滅します。終了すると、自動的にユーザプログラムが動き出します。

通常は、書込みスイッチをオフにしておけば、ブートローダが動き出す事はありません。


ユーザプログラムの作り方

特に、ブートローダ用のビルドの仕方がある訳ではありません。通常のプログラムと全く同じです。ただし、使用出来るコードサイズはデバイスのFlashサイズより4kB少なくなる様にして下さい。328Pの場合28kB以下です。越えた場合、越えた分のコードはFlashに書込まれませんので、正しい動作は期待出来ません。


ブートローダ本体の作り方

・ソースコードの作成

ブートローダだからといって、特に変わった書き方をする部分はありませんが、設定出来るコードサイズは1,2,4kBですので、最大4kB以内にしないとプログラムにひと工夫を加える必要が出て来ます。もちろん、サイズが大きくなるにつれて、ユーザプログラムで使えるサイズも減って来ますので、小さい事に越した事はありません。

ユーザプログラム起動まで、全てのリソースは使い放題ですが、引き渡す時はリセットと同じ状況に戻した方が行儀が良いでしょう。


・ビルド方法

ブートローダ本体とユーザプログラムの違いは、ここで変わって来ます。開始アドレスは、通常のプログラムとは違いますので、コードを生成するコンパイラorリンカの設定が必要になってきます。具体的には、AVR Studioでオプションを次の様に登録するだけです。

Project menu: Configuration options -> Memory settings -> Add

[Edit memory segment]

Memory type: Flash

Name: .text

Address: 0x3800 (ブートローダ本体の格納先頭アドレスをワード(2バイト)単位で指定)

これで、ブートローダ用のメモリ位置に配置されるコードが生成されるようになります。これは、作られるコードの開始アドレスを0x0000を0x7000に変更する為の指定です。

出来たHEXファイルをライタで書込みします。


・ブートローダ固有の設定

このままでは、ブートローダは動きません。相変わらず、0x0000から始まるユーザプログラムが起動されます。切り替える為には、ヒューズビットを変更する必要があります。AVRISP mkII等のライタを使い、以下の項目を変更する事で、ブートローダが有効になります。

BOOTSZ: コードサイズを選択

BOOTRST: オンにする


ベースボード

プログラム書き換えが楽になるので、多目的に使用出来るベースボードを作ってみました。LED×1、キャラクタLCDモジュール、 プッシュスイッチ×4、小型スピーカを付けられる様にしていますので、このままでも色々な事が出来ると思います。EAGLEで回路/基板設計しています。詳細はダウンロードして見て下さい。


その他

以前から欲しい機能でしたが、SDカード制御の為のコードサイズの大きさから現実的ではありませんでした。自家製SDカードライブラリのAVR版のコードサイズがとても小さかったので、チャレンジしてみました。

ATmega88シリーズはアーキテクチャとしてブートローダが考慮(やり過ぎだと思う位です)されていますので、本体が壊れにくく安心して使用する事が出来ます。

SDカードのアクセスには、自家製ライブラリを利用しましたが、そのままだとブートローダ自体のコードサイズが4kBを越えてしまいます。越えても回避させる方法もありますが、色々と制約が増えてしまうので、未使用の機能を削除する等のメモリ使用量削減策を講じています。

ブートローダが書込み済みのデバイスが販売されていれば、高価なプログラム書込み器を用意しなくとも良いので、電子工作を気軽に楽しめるようになります。でも、AVRの場合は千円台の書込み器がありますので、メリットが少ないかもしれません。