自作電子小物/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社から出ている各種サンプルソースコードをご覧下さい。