2020年6月16日火曜日

USB入りのPICにブートローダを仕込む実験の備忘録

マイクロコントローラ(マイコン)にファームウエアなど実行ファイルをプログラムするのには、たいていはそれ専用のプログラマ(PICではPickitシリーズ、AVRではAVRISP、STMではST-Linkなど)が必要になります。

しかしデバイス自身にプログラムが可能なマイコンであれば、ブートローダという書き込み専用プログラムをデバイスに組み込むことで、外から転送された実行ファイルを自身のフラッシュメモリに書き込む事が出来るので、いちいち専用のプログラマを取り出して書き込みしなくても済みます。

転送方法はUARTとUSBが主のようで、PC側では転送用のソフトウエアを用意することにより基本的にPCさえあればいくらでもファームウエアの書き換えが可能になります。

Arduinoはブートローダがすでにマイコンに組み込まれた状態で販売されています。ユーザーはArduino IDEさえPCにインストールすれば、このソフトウエアだけでコードを書いて、コンパイル、そしてUSBなどを経由して簡単にプログラミングが出来てしまうという手軽さからいろんな電子工作界隈で普及しています。(もう少し高度なMbedもそうですね。Raspberry Piもありますが、近年ほとんどPC化しているのでもう別物です(笑))

もちろん無線電子工作のAKCのメンバーも自作機器の制御に好んでArduinoを使っておられます。

Arduinoが好きじゃないわけではありませんが、同じことしても面白くないしPICでも簡単にできないだろうかと思っていました。もともとUSB内蔵のPICでPIC18F14K50は以前から秋月で扱っておりマイコンボードも購入していましたが、USB対応には外付けXTAL発振が必要で2ポート取られるためいまいち乗り気にならずそのまま放置状態でした。しかしつい最近(1年ほど前から扱っているようですが)PIC16F1459というUSB対応のモデルを見つけました。EEPROMは内蔵していませんが、外付けXTALを必要とせず内部発振でUSB対応可能な点に惹かれ、早速秋月から取り寄せてブートローダ組み込みとプログラミング実験を行いました。

1.ブートローダ組み込みで必要なモノ
・USB内蔵PIC
これがないと始まりません(笑)今回はPIC16F1459を取り寄せました。DIPタイプは秋月で1個190円とPIC18F14K50より安価でピンコンパチです。

・周辺部品
実験用なのでブレッドボードで組みますが、0.1μFのパスコンと3.3Vレギュレータ用の0.33μF程度のパスコン、ブートローダ起動選択用のボタンとポート用プルアップ抵抗10kΩ、ステータス表示用のLEDと電流制限抵抗1kΩ、microUSBコネクタDIP変換ボード、配線ワイヤ、USBコード(microUSB-USBtypeA)くらいでしょうか。

・PC
言わずもがなですが、私はWindows10の自作PCを使っています。

2.ブートローダイメージファイルの準備
ブートローダのhexファイルはmicrochipでは公開されていません。MLAといういろいろなサンプルコード集の中からブートローダ用サンプルプロジェクトをMPLAB X IDEに取り込んでXC8pro版でコンパイルし、PICにプログラムしなくてはなりません。
ネット検索で内蔵発振に対応したブートローダのhexファイルを見つけることができるかもしれません。見つけたらダウンロードし実験用として利用するのも手です。
一方自前でファイルを生成する場合ですが、XC8のpro版を個人で所有するケースは稀です。Free版の場合でも少々コードを変更するとコンパイル通りますが、ファイルサイズは大きくなります。手順は検索するといくつか出てきますので参考にする事が出来ます。
それとはまた別にファイルサイズが極めて小さくなるブートローダもGitHubで公開されています。

3.PICへのブートローダのプログラミング
ブートローダの組み込みにはPickit3などのプログラマはやはり必要です。MPLAB X IDEでブートローダをコンパイルして直接プログラムするか、hexファイルをMPLAB X IPEで取り込み通常通りにPICにプログラムします。

 4.ブートローダの起動とユーザ作成ファイルのプログラム
あらかじめHIDBootloaderWindowsというソフトをダウンロードし起動させ、ブートローダ起動選択ボタンを押しながらPIC側からPCのUSBコネクタに接続するとPCがPICを認識します。HIDBootloaderWindowsで接続が確認されたら、ユーザ作成のファイルを選択してプログラムボタンを押すとPICに書き込まれます。リセットボタンを押すとユーザ作成のソフトが起動します。

5.ユーザプログラムをビルドする上での注意点
PICに組み込んだブートローダが格納されているメモリ領域を避ける設定を加えます。詳細はネット上に解説がいくつかあるので検索してください。

6. ブートローダのデメリットについて
・フラッシュメモリの消費
ブートローダはPICのフラッシュメモリに格納されているので、その分ユーザアプリケーションで使える容量が減ります。PIC16F1459の場合約3分の1が消費されます。XC8Free版で生成された場合それ以上にフラッシュメモリ領域が占有されてしまいます。
・venderID, productIDについて
個人的な実験や使用についてはあまり問題はないのですが、小ロット頒布を含めて商用利用する場合は少なくともUSB-IFへの申請が必要になりますとくにMLAを利用する場合microchip社との契約も必要になるかもしれません。かかる費用もそれなりに高く個人での利用はかなり難しいです。(ただしある一定数の範囲内のものについては、サブライセンスにするなどメーカーによっては敷居が低い場合もあるようです。)

ともあれ取り寄せたPIC16F1459にブートローダを組み込み、テスト用プログラムを書いてビルドしたファイルをPickit3なしでプログラムして動作させる事が出来ました。


Arduino IDEとまではいきませんが、専用プログラマーなしでプログラムできるのは快適ですね。

2 件のコメント:

  1. ブートローダー、良いですね。手軽に何回でも書き換えることができると、デバッグもはかどりますね。PC側のUSBドライバーはどのようなものが必要でしょうか。
    だいぶ以前にmikroCのライブラリーを使って、USBを動かしてみたのですが、専用のドライバーが必要で使いづらかったです。この辺りは仕方がないですかね。
    http://honda.way-nifty.com/pocky/2013/09/post-5729.html

    返信削除
    返信
    1. コメントありがとうございます。
      PC側のドライバは特に用意しなくてもHID USB Botloaderという名前で自動的に登録されていました。
      ブートローダでなく通常のUSBアプリケーションでもWindowsで用意されたドライバが使えるのではないかと思います。ただ今回使用したPICは小規模なのでブートローダとの共存は難しいかもしれません。

      削除