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も書き込めるようにします。
システムクロックの説明で作成した、LED点灯プログラムをBootloader用に書き直したものを示します。 両者を比較してみてください。Bootloader用プログラムは、元のソースリストからコンフィグレーションの記載を削除しただけです。 ただし、MPLABXのプロジェクトには、codeoffset欄に0x1000が設置されています。Bootloader用ユーザープログラムの作成手順詳細は、[ XC8でブートローダ用プログラムを作る ]をご覧ください。
BootloaderのプログラムをPICに書き込んだ時に、すでに、コンフィグレーションを一緒に書き込んでいるため、Bootloader用ユーザープログラムには、 コンフィグレーションの記載していません。 このためメインプログラムは、非常に簡単になっています。
プロジェクトファイル xBL01_LED.zip |
<プログラム>
main.c
// File name: LED // Description: DigitalIO example // 2つのLEDが点滅する。 // Notes: 12MHz Xtal 48MHzクロック // LED0 RC0 // LE1D RC1 // Language: MPLABX XC8 // Target: PIC18F14K50 #include <xc.h> #define _XTAL_FREQ 48000000 // delay_ms(x) のための定義 void DelayMs(int dlyms); void main(void){ TRISC=0b11111100; // 入出力設定 while(1){ // 繰り返しループ PORTC = 0b00000001; // LED0点灯 DelayMs(500); // 500mSecの遅延 PORTC = 0b00000010; // LED1点灯 DelayMs(500); // 500mSecの遅延 } // ここまで繰り返し } void DelayMs(int dlyms){ while(dlyms--) __delay_ms(1); // dlyms x 1mS遅延 }