Microchip Libraries for Applications
略してMLAです。 参考になるプログラムが数多く入っていますので使う方も多いと思います。
ただし、100%動作するとは限りません。 バグがあることはあります。
今回、PIC16F145xのHID Bootloderを作るときに遭遇しました。 正常に書き込んでいるのに、ベリファイエラーになる。 典型的な?バグですね。
一寸厄介なのは、PIC側の問題なのかPC側の問題なのか? ネット上を調べてみても情報が見つからない。 PIC16F145xの記事自体も少ない。 なんか面倒そうだ。
対象のMLA
MLA v2017_03_06 (2018/04/10現在最新)
以降修正される可能性はあります。
問題個所は…
先に、互換HID Bootloaderを作っていきました。 PIC18Non-JのBootloaderをベースに変更したので短時間で、USB通信可能になっていたからです。
テストプログラムも作って在ったので比較すればと。
結果 UserID や ConfigurationWord が読み出せない点が問題でした。 問題が分かれば、修正箇所も直ぐに探し出せました。
395 TmpAddr = ((uint32_t)PacketFromPC.Address / 2); 396 PMADR = TmpAddr; 397 398 //Read every byte of flash memory that the PC app is requesting 399 for(i = 0; i < PacketFromPC.Size; i++) 400 { 401 if(TmpAddr >= CONFIG_WORDS_START_ADDRESS) 402 { 403 PMCON1bits.CFGS = 1; // Read from config not Flash 404 PMADRH=0; 405 }
BootPIC16F145x.c 400行付近抜粋
一目瞭然 401行目が問題です。
TmpAddr は、Word 処理用にアドレスが1/2されています。 401行目の比較は、Wordアドレス と Byteアドレスを比較していますので絶対に真になりません。 あとUserIDの方が小さいので、比較対象をUserIDのアドレスにする必要があります。
335 case PROGRAM_DEVICE: 336 //Check if host is trying to program the User ID bytes (or config ... 337 if(PacketFromPC.Address >= USER_ID_ADDRESS) 338 { 339 //Check if the host is trying to program the config bits 340 if(PacketFromPC.Address >= CONFIG_WORDS_START_ADDRESS) 341 {
BootPIC16F145x.c 340行付近抜粋
401行目の修正は、337行目のIF分と同じにします。
401 if(TmpAddr >= CONFIG_WORDS_START_ADDRESS)
下記に書き換える
401 if(PacketFromPC.Address >= USER_ID_ADDRESS)
これだけで、ベリファイエラーは無くなりました。。
xc8 フリー版でコンパイルするには
何時もの如くPRO版でないとコンパイルできません。 そこで、修正します。
BootPIC16F145x.h
44 #define APP_SPACE_RESET_VECTOR 0xC04 45 #define APP_SPACE_START_ADDRESS 0xC00 45 #define APP_SIGNATURE_ADDRESS 0xC00 46 #define APP_SIGNATURE_VALUE 0x6D 47 #define APP_VERSION_ADDRESS 0xC02
各アドレスの0x900~0x904を変更します。 0xB00でもギリギリ入るのですが、余裕をもって0xC00に指定ます。
main.c
703 #ifdef __XC8__ 704 // #if _HTC_EDITION_ < 2 //Check if PRO, Standard, or Free mode 705 // #error "This bootloader project must be built in PRO mode to fit ..." 706 // #endif 707 #endif
xc8のPRO版未満エディションをエラーにしていますので、コメントアウトしています。
HardwareProfile.h
34 //#if defined(__16F1459)|| defined (__16F1454) 35 // #define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT 36 //#else 37 #define YOUR_CUSTOM_BOARD 38 // #advisory "You need to add platform specific settings for your ..." : 45 //#endif
ハードウェア(ボード)の選択部分ですがデバイスで固定されています。(変だ?) 自由に選択できるのが普通かなと。
#define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT または #define YOUR_CUSTOM_BOARD のどちらか一つを選んでください。
自分で作ったボードならYOUR_CUSTOM_BOARDを選んでこのファイルの下方にあるハードウェア設定を変更することをお勧めします。
リンカ設定
xc8のリンカ設定を変更します。
ROM rangesを変更する。
ROM rangesを「default,-C00-1FFF」に変更します。
これで、コンパイルするとPIC16F145xのHID Bootloader マイクロチップ版が出来上がります。
免 責
情報は出来るだけ正確に書くつもりです。ただこの記事を見て作ると思ったときは、 個人の責任において作業を行なってください。 データの喪失や機器の損傷が有っても、一切の責任は取れません。