ライン

PIC32MX370F用SDカードブートローダの製作

ライン

2015年5月24日

Rev.2公開 2018年6月12日

 PIC32MX370F512Hは512Kバイトのフラッシュと128KバイトのRAMを搭載し、最高100MHzで動作可能なとても素晴らしいマイコンです。最近私もこのマイコンを使ってテレビ画面に出力するシステムをいくつか作りました。ただ、チップの入手性があまりよくないのと、パッケージがQFPで工作が面倒ということで、プログラムの数だけハードを作るのというのはあまり現実的ではありません。そこで、以前DIP版のPIC32MXで作ったのと同じように、このマイコン用にもSDカードにHEXファイルを入れておき、テレビ画面で選択して実行するブートローダを作成しました。
(2018.6.12)SDカード周辺の回路修正しブートローダプログラムをRev.2に変更しました。また、アプリケーションのハイスコア記録形式を変更しました。旧バージョンはこちらになります。

トップ画像


回路

 これまでにPIC32MX370F512Hで行ってきた実験やゲームで使った映像、音声、マイクロSDカード、入力ボタンの回路を組み合わせた形になります。また、いちいち電源を入れなおさなくてもよいように、リセットボタンを追加しました。
 この回路図上はマイクロSDを使用していますが、SDカードにする場合少しピン配置が異なりますのでご注意ください。
 電源は3.3Vの安定したものが必要です。マイコンだけであれば乾電池2本でも動作しますが、SDカードへのアクセスは乾電池2本では不安があります。
 写真は、QFP64ピンをDIP化するためのプリント基板を製作して、ブレッドボード上で配置したものです。マイクロSDやビデオ端子などは市販の変換基板を用いました。電源はマイクロUSBのBタイプから変換基板でブレッドボードに挿し、レギュレータで3.3Vを作っています。
 ボタン類は操作しやすいよう、別のユニバーサル基板上に作りました。
(2018.6.12)今後のシステム拡張のため、RF0、RF1を解放にしました。そのため、Card Detect機能はなくしました。新回路に対応するため、従来のブートローダプログラムやSDカード関連プログラムは更新が必要です。

回路図

製作写真

メモリーマップ

 ブートローダプログラム自体は、以前作成したDIPタイプのPIC32MX150F128B用をほぼそのまま使っています。マイクロチップのアプリケーションノートAN1388を元にして作りました。
 システムがリセットされると最初にボタンを読み込み、いずれかが押されているとブートローダを起動します。リセット時にボタンが押されていなければ、前回ロードしたプログラムを起動します。ユーザアプリが何もロードされていない場合もブートローダを起動します。
 今回のシステムのメモリーマップは右図のようになります。上位アドレスにある12Kバイトのブート領域以外に、通常のプログラム用フラッシュから24Kバイトがブートローダ本体に占有されます。また、後述のハイスコア記録領域などで約4Kバイト使用します。それでもユーザアプリケーション用の空き領域が約480Kバイトもあるので、あまり困ることはないと思います。

メモリーマップ

ユーザプログラムの作成方法

 ブートローダ対応のプログラムを作成する場合、通常とは異なる点がいくつかありますので、以下にご注意ください。

1.メモリ配置の設定

 何も指定せずにPIC32MX370F512H用のプログラムをMPLAB Xでビルドすると、ブート領域に初期化コードと割り込みベクタ、プログラム領域のトップにプログラム本体が配置されます。これではブートローダと重なってしまい正常にロードできません。そのため、全て上述のユーザアプリケーション領域に配置されるように指定する必要があります。指定にはリンカスクリプトを使用します。専用のリンカスクリプト用意しましたので、単純にプロジェクトに追加してビルドすればブートローダ対応となります。(ファイル名app_p32MX370F512H.ld)

2.コンフィグレーション設定について

 ブートローダを使用する場合、デバイスのコンフィグレーションはブートローダ側で設定されているため、ユーザプログラムではコンフィグレーションを記述する必要がありません。記述されていても無視されます。
 ブートローダプログラムのシステムクロックは、14.31818MHzを3分周したあとPLLで20倍(約95MHz)で動作しています。これまでに私が作ったPIC32MX370F512H用プログラムは全てこの周波数で動作させていますが、どうしても変更したい場合は、アプリケーションプログラム内で動的に変更する必要があります。

3.ハイスコアの記録

(2018.6.12)形式を変更しました。
 PIC32シリーズには8ビットPICのようなEEPROMがないため、電源を切っても残したいゲームのハイスコアなどは、プログラムフラッシュ領域の最後のほうに書き込みを行っています。ブートローダで複数のゲームを切り替えて使う場合、他のゲームを実行してもハイスコアが消去されないようにする必要があります。そこで、ブートローダ対応アプリケーション用に、ハイスコア等のデータを保存する共通の仕組みを提供しました。
 1つのアプリケーションに16バイトのレコードが割り当てられ、HEXファイルのファイル名(8文字分)で管理を行います。利用可能なレコード数は64個となります。
 プロジェクトにrecscore.cとrecscore.hを追加しておくと、以下の関数が使用できるようになります。

ハイスコアテーブル

 void init_recscore(void)
  アプリケーションの最初に利用のための初期化を行います。この関数を呼び出すと、テーブル内のレコードを検索し、ロードしたHEXファイル名のレコードが存在しない場合は新規でレコードを作成します。

 void write_recscore(unsigned int s1,unsigned int s2)
  初期化で設定されたレコードに2つの32ビットデータを書き込みます。フラッシュの書き込み中は割り込みが禁止されるため、映像出力中の場合呼び出す前にstop_composite()関数で映像出力を停止する必要があります。また、書き込み終了後は、start_composite()で映像出力を再開します。

 unsigned int read_recscore(int n)
  レコードに書き込まれたn番目の32ビットデータを読み出します。nは0〜1で指定します。

 PIC32MX3xx以上では、フラッシュメモリは4Kバイトのページ単位で消去を行ってから書き込む必要があります(ちなみにPIC32MX1xx/2xxシリーズでは1Kバイト単位)。そのため実際に使用するのは1Kバイトですが、プログラムフラッシュの最後の4Kバイトを割り当てました。またワーク領域として、RAMを1Kバイトを確保しています。


ブートローダの使い方

 最初にブートローダプログラムをPICに書き込みます。この時はPICkit3などの書き込み器が必要です。次にSDカードに上述の方法で作成したアプリケーションのHEXファイルをコピーします。HEXファイルのファイル名は、半角8文字以内+「.hex」です。ロングファイル名や日本語文字は使用できません。また大文字小文字の区別はありません。SDカードはFATまたはFAT32フォーマットのものが使用できます。
 ルートディレクトリにHEXファイルを保存したSDカードを、SDカードスロットに挿入してボードの電源を入れると、ファイル選択画面が表示されます。もし、既に何らかのアプリケーションがロードされていれば、無条件にそのアプリケーションを実行します。他のアプリケーションをロードしたい場合は、ボード上のどれかのボタンを押しながら、電源オンまたはリセットを行うことで、ファイル選択画面が表示されます。
 ファイル選択画面では、上下左右ボタンでファイルを選び、FIREボタンを押すと選択されたファイルをフラッシュに書き込んだ後、実行します。書き込み中は割り込み禁止のため、画面表示を停止します。そのため一瞬真っ黒になりますが、数秒で完了し、ユーザプログラムが始まります。
 なお画面表示の関係上、利用できるHEXファイルの最大数は75個となります。

選択画面


ダウンロード

 下記リンクから関連ファイル一式をダウンロードしてください。HEXファイルとソースファイルのフォルダに分けて展開されます。HEXファイルのフォルダはさらにブートーローダ本体とアプリケーションで分けられています。ソースファイルのフォルダには各種ソースファイルが入っていますので、興味がある方はご覧ください。

関連ファイル一式のダウンロード

(2020.3.30)CONFIGビット修正(更新は不要です)

 アプリケーションとしては、以下のものが収録されています。パックマン、テトリス、箱入り娘パズル、ブロック崩しは、以前PIC32MX150F128B等で動作させるために作成したものを、こちらのテキスト&グラフィック画面重ね合わせビデオ出力システムを使って移植したものです。画面のサイズが異なるものを単純に移植したため、画面中央より左寄りに表示されてしまいますが、あまり気にしないでください。

HEXファイル名アプリ名
TETRI370テトリス
PAC370パックマン(グラフィック版)
BREAK370ブロック崩し
HAKOI370箱入り娘パズル
VELUDDAVELUDDA(ベルーダ)
DISPGIFGIF画像表示

テトリス1

テトリス2

パックマン1

パックマン2

ブロック崩し

箱入り娘

VELUDDA1

VELUDDA2

GIF画像表示


最後に

 以前作成したPIC32MX150F128B、PIC32MX250F128Bで使用するブートローダと内容的にはほとんど同じなので、それほど開発には苦労せず完成しました。PIC32MX370F512Hで汎用的に使えるテキストとグラフィック画面ビデオ出力とSDカードのライブラリと合わせて使えば、簡単に様々なアプリケーションが開発できますので、チャレンジしてみてください。
 何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。

Copyright (C) KenKen All Rights Reserved.