7. USBホストプログラムの作成(その1) とりあえず Harmony でプロジェクトを作る

USBホストプログラムを作成するには、まずは Harmony で生成されたプロジェクトの中でどんな関数が使えるのかを知らないと話になりません。
とりあえず、help_harmony.pdf の 4012ページ、5016ページ辺りから勉強中・・・・

えー、時間が掛かりそうなので(^^;)、とりあえず Harmony でプロジェクトを作り、CPUが動くかどうかだけ確認してみることにしました。

まず、プロジェクトファイルを入れるディレクトリ(ここでは PIC_hmny_USB_LED)を作ります。
ディレクトリを作成したら、MPLAB X を起動します。
もし別のプロジェクトが自動で開いていたら、左側ツリーのプロジェクト名を選択した上で、
メニューから [File] -> [Close All Projects] を実行して、全てのプロジェクトを閉じておきます。

プロジェクトの新規作成アイコンをクリックし、プロジェクトのタイプとして MPLAB Harmony Project を選択します。



(1)Harmony をインストールしたディレクトリを指定
(2)先にプロジェクト用に作成したディレクトリを指定
(3)プロジェクト名を入力
(4)CPUの型番を指定(手持ちのボードに載っているCPU型番を確認のこと)

設定したらFinishボタンを押します。




プロジェクトの Config を設定していない最初は、画面中央に自動的に Config 画面が開きます。



ツリー構造表示の[+]マークをクリックして詳細を開いていきます。
まず、[Clock]関連の設定をします。
この項目は、クロック構成のブロック図を見ながら設定するために、[Execute]というボタンを押します。



するとブロック図[MPLAB Harmony Clock Configration]のウィンドウが開きます。

(1)基板上の発振回路の周波数(POSC)を設定します。PIC32 USB Starter Kit III では8MHz。
(2)表示されたブロック図の右下、FNOSC の入力を[PRIPLL]に設定します。
(3)すると[Auto-Calculate]ボタンが有効になるので、これを押します。



希望するCPUコアの動作周波数を指定します。通常は80MHz。 (温度制限で、100MHzも可能?)
設定したら[Apply]を押す。



CPUコア(SYSCLK)周波数が80MHzに、USB用クロックが48MHzに設定されていることを確認します。
更に右下、FPBDIV=PBDIV=DIV_1 を設定し、周辺クロック(PBCLK)もCPUと同じ80MHzにします。



[MPLAB Harmony Clock Configration]のウィンドウを閉じ、再び Config 画面にもどります。

以下、追加設定です。 ※2015.02.01 現在、まだ検討中

 ・DMA を有効。(現時点では、あくまで予定)
 ・FileSyatem を有効。(FAT File Syatem を有効)
 ・Interrupts - Use Interrupts System Service を有効。
 ・USB Library を有効。
 ・Select Host or Device Stack は [USB Host] を選択。



さらに追加設定です。 ※2015.02.01 現在、まだ検討中

・BSP Configrarion を有効にし、PIC32MX USB Starter Kit 3 を設定。
プログラム本体の機能とは直接は関係ありませんが、これを有効にすると、指定した開発キットの回路に合わせたLEDとスイッチを制御する 関数が組み込まれます。
ここでは、動作テストでLEDを点灯させたいので、有効にしておきます。(後述)

・DEVCFG2, DEVCFG1, DEVCFG02 を図のように設定。
クロック関連は、先の[Clock Configration]で自動設定さているはずです。
その他は、[Watchdog Timer]をOFF、[JTAG]をOFF、[ICE]は ICS_PGx2 を指定、などの設定をします。
[Background Debugger Enable]は、デバッグ/トレース機能を使うときはONにします。(今回はOFF)



設定が終わったら、まず設定値を保存するために[Configuration*]を押し、さらに[save]ボタンを押します。ファイル名は、デフォルトでOKです。
後日、設定を修正したい場合は、このファイルを読み込んでから修正作業をすることになります。
※通常は無いと思いますが、もし一つのプロジェクトで異なるconfig設定を使い分けたい場合は、必要に応じてファイル名をつけてください。



画面上の [Generate]ボタンを押して保存ウィンドウを表示、[Overwrite]をONにして[Generate]を押します。

ちなみに、[Overwrite]をOFFにして[Generate]を押すと、ソースファイルに変更がある部分が表示されます。
この場合は、表示された変更内容を確認して「右矢印」マークや「×」マークを押していき、 最後に右上の「保存アイコン」を押せば変更がファイルに適用でされます。
手間が掛かるので、筆者は[Overwrite]をONにしています。
ソースファイルの変更内容が気になる方は、OFFにして確認すると良いかもしれません。

これで、設定に応じたソースファイル、ヘッダーファイルが自動で生成されます。



生成されたプロジェクトのツリー構造をみると、やたら複雑そうなファイル構成になっています。
慣れれば意味がわかってきますので、しばらくは中身を眺めてみてください。




このままでは何もしないプログラムですので(中身はあるはずですが、出力結果が何も無いので動いているかどうかわからない)、 LEDを点灯させる記述を追加して動作確認をしてみます。

まず、修正を加えるソースリストについてですが、main.c はいじりません。
Harmony で生成したプロジェクトでは、main.c は Harmony 関連ルーチン(USBやファイルシステムなど)の処理と アプリ(ユーザーアプリ)を無限ループで実行するよう、既に記述されています。
ユーザーは、基本的に main.c ではなく app.c を修正して自前の機能を追加していくことになります。

app.c を修正するため、ツリー表示の app.c をダブルクリックします。
エディタが起動してファイルの中身が開きます。
ここでは図のように2カ所、

・ユーザーアプリ初期化関数 APP_Initialize が実行されたら、LED−1を点灯する。
・ユーザーアプリタスク関数 APP_Tasks が実行されるたびに、LED−2を点滅(トグル点灯)する。

というプログラムを追加します。
いきなりLEDを点灯する関数を追記するだけなので簡単です。ポートの初期設定プログラムは不要です。
先の Configration 設定で BSP を指定したことで、LED用ポートの初期設定プログラムは、自動で初期化ルーチンに組み込まれています。
このように、Harmony でプロジェクトを作ると、Configration で設定したモジュールは、ほとんど自動で初期設定ルーチンを生成してくれます。

なお、従来型のプログラム( Harmony を使わないプログラム)とは異なり、LEDを点灯させる関数が変わっていることに注意。
( 従来の plib.h を使う場合とは異なる)
また、LED点灯関数の本体は、bsp_sys_intc.c に記述されているので参考まで。




プログラムを修正したらセーブ。 次に書き込み機の設定をします。

PIC32 USB Starter Kit III をPCと接続し、左上のメニュー「File」->「Project Properties」を実行します。
( 先に Starter Kit を接続しておかないと、認識してくれません)
図のように、接続ツールに [PKOB] を指定し、[Apply] -> [OK] を押す。



(1)コンパイルを実行します。(ワーニングが出ますがとりあえず気にしない。(^^;)
(2)書き込みボタンを押し、しばし待ちます。



書き込み/実行に成功すると、赤色LEDが点灯、黄色いLEDが高速点滅します。(目視ではわかりませんが)



黄色LEDの駆動波形をオシロで観測すれば、ユーザーアプリ APP_Tasks 関数の実行タイミングが実測できます。
この波形では 8.3uS ですが、LEDはトグル制御なのでその半分、8.3uS÷2=4.15uS 周期で実行されていることになります。
※補足:コンパイラの最適化設定はデフォルトにしています。



なお Harmony コンフィギュレーションの設定は、あとからでも変更できます。
上のメニュー、[Tools]->[Embedded]->[MPLAB Harmony Clock Configration] で設定ウィンドウが開きます。




さて、USBメモリを動かしてみたいところなのですが、実はこの設定ではUSBメモリが正常に動いてくれませんでした。
続く・・・