USBブートローダーの作り方

MLAに付属のbootloaderの修正方法

●ブートローダーとは
  ・プログラムを書き込むためのプログラム。通常の書き込み機を使う方法とは装置自ら自身のプログラムを書き換える点が異なる
  ・USB対応のPICにブートローダーを書き込んでおくとUSB経由でプログラムを更新できる
   1個だけ装置を作るなら殆ど役には立たないと言って良いが装置メーカーにとってはプログラムのバグ修正をユーザーに任せることが出来るので便利

●何故このページが存在するのか
  ・Microchip社の提供するMLAに含まれているブートローダーは以下の問題がある
    -有料のPRO版コンパイラを使わないと再コンパイルできない
     無料版を使うとコードの最適化が行われずブートローダーのサイズが大きくなりコードの修正が必要になる
    -ブートローダーにはスイッチ1つ、LED1つ(LEDは無くても良い)が必要
     スイッチとLEDのポートを変更したいときは再コンパイルが必要になるが上記の問題が起こる
    -PIC18F25K50等いくつかのUSB対応PICは自分でコードを追記する必要がある

●使用したプログラムのバージョン 全部無料
 ・MPLAB X IDE v2.35
 ・MPLAB XC8 コンパイラ Free版
 ・MLA(Microchip Libraries for Applications) v2015-08-10

●予備知識
 ・ブートローダーは意外と大きい
   アドレス0~1FFFを使う(標準状態では0~FFFなのだがFree版のコンパイラを使うとこのサイズに収まらない)
 ・ブートローダー対応プログラムはお作法を守って書く必要がある
  以下の条件を満足させることが出来れば開発言語は何でも良い
   1.プログラムを0~1FFFに配置してはいけない。そこにはブートローダーがあるから
   2.プログラムの開始アドレスは0x2000、割り込みベクターは0x2008と0x2016に配置する
   3.コンフィグレーションワードはブートローダーと同じで無ければいけない
  C言語では XC8 BASICでは SwordfishSE が少しのコード追加でブートローダーに対応できる
 ・ブートローダーはUSBのHIDを使用しているためデバイスドライバーのインストールは必要ない

以下PIC25K50のブートローダーを作る手順。他のPICの場合も大体同じ手順


2015-10-11


ブートローダーに最低必要な回路構成などはこの記事を参照
シリアルブートローダーについてはこの記事を参照

********************************************************************************************************************
 ブートローダーを作る
********************************************************************************************************************

===============================================================================
 インストール
===============================================================================

それぞれインストーラーが指定するデフォルトフォルダーにインストールする
MLAは c:\
MPLAB_X_IDEとXC8は C:\Program Files\Microchip\ 
Qtは c:\Qt <-パソコン側のソフトを変更したいとき

MLAはUSB関連だけインストールすれば良いはずだが全部入れてもたいしたサイズにならない

mlainst.png

===============================================================================
 環境設定
===============================================================================

いきなり最終目標の PIC18F25K50 最終系に仕上げようとするとどこがおかしいのかわからなくなるので
定番の PIC18F4550 で正しくコンパイルできるところまでをやる

[file]-[Open Project] でプロジェクトを開く
PICのシリーズ毎に異なるフォルダーに入っているが pic18_non_j 以外はそれなりに実力の有る人が使う物なので適当に読み替えて欲しい
[file]-[Project Properties ....] で PIC18F4550_XC8をActiveにするプロジェクトを開く

何かを変更したらそれが本当に反映されているのか画面をよく見ること
Applyを押さないと反映されなかったりすることに注意する

PRJ.png

そのままの状態ではPIC18F14K50になっているので変更する。ここには何故か最終目標のPIC18F25K50は無い

config.png

===============================================================================
 コンパイル & リンク
===============================================================================

Clean and Build(ほうきと金槌のアイコン)でコンパイルするとエラーが出る

エラーメッセージ
0001  
0002 CLEAN SUCCESSFUL (total time: 63ms)
0003 make -f nbproject/Makefile-PIC18F4550_XC8.mk SUBPROJECTS= .build-conf
0004 make[1]: Entering directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0005 make -f nbproject/Makefile-PIC18F4550_XC8.mk dist/PIC18F4550_XC8/production/MPLAB.X.production.hex
0006 make[2]: Entering directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0007 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_device.p1 ../src/usb_device.c
0008 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" -C --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/VectorRemap.obj ../src/VectorRemap.asm
0009 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/BootPIC18NonJ.p1 ../src/BootPIC18NonJ.c
0010 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_descriptors.p1 ../src/usb_descriptors.c
0011 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/main.p1 ../src/main.c
0012 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_device_hid.p1 ../src/usb_device_hid.c
0013 ../src/main.c:714: warning: (162) #warning: "Recommended to implement code here to check VDD. Voltage detection can be done using ADC, HVLD, comparators, or other means."
0014 ../src/main.c:922: error: (103) #error: "This bootloader project must be built in PRO mode to fit within the reserved region. Double click this message for more details."
0015 (908) exit status = 1
0016 make[2]: *** [build/PIC18F4550_XC8/production/_ext/1360937237/main.p1] Error 1
0017 nbproject/Makefile-PIC18F4550_XC8.mk:134: recipe for target 'build/PIC18F4550_XC8/production/_ext/1360937237/main.p1' failed
0018 make[2]: *** Waiting for unfinished jobs....
0019 make[1]: *** [.build-conf] Error 2
0020 make[2]: Leaving directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0021 make: *** [.build-impl] Error 2
0022 nbproject/Makefile-PIC18F4550_XC8.mk:78: recipe for target '.build-conf' failed
0023 make[1]: Leaving directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0024 nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
0025
0026 BUILD FAILED (exit value 2, total time: 437ms)
行番号
解説
-
実際はエラーやワーニングの文字色が他と違う色になるのでこれよりずっと見やすいし、エラーをダブルクリックすると問題のファイルの該当箇所に飛んでくれる
14
warning: は無視して error: だけをつぶしていく main.cの922行目が最初の修正すべきエラーだ これはPRO版じゃないとコンパイルできないよ というメッセージなのでコメントにしてしまう

再度コンパイルするとエラーが大量に出る。ソースリストのXX行目というエラーでは無い意味不明な感じのエラーはリンカーエラー。プログラムが大きくて入らない事を意味している

エラーメッセージ
0001  
0002 CLEAN SUCCESSFUL (total time: 125ms)
0003 make -f nbproject/Makefile-PIC18F4550_XC8.mk SUBPROJECTS= .build-conf
0004 make[1]: Entering directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0005 make -f nbproject/Makefile-PIC18F4550_XC8.mk dist/PIC18F4550_XC8/production/MPLAB.X.production.hex
0006 make[2]: Entering directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0007 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_descriptors.p1 ../src/usb_descriptors.c
0008 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/BootPIC18NonJ.p1 ../src/BootPIC18NonJ.c
0009 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/main.p1 ../src/main.c
0010 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_device.p1 ../src/usb_device.c
0011 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --pass1 --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/usb_device_hid.p1 ../src/usb_device_hid.c
0012 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" -C --chip=18F4550 -Q -G --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/PIC18F4550_XC8/production/_ext/1360937237/VectorRemap.obj ../src/VectorRemap.asm
0013 ../src/main.c:714: warning: (162) #warning: "Recommended to implement code here to check VDD. Voltage detection can be done using ADC, HVLD, comparators, or other means."
0014 "C:\Program Files\Microchip\xc8\v1.34\bin\xc8.exe" --chip=18F4550 -G -mdist/PIC18F4550_XC8/production/MPLAB.X.production.map --double=32 --float=32 --emi=wordwrite --rom=default,-1000-7FFF --opt=default,+asm,-asmfile,-speed,+space,-debug --addrqual=require --mode=pro -P -N255 --warn=0 --cci --asmlist --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,+keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -odist/PIC18F4550_XC8/production/MPLAB.X.production.elf build/PIC18F4550_XC8/production/_ext/1360937237/BootPIC18NonJ.p1 build/PIC18F4550_XC8/production/_ext/1360937237/main.p1 build/PIC18F4550_XC8/production/_ext/1360937237/usb_descriptors.p1 build/PIC18F4550_XC8/production/_ext/1360937237/usb_device.p1 build/PIC18F4550_XC8/production/_ext/1360937237/usb_device_hid.p1 build/PIC18F4550_XC8/production/_ext/1360937237/VectorRemap.obj
0015 Microchip MPLAB XC8 C Compiler (Free Mode) V1.34
0016 Build date: Feb 16 2015
0017 Part Support Version: 1.34
0018 Copyright (C) 2015 Microchip Technology Inc.
0019 License type: Node Configuration
0020
0021 :: advisory: (1233) Employing 18F4550 errata work-arounds:
0022 :: advisory: (1234) * Corrupted fast interrupt shadow registers
0023 :: warning: (1273) Omniscient Code Generation not available in Free mode
0024 make[2]: *** [dist/PIC18F4550_XC8/production/MPLAB.X.production.hex] Error 1
0025 :0: error: (1347) can't find 0x58 words (0x58 withtotal) for psect "text28" in class "CODE" (largest unused contiguous range 0x2A)
0026 make[1]: *** [.build-conf] Error 2
0027 :0: error: (1347) can't find 0x54 words (0x54 withtotal) for psect "text0" in class "CODE" (largest unused contiguous range 0x2A)
0028 make: *** [.build-impl] Error 2
0029 :0: error: (1347) can't find 0x50 words (0x50 withtotal) for psect "text22" in class "CODE" (largest unused contiguous range 0x2A)
0030 :0: error: (1347) can't find 0x4E words (0x4e withtotal) for psect "text38" in class "CODE" (largest unused contiguous range 0x2A)
0031 :0: error: (1347) can't find 0x4C words (0x4c withtotal) for psect "text11" in class "CODE" (largest unused contiguous range 0x2A)
0032 :0: error: (1347) can't find 0x38 words (0x38 withtotal) for psect "text37" in class "CODE" (largest unused contiguous range 0x2A)
0033 :0: error: (1347) can't find 0x30 words (0x30 withtotal) for psect "text25" in class "CODE" (largest unused contiguous range 0x2A)
0034 :0: error: (1347) can't find 0x2E words (0x2e withtotal) for psect "cinit" in class "CODE" (largest unused contiguous range 0x2A)
0035 :0: error: (1347) can't find 0x26 words (0x26 withtotal) for psect "text42" in class "CODE" (largest unused contiguous range 0x1A)
0036 :0: error: (1347) can't find 0x22 words (0x22 withtotal) for psect "_BootMain_text" in class "CODE" (largest unused contiguous range 0x1A)
0037 :0: error: (1347) can't find 0x1C words (0x1c withtotal) for psect "text9" in class "CODE" (largest unused contiguous range 0x1A)
0038 :0: error: (1347) can't find 0x16 words (0x16 withtotal) for psect "text32" in class "CODE" (largest unused contiguous range 0xC)
0039 :0: error: (1347) can't find 0x16 words (0x16 withtotal) for psect "text36" in class "CODE" (largest unused contiguous range 0xC)
0040 :0: error: (1347) can't find 0x16 words (0x16 withtotal) for psect "text39" in class "CODE" (largest unused contiguous range 0xC)
0041 :0: error: (1347) can't find 0x14 words (0x14 withtotal) for psect "text31" in class "CODE" (largest unused contiguous range 0xC)
0042 :0: error: (1347) can't find 0x14 words (0x14 withtotal) for psect "text35" in class "CODE" (largest unused contiguous range 0xC)
0043 :0: error: (1347) can't find 0x12 words (0x12 withtotal) for psect "text7" in class "CODE" (largest unused contiguous range 0xC)
0044 :0: error: (1347) can't find 0x10 words (0x10 withtotal) for psect "text10" in class "CODE" (largest unused contiguous range 0xC)
0045 :0: error: (1347) can't find 0xE words (0xe withtotal) for psect "text8" in class "CODE" (largest unused contiguous range 0xC)
0046 :0: error: (1347) can't find 0xE words (0xe withtotal) for psect "text30" in class "CODE" (largest unused contiguous range 0xC)
0047 :0: error: (1347) can't find 0x6 words (0x6 withtotal) for psect "text18" in class "CODE" (largest unused contiguous range 0x4)
0048 :0: advisory: (1) too many errors (21)
0049 (908) exit status = 1
0050 nbproject/Makefile-PIC18F4550_XC8.mk:199: recipe for target 'dist/PIC18F4550_XC8/production/MPLAB.X.production.hex' failed
0051 make[2]: Leaving directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0052 nbproject/Makefile-PIC18F4550_XC8.mk:78: recipe for target '.build-conf' failed
0053 make[1]: Leaving directory 'C:/microchip/mla/v2015_08_10/apps/usb/device/bootloaders/firmware/pic18_non_j/MPLAB.X'
0054 nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
0055
0056 BUILD FAILED (exit value 2, total time: 2s)
行番号
解説
-
リンカーが出すエラーは大抵  XXXが見つからない  入りきらない の2つで入りきらない系の物は意味不明の物が多い

無料版のコンパイラーを使っていることにより最適化が行われなくなりプログラムのサイズが大きくなりすぎているのがエラーの原因。PRO版を購入すればエラーが出なくなるが貧乏人は ROM range を変更する。これは修正後の画面。最初はdefault,-1000-7FFFとなっている。これはアドレス1000-7FFFにはプログラムを配置するなと言う意味。それ以外の場所0~FFFにプログラムを配置しきれないのでリンカーがエラーを出している
ここまでの修正でコンパイル&リンクエラーは出なくなる

romrange.png

ブートローダーでロードされるプログラム(アプリケーションプログラム)は
 開始アドレス:0x1000
 高優先度割込アドレス:0x1008
 低優先度割込アドレス:0x1018
となっているが、この領域はこれまでの変更でブートローダーが使ってしまったので変更しなければならない
ROM rangeの変更で0x2000~0x7FFFは使用されていないので
 開始アドレス:0x2000
 高優先度割込アドレス:0x2008
 低優先度割込アドレス:0x2018
に修正する

このアドレスに関連するファイルは
 VectorRemap.asm
 BootPIC18NonJ.h
下にリストを掲載しておく

ブートローダーのサイズはこれで2倍になったが詰めようと思えばもっと小さくなる
以下の理由でここでは2倍にした
 ・残ったメモリーだけでも十分に大きく使い切れない
 ・ちょうどきりが良い
 ・ちょうどきりが良いアドレスなのでconfigurationビットでブートローダーにプロテクトをかけられる

VectorRemap.asm
0001  ;-------------------------------------------------------------------------------
0002 ;* FileName: VectorRemap.asm
0003 ;* Dependencies: None
0004 ;* Processor: PIC18
0005 ;* Compiler: MPLAB C18 3.46+ or XC8 v1.21+
0006 ;* Company: Microchip Technology, Inc.
0007 ;*
0008 ;* Software License Agreement
0009 ;*
0010 ;* The software supplied herewith by Microchip Technology Incorporated
0011 ;* (the "Company") for its PIC(R) Microcontroller is intended and
0012 ;* supplied to you, the Company's customer, for use solely and
0013 ;* exclusively on Microchip PIC Microcontroller products. The
0014 ;* software is owned by the Company and/or its supplier, and is
0015 ;* protected under applicable copyright laws. All rights are reserved.
0016 ;* Any use in violation of the foregoing restrictions may subject the
0017 ;* user to criminal sanctions under applicable laws, as well as to
0018 ;* civil liability for the breach of the terms and conditions of this
0019 ;* license.
0020 ;*
0021 ;* THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTIES,
0022 ;* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
0023 ;* TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
0024 ;* PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
0025 ;* IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
0026 ;* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
0027 ;-------------------------------------------------------------------------------
0028
0029 ;//High priority interrupt vector remapping
0030 #ifdef __XC8__
0031 PSECT HiVector,class=CODE,delta=1,abs
0032 #endif
0033 org 0x08
0034 goto 0x1008 ;Resides at 0x0008 (hardware high priority interrupt vector), and causes PC to jump to 0x1008 upon a high priority interrupt event
0035
0036
0037 ;//Low priority interrupt vector remapping, as well as bootloader mode absolute
0038 ;//entry point (located at 0x001C).
0039 #ifdef __XC8__
0040 PSECT LoVector,class=CODE,delta=1,abs
0041 #endif
0042 org 0x18
0043 goto 0x1018 ;Resides at 0x0018 (hardware low priority interrupt vector), and causes PC to jump to 0x1018 upon a low priority interrupt event
0044 goto 0x30 ;Resides at 0x001C //Serves as absolute entry point from application program into the bootloader mode
0045
0046
0047
0048 end
行番号
解説
34,43
1008->2008,1018->2018に変更する。PICの割り込みベクターはアドレスでは無くgoto命令が実体
BootPIC18NonJ.h
0001  /*********************************************************************
0002 *
0003 * Microchip USB HID Bootloader v1.01 for PIC18F and PIC18LF versions of:
0004 * PIC18F4553/4458/2553/2458
0005 * PIC18F4550/4455/2550/2455
0006 * PIC18F4450/2450
0007 * PIC18F14K50/13K50
0008 *
0009 *********************************************************************
0010 * FileName: BootPIC18NonJ.h
0011 * Dependencies: See INCLUDES section below
0012 * Processor: PIC18Fxxxxx (with no J in the part number) USB microcontrollers
0013 * Compiler: C18 3.46+ or XC8 v1.21+
0014 * Company: Microchip Technology, Inc.
0015 *
0016 * Software License Agreement
0017 *
0018 * The software supplied herewith by Microchip Technology Incorporated
0019 * (the "Company") for its PIC(R) Microcontroller is intended and
0020 * supplied to you, the Company's customer, for use solely and
0021 * exclusively on Microchip PIC Microcontroller products. The
0022 * software is owned by the Company and/or its supplier, and is
0023 * protected under applicable copyright laws. All rights are reserved.
0024 * Any use in violation of the foregoing restrictions may subject the
0025 * user to criminal sanctions under applicable laws, as well as to
0026 * civil liability for the breach of the terms and conditions of this
0027 * license.
0028 *
0029 * THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTIES,
0030 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
0031 * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
0032 * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
0033 * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
0034 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
0035 *
0036 * File version Date Comment
0037 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0038 * 1.0 06/03/2008 Original
0039 * 2.9j 06/11/13 Added some definitions.
0040 ********************************************************************/
0041 #ifndef BOOTPIC18NONJ_H
0042 #define BOOTPIC18NONJ_H
0043
0044 /** P U B L I C P R O T O T Y P E S *****************************************/
0045 void UserInit(void);
0046 void ProcessIO(void);
0047 void ClearWatchdog(void);
0048 void DisableUSBandExecuteLongDelay(void);
0049
0050
0051 //Vector remapping/absolute address constants
0052 #define REMAPPED_APPLICATION_RESET_VECTOR 0x1000
0053 //#define REMAPPED_APPLICATION_HIGH_ISR_VECTOR 0x1008 //See VectorRemap.asm
0054 //#define REMAPPED_APPLICATION_LOW_ISR_VECTOR 0x1018 //See VectorRemap.asm
0055 #define BOOTLOADER_ABSOLUTE_ENTRY_ADDRESS 0x001C //Execute a "goto 0x001C" inline assembly instruction, if you want to enter the bootloader mode from the application via software
0056
0057 #define APP_SIGNATURE_ADDRESS 0x1006 //0x1006 and 0x1007 contains the "signature" WORD, indicating successful erase/program/verify operation
0058 #define APP_SIGNATURE_VALUE 0x600D //leet "GOOD", implying that the erase/program was a success and the bootloader intentionally programmed the APP_SIGNATURE_ADDRESS with this value
0059 #define APP_VERSION_ADDRESS 0x1016 //0x1016 and 0x1017 should contain the application image firmware version number
0060
0061
0062
0063 #endif //BOOTPIC18NONJ_H
行番号
解説
52,55,57,59
1000->2000,1006->2006に変更する。ベクターアドレスも書いてあるがこれは割り込みベクターについてはVectorRemap.asmを参照しろ というコメント的意味しか無い

APP_SIGNATURE_ というのはブートローダーがアプリケーションプログラムを正常に書き込み終わった時にこのアドレスに0x600Dという値を書き込んでいる。0x600Dというサインが書き込まれていなければアプリケーションプログラムは実行されないようになっている。プログラムの暴走を阻止するための物だ

PIC18F4550ならここまでの作業で終わり
スイッチの定義などをやっていないが0x600Dサインのおかげで最初の起動時だけは正常に動作する
スイッチの定義の部分は最終目的のPIC18F25K50と重複するのでPIC18F4550については省略。以下PIC18F25K50について作業となる
PIC18F2550が定番であるがPIC18F25K50の方が安い。新型の方が安くなり旧型の価格は特に値下げしないのがMicrochip社の方針のようだ
先ず定義を追加する

newconfig.png

設定の続き。Deviceの型番、書き込み装置、コンパイラーを選択する

device.png

パラメータを全部移植する。PIC18F45K50とPIC18F25K50は同一ファミリーなのでPIC18F45K50からパラメータを移植すると確実。同一ファミリーはデータシートが共通になっている事で確認できる

copyparam.png

ブートローダーとアプリケーションプログラムの起動を切り替える方法は2通りある
 方法1.電源投入時にSWが押されていたらブートローダーを起動する、そうで無ければアプリケーションプログラムを実行する
 方法2.USBコネクターから電力供給されていたらブートローダーを起動する、そうで無ければアプリケーションプログラムを実行する
方法2はUSBをプログラム書き換えにしか使わないときには有効。但し以下の理由で方法2は当説明では使わない
 ・アプリケーションプログラムのバグ取り中にUSB電源供給が使えないと不便
 ・方法1も方法2もPICのI/Oピンを1つ使ってしまう。方法1の場合はスイッチのために、方法2の場合は電源がUSBから供給されているか否かの判断に

PIC18F25K50の定義を追加してコンパイルするとエラーはいろいろ出る。今まではワーニングを無視していたが以降はワーニングも目障りなので消していく
修正するファイルは2つ

============================
HardwareProfile.h
============================
 48行目をコメントにする 目障りなので
 122行目をコメントにして以下の定義を追加
   //LED definition, applicable if using ENABLE_USB_LED_BLINK_STATUS option in usb_config.h
   #define mLED1 LATBbits.LATB0
   #define mLED1Tris TRISBbits.TRISB0
   /** SWITCH *********************************************************/
   #define mInitSwitch2() {ANSELAbits.ANSA1 = 0; TRISAbits.TRISA1 = 1;}
   #define sw2 PORTAbits.RA1
   #define mDeInitSwitch2() {ANSELAbits.ANSA1 = 1;}
  回路構成は回転計多機能版Ver2の物を参照(トップページから全作品を選んで「回転計多機能版Ver2」で検索すると見つかる)
  PICの型番によってはADCONを設定する必要があったりする

============================
main.c
============================
342行目にコンフィグレーションビットの定義を追加
  アプリケーションプログラムとブートローダーはコンフィグレーションビットが同じでないといけない
  XC8コンパイラーを使ってアプリケーションプログラムを作るのであればアプリケーションプログラムのものをそっくりコピーすると良い
  厳密にはブートローダーとアプリケーションプログラムで共通に使われる物についてのコンフィグレーションビットが同じであれば良いのだが
  何処が共通しているのかを考えることよりも全部合わせてしまうほうが容易
  回転計多機能版Ver2では以下のようになる。これは回路構成によって変えるべき所が多数有るのでサンプルでしか無いと思って欲しい
   #pragma config PLLSEL = PLL3X // PLL Selection (3x clock multiplier)
   #pragma config CFGPLLEN = ON // PLL Enable Configuration bit (PLL Disabled (firmware controlled))
   #pragma config CPUDIV = NOCLKDIV // CPU System Clock Postscaler (CPU uses system clock (no divide))
   #pragma config LS48MHZ = SYS48X8 // Low Speed USB mode with 48 MHz system clock (System clock at 48 MHz, USB clock divider is set to 8)
   #pragma config FOSC = HSH // Oscillator Selection (Internal oscillator)
   #pragma config PCLKEN = OFF // Primary Oscillator Shutdown (Primary oscillator shutdown firmware controlled)
   #pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Fail-Safe Clock Monitor disabled)
   #pragma config IESO = OFF // Internal/External Oscillator Switchover (Oscillator Switchover mode disabled)
   #pragma config nPWRTEN = OFF // Power-up Timer Enable (Power up timer disabled)
   #pragma config BOREN = OFF // Brown-out Reset Enable (BOR enabled in hardware (SBOREN is ignored))
   #pragma config BORV = 190 // Brown-out Reset Voltage (BOR set to 1.9V nominal)
   #pragma config nLPBOR = ON // Low-Power Brown-out Reset (Low-Power Brown-out Reset enabled)
   #pragma config WDTEN = SWON // Watchdog Timer Enable bits (WDT controlled by firmware (SWDTEN enabled))
   #pragma config WDTPS = 32768 // Watchdog Timer Postscaler (1:32768)
   #pragma config CCP2MX = RC1 // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
   #pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<5:0> pins are configured as digital I/O on Reset)
   #pragma config T3CMX = RC0 // Timer3 Clock Input MUX bit (T3CKI function is on RC0)
   #pragma config SDOMX = RB3 // SDO Output MUX bit (SDO function is on RC7)
   #pragma config MCLRE = OFF // Master Clear Reset Pin Enable (MCLR pin enabled; RE3 input disabled)
   #pragma config STVREN = ON // Stack Full/Underflow Reset (Stack full/underflow will cause Reset)
   #pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
   #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming Port Enable (ICPORT disabled)
   #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled)
   #pragma config CP0 = OFF // Block 0 Code Protect (Block 0 is not code-protected)
   #pragma config CP1 = OFF // Block 1 Code Protect (Block 1 is not code-protected)
   #pragma config CP2 = OFF // Block 2 Code Protect (Block 2 is not code-protected)
   #pragma config CP3 = OFF // Block 3 Code Protect (Block 3 is not code-protected)
   #pragma config CPB = OFF // Boot Block Code Protect (Boot block is not code-protected)
   #pragma config CPD = OFF // Data EEPROM Code Protect (Data EEPROM is not code-protected)
   #pragma config WRT0 = ON // Block 0 Write Protect (Block 0 (0800-1FFFh) is not write-protected)
   #pragma config WRT1 = OFF // Block 1 Write Protect (Block 1 (2000-3FFFh) is not write-protected)
   #pragma config WRT2 = OFF // Block 2 Write Protect (Block 2 (04000-5FFFh) is not write-protected)
   #pragma config WRT3 = OFF // Block 3 Write Protect (Block 3 (06000-7FFFh) is not write-protected)
   #pragma config WRTC = OFF // Configuration Registers Write Protect (Configuration registers (300000-3000FFh) are not write-protected)
   #pragma config WRTB = ON // Boot Block Write Protect (Boot block (0000-7FFh) is not write-protected)
   #pragma config WRTD = OFF // Data EEPROM Write Protect (Data EEPROM is not write-protected)
   #pragma config EBTR0 = OFF // Block 0 Table Read Protect (Block 0 is not protected from table reads executed in other blocks)
   #pragma config EBTR1 = OFF // Block 1 Table Read Protect (Block 1 is not protected from table reads executed in other blocks)
   #pragma config EBTR2 = OFF // Block 2 Table Read Protect (Block 2 is not protected from table reads executed in other blocks)
   #pragma config EBTR3 = OFF // Block 3 Table Read Protect (Block 3 is not protected from table reads executed in other blocks)
   #pragma config EBTRB = OFF // Boot Block Table Read Protect (Boot block is not protected from table reads executed in other blocks)
  WRT0とWRTBでブートローダーを書き込みからプロテクトする。もちろんpickitでは上書き可能
714行目のLowVoltageCheckのワーニングをコメントにする 目障りなので


********************************************************************************************************************
 ブートローダー対応アプリケーションプログラムを作る
********************************************************************************************************************

XC8コンパイラーの場合はここと

memmodel.png

ここの2カ所をこの通りの値に変更するだけでブートローダー対応のアプリケーションプログラムになる

offset.png
SwordfishSE(BASIC系の言語)の場合のサンプル。使えるPICの種類が少ない。現時点ではPIC18F25K50非対応
0001  {
0002 *****************************************************************************
0003 * Name : USB kaitenkei Standard *
0004 * Author : Hiroyuki Iizuka *
0005 * Date : 2010/03/19 *
0006 * Version : 1.0 *
0007 * Notes : *
0008 * : *
0009 *****************************************************************************
0010 }
0011 Program kaitenkeiStandard
0012
0013 '---- configuration ---------------------------------------------------------
0014 Device = 18F4550
0015 Clock = 48
0016
0017 Config
0018 USBDIV = 1,
0019 PLLDIV = 5,
0020 CPUDIV = OSC1_PLL2,
0021 FOSC = HSPLL_HS,
0022 MCLRE = OFF
0023
0024 '---- include file ----------------------------------------------------------
0025 Include "Convert.bas"
0026
0027 '---- interrupt -------------------------------------------------------------
0028 #option org_reset = $2000
0029 #option vector_isr_hi = $2008
0030 #option vector_isr_lo = $2018
0031
0032 Const ipLow = 1
0033 Const ipHigh = 2
0034
0035 以下略
行番号
解説
28~30
3行追加するだけ

PC側の画面はこれ。MLA付属の物を変更無しでそのまま使える。開発はQtを使っているWindows、Mac、Linuxのクロス開発環境になっているのでプログラムを一つ作るだけでいろいろな環境に対応できる。MLAのものはV5.0.2を使用しているが現時点の最新版であるV5.5.0でもコンパイルできる。ネット上に情報が少ないので現時点ではいじらない方が良いと思う

writehex.png
プログラム現物
ファイル ファイルタイプ 添付ファイルの解説
pic18_non_j.zip OTHER ブートローダーファイル一式