/ クレア工房 / 電子工作 / PIC32 / PIC32の書き込み

PIC32の書き込み

MIPS 向けファームウェアのコンパイルについては mips-elf-gcc を使えばよく、 POSIX 系環境に対する mips-elf-gcc のインストール それ自体は難しくありません。 メンドクサイと言えばインストール作業後にリンカスクリプトを 書かねばならないぐらいです。 ライブラリが必要とは言われますが、 レジスタを叩くことがメインになる 組み込み系開発においては libc の関数を使うことはほとんどないので、 ライブラリと言ってもレジスタ定義を並べたものが主体になります。 ライブラリ自体は割とどうでもいい話です。

本稿では、 MIPS 向けファームウェアをコンパイルした後の、 PIC32 に対する書き込み手段の構築を扱います。

概要

秋月で扱いのある PIC32MX1xx, PIC32MX2xx シリーズですが、 従来書き込みには Windows 環境で MPLAB を使う必要がありました。 個人的には NetBSD で作業したかったので、 NetBSD 用に ICSP アダプタとホスト用プログラムを作成しました。 これにより AVR マイコンを踏み台にすれば良くなり、 いささか高価な純正ツール pickit の調達が不要になりました。

Windows や Linux を前提にして pickit を活用したいとお考えの方面におかれましては、 拙作ではなく sergev 氏のプロジェクト (https://github.com/sergev/pic32prog) をご検討ください。

前述のように、 マイコンを書き込むための踏み台マイコンとしては AVR を採用しました。 USB シリアルモジュールでビットバングしても良いのかも知れませんが、 NetBSD にはうまく適合しないだけでなくソフトウェアの準備も面倒です。 AVR マイコンは USB シリアルアダプタのみを使って書き込むことができます。 AVR であればコンパイラもライブラリもすべてフリーで揃い、 書き込みには USB UART モジュールがあればよく、 特殊なハードウェアは要りません。

過去に書き込みに使うマイコンとしてR8Cはどうか、 という提案を頂戴したことがあります。 残念ながら入手性と廉価さで著名なDIP品の R8C/M12Aは2017年現在製造終了となっており、 流通在庫を残すのみとなっています。 SMD品であればまだ入手の前途はありますが、 工作の簡便さを考えるとDIP品の採用は譲れないところです。 当面はAVRでご勘弁を。

PIC32 に対する書き込みプロトコルには 2-wire ICSP を使用します。 ICSP プロトコルは JTAG 信号を 2-wire に時分割多重したものです。 2-wire ICSP プロトコルは汎用ピンをオーバーライドして使うため、 起動シーケンスもちょっと特殊です。 時間制約のかかる部分はマイコンのファームウェアに閉じ込めています。 4-wire JTAG プロトコルでもよかったのですが、 試作過程の都合でこうなりました。 JTAG プロトコルの場合は書き込み条件 (書き込まれるマイコンの config) に制約が付くようですので、 結果としてはこれでよかったようです。

部品

回路

ATtiny2313を次のように配線します。

Vcc(20)
3.3Vの電源に配線します (PIC32MXは3.3Vで動作します)
GND(10)
グラウンドに配線します
RxD(2), TxD(3)
それぞれUSBシリアルモジュールのTxD, RxDにクロス配線します。 通信速度は38400bpsです。
RESET#(1), PB7/SCK(19), PB6/MISO(18), PB5/MOSI(17)
ISP用に開放しています。 ファームウェアでは触っていません。
PB2(14)
PIC32のMCLR#に直接配線します。 ICSP モジュールと通信するときだけ出力になり、必要がない限りHi-Zを保ちます。
PB1(13)
PIC32のPGECに直接配線します。 ICSP モジュールと通信するときだけ出力になり、必要がない限りHi-Zを保ちます。
PB0(12)
PIC32のPGEDに直接配線します。 ICSP モジュールと通信するときだけ出力になり、必要がない限りHi-Zを保ちます。

その他のAVR側のピンは未使用 (Hi-Z) です。 手元の環境ではたまたま内蔵RC発振で正常動作に至りましたので、 ATtiny2313のヒューズビットは工場出荷時のまま触っていません。 もし安定性の問題から水晶振動子もしくはセラミック振動子を使う場合は、 8MHzのものを使用してください。

ICSPアダプタのファームウェアを修正する場合は AVR-GCC, avrdude の一揃いが必要です。 avrdudeはWindows環境を必要としませんので、 本機の製作にあたりWindows環境は使用していません。

PIC32MXマイコン(応用回路)側のPGECx, PGEDxピンペアはどれを使ってもかまいません。 応用回路で空けやすいピンを空けてください。 個人的にはUSBポートピンを好んで使っています。

配布ファイル

マイコンのファームウェアをコンパイルするのは環境構築が少し大袈裟になりますので、 ファームウェアに関してはコンパイル済みバイナリを同梱しています。 ドライバソフト側はソースのみですのでコンパイルしてください。

HTTP でダウンロードして解凍できない場合は、 HTTPS でダウンロードしてみてください。

ソースコード

ファームウェアのコンパイルには avr-gcc と avr-libc が必要です。 ソースコードを眺めればわかりますが、 レジスタを直に叩く方針でコーディングしているため avr-libc のコードはほとんどリンクしていません。

ビルドは単に make するだけで良いはずです。 概ねPOSIXの範囲で記述しており、複雑なことはしていません。 プラットフォームの make がイケていない場合は GNU make を使ってください。

ソフトウェアの入力に与えるROMイメージファイルはIntel HEX形式でなければなりません。 アドレス空間の取り扱いは、 ROMイメージを読み込む際に物理アドレスになるようアドレスをマスクしており、 仮想アドレス・物理アドレスの双方に対応しています。 mips-elf-gcc の出力であれば大抵は仮想アドレスになると考えています。

ドライバソフトウェアはフラッシュメモリのロウ単位でデータを書き込みます。 ダブルワード単位での書き込みはサポートしません。 HEXファイル内のデータに端数が出た場合はロウ単位になるようサイズが切り上げられます。 このため、書き込んだアドレス空間ではECCの恩恵にあずかることができると考えます。

書き込み前にチップイレーズを実行しますので、 フラッシュメモリの内容はブートエリアも含めすべて消去されます。 書き込みたいアプリケーションとは別にブートローダを含む場合は 毎回ブートローダのHEXファイルを指定する必要があります。 HEXファイルを複数指定した場合はマージしてからまとめて書き込みます。

プロトコル

version 0.1~0.3 では疑似的な RPC として実装されています。 1バイトの命令に対して可変長のパラメタが続き、送信し終わった段階で実行します。 実行が終わると何らかの返却値を戻します。 値が返却されたことをもってホストはコマンドの実行終了を知ります。 処理中のコマンド送信には対応しません。 ごくごく単純なものですので、何をしているかはソースをご参照ください。

コマンド体系は内部的かつ独自のものなので何かと互換があったりするわけではありません。 固定化するには知見を溜める必要があるため、今のところ固定化の予定はありません。

ライセンス

PCにインストールするドライバソフトウェアは2条項BSDライセンスです。 商用にする場合も含め、明示的であるか暗黙的であるかを問わず、 動作に関する保証は致しません。


Copyright © 2016, 2017 clare. All rights reserved.