PICシリアルブートローダー

USB->シリアル変換IC CH340G を使用したMicrochip社アプリケーションノート AN1310 シリアルブートローダー
詳細は日本語のアプリケーションノートを参照 AN1310 で検索すればPDFファイルとプログラムが直ぐに見つかる

================================================================================
 このページにおける言葉の定義
================================================================================
・アプリケーションファームウェア
  ブートローダーによって書き込まれるファームウェア
・ブートローダーファームウェア
  PIC上で動作するブートローダー
・ブートローダープログラム
  Windows側のプログラム

================================================================================
 概要
================================================================================
・ブートローダーファームウェアのサイズは約0x400(1kbyte)。USBブートローダーと比べると小さい
・アプリケーションファームウェアの開発言語は何でも良い
 これは以下の2つの特徴による
  1.ブートローダーファームウェア自身が割込を使わないので割り込みベクターのアドレスを絶対値設定出来ない言語にも対応できる
  2.標準状態においてはブートローダーファームウェアはメモリーアドレスの一番後ろにあるためアプリケーションファームウェアを配置するアドレスを絶対値指定できない言語に対応できる
・アプリケーションファームウェアはブートローダー上で動作させるための特殊な記述は不要
・ブートローダーファームウェアはアセンブラ。MPLABが必要(現時点では1つ前の古い開発環境)
 PICの種類によりコードを変更する必要があるのでアセンブル環境が必要
・ブートローダープログラムはQtで開発されているが特に変更の必要は無い
 ブートローダーに必要の無いシリアルモニター機能など盛りだくさんでシンプルでは無い
・PICはUSARTを備えた物に対応できる
 標準状態では devices.inc にある約270種のPIC18シリーズ、約140種のPIC16シリーズ
 ソースの変更なしにこれだけの物が動くという意味では無い。コンフィグレーションワードがそのまま使えるわけも無く微修正は必要
 USARTは多くのPICに存在するのでここに無いものにも対応は容易
・AN1310は日本語のアプリケーションノートがある
・ブートローダーファームウェアが自分自身を書き変えないようにソフトウェアによる書き込み保護機能を備えている
 標準状態ではOFFになっているので有効にしたい場合は  bootconfig.inc のコメントを外す
・AN1310のアプリケーションファームウェアのサンプルは非常に解りにくいプログラムなのでシンプルな物を自作した方が良い

================================================================================
 ブートローダーアセンブラーコードの変更
================================================================================
・コンフィグレーションワードはアプリケションプログラムに合わせる
・シリアル通信速度は自動検出されるのでブートローダーのファームウェアでボーレート設定は不要
・RX,TXはPICの種類によりポートが異なるのでアセンブラソースの変更が必要な場合もある
 ソースはIFDEFが多く読みにくいため動かなかったらポートの設定が正しいか確認する
・基本的に変更すべきソースは bootconfig.inc のみ
・標準状態ではブートローダーはアドレスの一番後ろに配置されるがコンフィグレーションワードによる
 プロテクトは小さいアドレスの方が細かく設定できるPICが多いのでこれを利用したいときは
 bootconfig.inc の #define BOOTLOADER_ADDRESS 0 のコメントを外す
 この場合のアプリケーション開始アドレスは0x400、割込アドレスHIGHは0x408、割込アドレスLOWは0x418となる
 変更したいときは  bootconfig.inc を修正
 ブートローダーをアドレスの最初に配置する場合は以下の条件を満足する開発言語が必要
  -上記3つのアドレスを指定できる言語
  -ブートローダーのあるアドレスにアプリケーションファームウェアを配置しないように設定できる言語

================================================================================
 ブートローダーとアプリケーションファームウェアの起動
================================================================================
・アプリケーションファームウェアが起動されるかブートローダーが起動されるかの切り分け
  -アプリケーションファームウェアが書き込まれていない場合 ->無条件にブートローダーファームウェアが実行される
  -PICがリセットされた直後にRXピンが0Vであった 場合->ブートローダーファームウェアが実行される
  -PICがリセットされた直後にRXピンが0Vでなかった場合->アプリケーションファームウェアが実行される
・RXピンを0Vにするのはブートローダープログラム(Windows側プログラム)の役割であるが
 USBシリアル変換ICを使用する場合電源投入前にRXピンを予め0Vにすることが出来ない
 USBコネクターを差し込まないとCOMポートそのものが存在しないためブートローダープログラムからCOMポートをOPEN出来ないため操作もできない
 これには以下の方法で対応する
  A.RXピンにスイッチを付けハードウェア的に0Vにしてしまう
     スイッチを押しながら電源を入れるとブートローダーが起動される
  B.MCLRにリセットスイッチを付ける
     1.USBコネクターを差し込み電源を投入するとアプリケーションファームウェアが起動する
     2.ブートローダープログラムを起動してRXピンを0Vにする(水色のアイコンを押すとRXピンが0Vになる)
     3.リセットスイッチを押してPICをリセットするとブートローダーファームウェアが起動する
・変換ICのみUSBから電源供給それ以外は別電源という回路構成であれば上記の対応が必要なくなるが
 電源の入っていない変換ICの入力ピンに電圧がかからないように工夫が必要
 これにはUSBの電圧を監視すれば良い

================================================================================
 その他
================================================================================
・AN851は旧式
・PIC24用はAN1157(AN851のPIC24版)日本語アプリケーションノート有り
・PIC32用はAN1388 これはシリアル以外に、USB、Ethernet、SDカードに対応 日本語アプリケーションノート有り
・AN732はPIC16F87X用 骨董品 日本語アプリケーションノート有り


2016-04-07

アプリケーションノートのインストール。たぶんプログラムを解凍して配置しているだけ
USBブートローダーはこちらの記事を参照
ブートローダーを使用した回路の例(ネオン管時計)

instAN1310.png

動作確認用の回路図。点線内はアプリケーションファームウェアの動作確認用のハード。USBシリアル変換ICにCH340Gを使用しているがFT232でも動く。CH340GはAliexpressで購入できる。PICは内部発振機能を使っているのでOSC1,OSC2に水晶が繋がっていない。R5は不要

apptestmclr.png

MCLRピンをアプリケーションファームウェアで入力ピンとして使用している場合はこうする。SW3を押しながら電源を入れるとブートローダーファームウェアが起動。SW3を押さずに電源を入れればアプリケーションファームウェアが起動

apptestRX.png

ブートローダーファームウェアのconfigurationワードはアプリケーションファームウェアと同じにする

R0029116.jpg

ブートローダーファームウェアをMPLAB以外のソフトを使って書き込むときはEXPORTしないとconfigurationワードがHEXファイルに含まれないので注意

export.png

上の回路の実際。CH340Gは緑色の基板の裏側にある

R0029155.jpg

ブートローダープログラムの設定。ボーレートは大きいほど書き込みが速くなる。Application Baud Rate はアプリケーションファームウェアの書き込みには無関係。AN1310のサンプルアプリケーションファームウェアの動作確認のための物。自作したアプリケーションファームウェアなら無関無い

settings.png

ブートローダープログラムの画面
 赤■:ブートローダーファームウェアと通信を開始。ブートローダーファームウェアが起動している必要がある
 水色||:RXピンを0Vにする。上の回路図においてはブートローダープログラムによってCH340GのTXDピンが0Vになる
 赤色↓:アプリケーションファームウェアの書き込み
右上の水色の値はアプリケーションファームウェアが書き込まれていないときはFFFFになっていることもある。ここはブートローダーファームウェア先頭アドレスへのJUMP命令
豆知識)FFFFを命令として実行すると何もせずに次のアドレスの命令が実行される。全てのメモリーがFFFFで埋められていると何も起こらない

winapp1.png

水色部分がブートローダーファームウェア。どんなコードなのか確認したいときはMPLAB IDEでHEXファイルを[File]-[Import...]して[View]-[Program Memory]で表示すると逆アセンブルされる

winapp2.png
上の回路図用のアプリケーションファームウェアのサンプル mikrobasic
0001  '===============================================================================
0002 ' bootloader sample application program
0003 '===============================================================================
0004 program PIC18F14K22test
0005
0006 symbol LED1_TRIS = TRISC0_bit
0007 symbol LED1 = LATC0_bit
0008 symbol LED2_TRIS = TRISC1_bit
0009 symbol LED2 = LATC1_bit
0010
0011 symbol SW1_TRIS = TRISA0_bit
0012 symbol SW1_PORT = RA0_bit
0013 symbol SW2_TRIS = TRISA1_bit
0014 symbol SW2_PORT = RA1_bit
0015
0016
0017 '===============================================================================
0018 ' Interrupt
0019 '===============================================================================
0020 sub procedure interrupt ' high priority interrupts
0021 if INT0IF_bit = 1 then
0022 LED2 = 1 ' LED2 ON
0023 INT0IF_bit = 0
0024 end if
0025 end sub
0026
0027 sub procedure interrupt_low ' low priority interrupts
0028 if INT1IF_bit = 1 then
0029 LED2 = 0 ' LED2 OFF
0030 INT1IF_bit = 0
0031 end if
0032 end sub
0033
0034 '===============================================================================
0035 ' main
0036 '===============================================================================
0037 main:
0038 IRCF2_bit = 1 ' internal osc 16MHz
0039 IRCF1_bit = 1
0040 IRCF0_bit = 1
0041
0042 LED1_TRIS = 0 ' PORT OUTPUT
0043 LED2_TRIS = 0 ' PORT OUTPUT
0044 SW1_TRIS = 1 ' PORT INPUT
0045 SW2_TRIS = 1 ' PORT INPUT
0046 ANS0_bit = 0 ' SW1 digital input
0047 ANS1_bit = 0 ' SW2 digital input
0048
0049 INTEDG0_bit = 0 ' Interrupt on falling edge
0050 INTEDG1_bit = 0 ' Interrupt on falling edge
0051 INT1IP_bit = 0 ' INT1 Low priority interrupt
0052 INT0IE_bit = 1 ' Enable INT0 interrupt
0053 INT1IE_bit = 1 ' Enable INT1 interrupt
0054
0055 IPEN_bit = 1 ' Enable priority levels on interrupts
0056 GIEH_bit = 1 ' Enables all high priority interrupts
0057 GIEL_bit = 1 ' Enables all low priority interrupts
0058
0059 while true ' blink LED1
0060 LED1 = 1
0061 delay_ms(500)
0062 LED1 = 0
0063 delay_ms(500)
0064 wend
0065 end.
行番号
解説
20行目~
SW1を押すと高優先度INT0割込でLED2が点灯(INT0は高優先度割込しか出来ない)
27行目~
SW2を押すと低優先度INT1割込でLED2が消灯
59行目~
LED1は無限ループ内で点滅
12,14
この定義は不要。使われていない
プログラム現物
ファイル ファイルタイプ 添付ファイルの解説
PIC18F14K22testAPP.zip mikroBasic 上にソースが有る物の現物 mikrobasic
pic18f14k22bl.zip OTHER PIC18F14K22用に書き変えたブートローダーファームウェア。ソースなど一式
CH340eagle.zip EAGLE 上の回路図現物 EagleV4.15以上用