PIC開発に使うぞ ブートローダ
(PIC24FJ64GA002とPCをシリアル接続) 

 

2010.10版  

動機と目標

(1)400円程度で買えるPIC24FJ64GA002(マイクロチップ社製16ビットPIC)を有効に活用したい。
   思いついたのが、温室用の温湿度管理、程々のメモリ容量、豊富なI/Oピン、割り込み機能、タイマー
   機能が有ればそこそこのものなら作れそう。特にUART機能が使えば簡単な付加回路でホストと連携で
   きそうなのが気にいった。

(2)しかたなく家にはwindowsはあるが、この手の開発プラットフォームはLinuxに勝るものが
   無いと頑固に決めている。 しかし、このPIC用Cコンパイラがwindow版のMPLABしかなさ
   そうなのでLinuxで開発後、最終的にはwindowに移植し動かすことにした。

(3)元来けちなので高価な専用コンパイラ、PICライターなど無縁である。

(4)最初にPICライターの件を解決しなければなりませんでした。(チップを買ってきてもプログラムを
   書き込めねば何の意味もない) 探してきて結局は Linuxでの自作でした。
   PCのプリンタポートと自作ケーブルで接続し、若干の付加回路をつけるだけというイージーライターです。
   PIC18F用には broccoli18 というツールが公開されてますがこのPIC用は無いためマイクロチップ社
   データシートを参照しながら、完全に0から専用PICライターツールを自作しました。 これ以上の詳細は
   当ページの目的にはずれますので省略します。
   とりあえずこのツールで書き込みはできましたが、PICのデバック過程で何度もLinux〜windows間
   でHEXファイルを持って回って書き換える作業は負担が多く、非効率です。
   シリアルインタフェース機能を使いホストと連携できたらもっと現実的な解決方法があるはずです。

(5)次はPIC用コンパイラ、リンカです。
   結論は window版MPLAB(C30)評価版です。最適化が甘くコードが膨らむらしいが
   タダなので納得してありがたく使わしてもらう。 おなじみの printf() などを使うと事実相当なコード
   になりますが今時、面妖なPICネイティブアセンブラで開発する気はしませんのでこうしたハンデは大目に
   見ることにしました。

(6)だんだん深みに 次はPIC内でのAP自己書込(ブートローダ機能)です。 単純な仕掛けと思って
   いたら意外と奥が深く、フラッシュメモリのアロケーションと自己書込時の制約(消去はページ単位、書込
   はセクタ単位 1セクタ=128W 1ページ=8セクタ)に配慮する必要があります。 又APでの割込
   ベクターテーブルの書込が必要です。
   アロケーションの問題は、MPLABのリンクスクリプトをこの目的のために細工して解決しました。
   割り込みの問題は代替ベクタテーブルのみ更新し、AP起動時ベクタテーブル切替命令を実行します。
   以下にアロケーションの概念図を示します。

tux

(7)最後にwindowで動かす特殊なターミナルツールです。
   基本的には単純なダム端末ソフトですが、ブートローダ機能をホスト側で協調支援します。
   指定されたHEXファイルを解析し、セクタ単位にPIC側に送り、完了を待って繰り返す簡単なプロトコル
   を実装しています。  このプログラムはcygwinをインストールしてLinuxで開発したCソースを
   windowでコンパイル、実行させます。 コンパイル不要で実行だけの場合、添付の実行プログラムと2種
   のDLLファイルが有ればインストールする必要はない。

必要な追加ソフト

前記「動機と目標」で述べた種々のソフトウエアはグーグル等でキーワードを検索し、最新版を入手
してください。 解凍、インストール等は特に解説しません。 ノーマルなものばかりです。
試験に使用した私の Linux環境は Fedora-8 標準インストール です。window側はwindows-XP です。 
特殊なものは使っていないので他の版でも動作すると思いますが試験はしていません。 
PICハード面は、[PIC24FJ64GA002]というキーワードでNET検索してください。たくさん情報があります。
最終的にはマイクロチップ社のData Sheet(分厚いPDFファイル)が頼りになります。

ブートローダとして必要なハード

以下に今回自作したRS232変換ケーブルの回路図を示します。ケーブルとして独立して作っておくと便利です。

tux

以下に今回自作したPIC側の回路図を示します。 書込済みのモニタプログラムと密着するため回路図通り
作る必要があります。

tux

ソフトウエア構成

以下の3つの独立した要素から構成されます。

(1)PIC側BOOT−LORDERプログラム
   (1) 概要
    BOOT−LORDERの中核です。このプログラムを一度PICに焼き付けたら、以降アプリケーション
    がどのように変転してもずっと常駐し開発を支援し続ける中核です。 変更したアプリケーションはこの
    プログラムで再度自己消去、自己書込します。
   (2) 使用リソース
    メモリ的には前述のアロケーションMAP図を参照、 割り込みは未使用
    ハード的には内臓OSC(32MHZ)を使用、PIC側の回路図のi/oピンを使用
   (3) 機能
    ・PIC電源ON又はRESETにて起動され(26ピンがOPENが条件)、RS232のリンクをホスト側と確立する。
     ホスト側と非同期で送受信できる。
    ・ホスト側から送られてくるコマンドを受信・解析・実行する。
     コマンドによっては応答を編集し、ホスト側に返す。(送信する)
     定義済みのコマンドは以下の通り。 (但しユーザ作成APを起動すると使えませんので注意)
       writepic HEX_PATH      AP_PRG領域の書き込み max=26page 208sector
       run             PICアプリケーションの起動 goto 4000h
       readconfig          CONFIG情報の表示
       readpic start_adrs stop_adrs RRG領域のダンプ
       dpram start_adrs stop_adrs  RAM領域のダンプ
       port             port情報の表示
       echo xxxxxxxx        xxxxxx をエコーする
       help             HELP

(2)ホスト側のターミナルプログラム
   (1) 概要
    ブートローダ支援機能及びダム端末としての機能は実装していますので、そのままお使い下さい。
    PIC側サンプルAPを起動すると、PIC側から送られてくる垂れ流し測定データを単に標準出力
    (コンソール画面)に表示しているだけです。
    このソース(consol.c)も同梱していますからニーズにあったように自由に改造して下さい。
    編集してファイルに書き込んだり、別ウインドウでグラフ表示にしたりも可能でしょう。
    ただしこの場合cygwinをインストールする必要があります。
   (2) 使用リソース
    PIC側と異なって、特記する点はありません。 通常のAPです。
   (3) 機能
   ・ダム端末機能
    PICと非同期で任意textを送受信できます。
   ・ブートローダとしての機能
    指定されたHEXファイルを解析し、セクタ単位にPIC側に送り、完了を待って繰り返す簡単な
    プロトコルを実装しています。

(3)PIC側アプリケーション
   (1) 概要
    通常はホストからrunコマンドで起動しますが、26ピンをGNDに接続することによりRESET直後、
    ダイレクトにAPを起動できます。(goto 4000)
    一度このAPが起動すると、常駐するBOOT−LORDERプログラムは切り離され一切使用
    できません。 再起動はハード的なRESETーSW又は電源OFF/ONだけです。
    アプリケーションですからニーズにあった自由な記述が本来許されますが、リソース上若干制約が
    発生します。
   (2) 使用リソース
    BOOT−LORDERプログラムが使用していない残りのリソースとなります。
    Config1、Config2 は変更出来ないので注意(ソースに書いても書込まない。)
    メモリ的には前述のアロケーションMAP図を参照 (max 0x4000-0xA800)
    割り込み処理の記述は自由です。
    PIC側の回路図のi/oピン以外は自由に記述可
     (確認用LEDが必要ない場合このピンも使用できます。)
   (3) 機能
    ユーザ定義のアプリケーションです。 サンプル例として "sht71.c" を同梱します。
   (4) 特別な注意
    ソース改造にあたっては、BOOT−LORDERプログラムとリソースが競合してないか確認して
    ください。 MPLABのリンクスクリプトにはこの目的のために細工したものを指定下さい。

ダウンロードと評価手順

(1) PIC側BOOT−LORDERプログラム
   boot.zip
     解凍するとインテルHEX形式のHEXファイル(boot.hex)です。
     何らかのPICライターで焼いて下さい。
     できたPICをあらかじめ回路図通り製作した基板に載せホスト側のCOM1ポートと
     あらかじめ回路図通り作成したRS232変換ケーブルで接続します。

(2) ホスト側ターミナルプログラム
   consol.zip
    (1) CygWin をインストールしている場合
      CygWin ホームディレクトリ配下の適宜な場所で解凍します。
      中身はCソースとmake関連ファイル群です。
      CygWinを起動し、そのコンソールから先のディレクトリ配下へ "cd xxxxx"
      必要ならソース改造し後は単に"make" のみで"consol.exe" が出来る。
      実行は まず "./mode.sh" で通信速度等をPIC側と一致させます。(一度だけ)
      次に "./consol" で行います。 全てが正常ならば最初のMSG表示後 "help" とKBから入力
      するとPICからHELPの応答が帰ってくるはずです。
    (2) CygWin をインストールしていない場合
      適宜なディレクトリ配下で解凍します。
      中身は(1)と同じCソースとmake関連ファイル群です。
      まず同梱の2種類のDLLファイルを "C:\WINDOWS\" 配下に単純COPYして下さい。
      ソース修正してもコンパイルがありませんので同梱の "consol.exe" を実行するだけです。
      同梱の "term.bat" をダブルクリックしてCMD画面を表示させます。以下はその画面から入力する。
      実行は まず "mode.bat" で通信速度等をPIC側と一致させます。(一度だけ)
      次に "consol" で実行します。 全てが正常ならば最初のMSG表示後 "help" とKBから入力すると
      PICからHELPの応答が帰ってくるはずです。

(3) PIC側アプリケーションサンプル例
   loader_AP.zip
    適宜なディレクトリ配下で解凍するMPLABプロジェクトファイル群です。
    APサンプル例として "sht71.c" を同梱しています。 自由に改造下さい。
    プロジェクトファイルを起動、ビルドしてインテルHEX形式のHEXファイル(sht71.hex)を得ます。
      この際リンクスクリプトは必ず同梱の "boot_P24FJ64GA002.gld" をお使い下さい。
       (0x4000以下にアロケションするためです。) 他は参照用です。
      又 BuildOption MPLAB Link30 の HeapSize を =64 にして下さい。 printf()等が利用できます。
    次にPIC側、ホスト側を立ち上げ "writepic sht71.hex" コマンドで自己書き込みします。
    このAPを実行するには "run" コマンドです。 測定データが垂れ流しで周期的に表示されるはずです。
    但し温湿度センサーが回路上ありませんので表示データは変な値です。
    BOOT−LORDERプログラムと同様なデバッグ支援のコマンドに反応します。
       readconfig          CONFIG情報の表示
       readpic start_adrs stop_adrs RRG領域のダンプ
       dpram start_adrs stop_adrs  RAM領域のダンプ
       port             port情報の表示
       reset            RESET  (goto 0x0000)
       echo xxxxxxxx        xxxxxx をエコーする
       help             HELP

2010.12 追記 自作USB−シリアル変換ケーブル

ノートPCを使う時、機種によりRS232ポートが無い場合があります。かわりにUSB−シリアル変換ケーブルを
1本作っておくと便利です。
私は秋月電子の通販でこのチップモジュール(FT232RL USBシリアル変換モジュール ¥950)を入手し
ケーブル化し実験しました。うまくいきます。このモジュールはシリアルインタフェースがcmosレベルなのでPIC
に直接接続でき、USBからの+5V又は3.3Vの小容量の電源としても利用できます。 私はPICを電池3Vで
で動かしていましたので、3.3V出力を利用して電池を撤去したらすっきりしました。ただUSBコネクタがマイクロ
USBなので電気屋さんから、この専用usbケーブル(¥600程度)を買ってきました。
PCのUSB側はwindowsの場合は、FTDI社から専用ドライバを無償ダウンロードできます。デバイスマネージャからCOMポート
を探すとFTDI VCOM Port がCOM11あたりにアサインされていますので、 ホスト側ターミナルプログラムで説明したmode.sh
又はmode.batの RS232 Port COM1 -> COM11 に変更するだけであとは無変更で代替できます。
Linuxの場合は、 Fedora-8 標準インストール でUSB認識できますので、OPEN対象を /dev/ttyS0 -> /dev/USB0 に変更する
だけです。  秋葉原のジャンク屋を探すとある種の携帯電話用のUSB−シリアル変換ケーブルがあり携帯電話側のケーブル
を切断し芯線を適当に接続するだけでつながるものがあるらしいですが、トライしていません。