自作電子小物/TIPS/ブートローダ使用例/PIC18F14K50
自作電子小物/TIPS/ブートローダ使用例/PIC18F14K50
Usage example of USB BootLoader - PIC18F14K50
2010年4月14日
Microchip社のUSB付マイクロコントローラであるPIC18F14K50で、USBブートローダ機能(セルフプログラマ、HID経由)を使う手順等を整理してみました。
PICkit等のプログラマ(プログラム書込み器)が現場になくとも、本体だけでプログラムの書込みがUSB経由で行う事が出来ますので、気軽にバージョンアップできる様になります。極端な使い方としては、ブートローダが書込まれたデバイスが入手できれば、プログラマを用意する必要が無くなります。
注意点として、下記の制限があります。
・ROMの4KBがブートローダ本体に取られます
・電源オン時に書込みモードに切り替える為のスイッチと12MHzのクリスタルが必要
・コンフィギュレーションが固定
<デバイスにUSBブートローダ機能を付加する>
(1)ブートローダ本体の書込み
Microchip社からオブジェクトファイル(HEX型式)が提供されていますので、これ(*1)をPICkit等のプログラム書込み器を使ってデバイスに書込みします。AKI-PIC2であれば、ゼロプレッシャーソケットに差し込んで書込み出来ますが、PICkitでは書込み用の回路(結線だけ)をブレッドボードに作って行う等の作業が要ります。プログラム書込みだけであれば開発環境のMPLABは必要でなく、書込み器に付いてくるソフトウエアだけで問題有りません。これが済めば、ブートローダ機能が付加された事になります。プログラム書込み器は以後必要ありません。
(*1): \Microchip Solutions\USB Device - Bootloaders\HID - Bootloader\USB Device - HID - HID Bootloader - C18 - PIC18F14K50.hex
<ブートローダでアプリケーションを書込む>
(!)デバイス側の準備
書込みスイッチを押しながらUSBケーブルをPCに接続して下さい。 これで、ブートローダ機能が有効になり待機状態になっているはずです。外見上の変化ありません。
(2)PC側の操作
Microchip社からWindows用のアプリケーションプログラム(\Microchip Solutions\USB Device - Bootloaders\HID - Bootloader\HIDBootLoader.exe)が提供されていますので、これを実行します。デバイスが認識されていれているメッセージが出ているはずです。見つからないメッセージの場合は、ハードウエアが問題ないか確認して下さい。良ければ、アプリケーションプログラムのオブジェクトファイルを指定し、書込みを指示すれば完了です。リセットボタンかUSBケーブルを差し直すとアプリケーションプログラムが動くはずです。
<ユーザアプリケーションプログラムをブートローダ対応にする>
ユーザプログラムは、ブートローダを意識した書き方をしなければなりません。Microchip社が提供しているUSB系のサンンプルプログラムをベースに作って行けば、自然に対応したソースコードになりますので、通常はこの方法が楽です。USBを直接使わないケース等では、多少面倒ですが2点を修正する事で対応可能です。
・割込/リセットベクタ値を変更
・リンクパラメタ(リンカースクリプト)をブートローダ用に変更
メインプログラムのソースコードに以下を追加。単にコピペするのではなく、ある程度中身を読み取っておかないと、思わぬトラブルに振り回されるかもしれません。
#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER
//
// Interrupt Service Routine
//
#pragma code
#pragma interrupt HighPriorityISRCode
void HighPriorityISRCode() {
// User code
}
#pragma interruptlow LowPriorityISRCode
void LowPriorityISRCode() {
// User code
}
//
// Vector address
//
#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
#define REMAPPED_RESET_VECTOR_ADDRESS0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS0x1018
#else
#define REMAPPED_RESET_VECTOR_ADDRESS0x00
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS0x08
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS0x18
#endif
#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void) {
_asm goto _startup _endasm
}
#endif
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void) {
_asm goto HighPriorityISRCode _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void) {
_asm goto LowPriorityISRCode _endasm
}
#pragma code
リンクパラメタはMicrochip社が提供しているブートローダ対応版を使用。
// $Id: 18f14K50.lkr,v 1.1.4.1 2005/07/25 18:23:28 nairnj Exp $
// File: 18f14K50.lkr
// Sample linker script for the PIC18F14k50 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f14k50.lib
// Bootloader
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
CODEPAGE NAME=bootloader START=0x2A END=0xFFF PROTECTED
CODEPAGE NAME=page START=0x1000 END=0x3FFF
// Application
//CODEPAGE NAME=boot START=0x0 END=0x1F PROTECTED
//CODEPAGE NAME=vectors START=0x1000 END=0x1029 PROTECTED
//CODEPAGE NAME=page START=0x102A END=0x3FFF
// Application2
//CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
//CODEPAGE NAME=page START=0x2A END=0x3FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1F3
DATABANK NAME=usb2 START=0x200 END=0x2FF PROTECTED
DATABANK NAME=sfr15 START=0xF40 END=0xF5F PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=CONFIG ROM=config
SECTION NAME=GP0 RAM=gpr0
SECTION NAME=GP1 RAM=gpr1
SECTION NAME=usbram2 RAM=usb2
SECTION NAME=USB_VARS RAM=usb2
//STACK SIZE=0x40 RAM=gpr1
STACK SIZE=0x80 RAM=gpr1
より具体的な修正方法は、Microchip社から出ている各種サンプルソースコードをご覧下さい。