Bootloaderとは、メインのプログラムをメインメモリーに取り込む短い起動プログラムのことで、簡単には、PICkit の代わりをするプログラムと考えてよいでしょう。 Bootloaderは、PCからUSB経由で、本来目的とするユーザーが作成したプログラムのHEXコードを受け取り、をPICのROMエリアに自分自身で書き込んでいきます。
Bootloader を利用するPICのメモリには、右図のようにプログラムが書き込まれます。
つまり、PCで作成した、ユーザープログラムをPICに書き込むときは、SWを押しながらUSBプラグをPCに接続します。
Bootloaderプログラム本体は、PICkitなどのプログラマーであらかじめPICに書き込む必要がありますが、Bootloaderが書き込まれたPICにユーザープログラムを書き込むには、PICkitなどのプログラマーは、不要です。
「目的とするプログラム」を、1000番地以降に配置するため、以下の2点を変更します。
Bootloadeで指定しているコンフィグレーションビットとは異なる設定にするために、ユーザープログラムに、 コンフィグレーションの記載をすることも可能です。 この場合、PCアプリのブートローダーのメニューから Program > Setting... を選びConfiguration bitsも書き込めるようにします。
タイマー0の説明で作成した、LED点灯プログラムをBootloader用に書き直したものを示します。 両者を比較してみてください。Bootloader用プログラムは、元のソースリストからコンフィグレーションの記載を削除しただけです。 ただし、MPLABXプロジェクトのXC8 linkerには、codeをoffsetするための指示を記入します。
BootloaderのプログラムをPICに書き込んだ時に、すでに、コンフィグレーションを一緒に書き込んでいるため、Bootloader用ユーザープログラムには、 コンフィグレーションの記載していません。 このためメインプログラムは、非常に簡単になっています。
USB機能の確認を行うのに適したテスト基板を作成しました(右図)。このボードを使うとBootloaderプログラムの開発などが大変に効率的に行えます。
プロジェクトファイル bl01_t0.zip |
<プログラム>
main.c
// File name: <<Bootloader専用>> // Description: Timer0 example // Timer0で内部クロック(4MHz)をカウントし、 // カウントオーバーでLEDを点滅させる。 // Notes: 4MHz内部クロック // LED RB0 // LED RB1 // LED RB2 // LED RB3 // Language: MPLAB xc8 // Target: PIC18F26J50 #include <xc.h> // void main(void){ OSCCON = 0b01100010; // 内部クロック4Mhz LATB = 0; // PortCのすべてのビットを「0」 TRISB = 0b11110000; // LEDの接続されているポートを出力に設定 T0CON = 0b10000001; // Timer 0 設定(262mSecごと) // 16BIT_mode SOURCE_INT PS_1/4 LATB = 0x03; // LED 2個を点灯 while(1){ // 繰り返しループ while(! INTCONbits.TMR0IF); // Timer 0 のタイムアップを待つ INTCONbits.TMR0IF = 0; // Timer 0 からのキャリーフラッグをクリア LATB ^= 0x0F; // LED 4個の出力を反転 } }