PSoC 3 で、 HID Bootloader を試す (1) [PSoC]
PSoC 3 を題材に Bootloader の使い方を試します。 使用するハードウェアは、 CY8CKIT-030 です。
Bootloader って何だろう
通常、 PSoC のプログラミングを行う場合には、プログラマと呼ばれる専用のハードウェアが必要です。 PSoC 3 の開発を行う場合には、 MiniProg 3 と呼ばれるプログラマが使われ、プログラマを接続するための専用コネクタが基板上に装備されます。 プログラマを使う方法は、開発時には良いのですが、いったん、 PSoC が装置に組み込まれてしまうと、このコネクタにたどり着くことができません。 また、開発時にしか使わないコネクタなど、省略されてしまうこともしばしばです。
そこで、専用のコネクタを装備しなくても、どこかの既存の通信線を通じて PSoC のプログラムを行う方法があると便利です。 Bootloader は、専用のプログラマやコネクタを使わなくてもプログラムを行う事が出来る手法の一つです。
PSoC 3 で提供する Bootloader は、この図のように三つの部分から構成されます。
- Application (Bootloadable)
- ユーザが最終的に必要とするプログラムです。 このプログラムは、 Bootloader によってプログラムする事ができます。
- Bootloader
- Bootloader は、フラッシュ ROM に常駐するプログラムです。 このプログラム自体の役割は、 Bootloadable をフラッシュ ROM の残りの部分に書き込むことです。 また、システムのリセット直後に、 Bootloader として振る舞うか、 Bootloadable として振る舞うかの判断も行います。
- Application File
- Bootloader は、ホストと通信線を介して Bootloadable を受信し、フラッシュ ROM に書き込みます。 この時に使用されるフォーマットが、 Application File です。 Application File は、 PSoC Creator で簡単に作成する事ができます。
このモデルでは、 Bootloader を最初に作成して、そのあと、 Bootloadable を作成し、 Application File として配布します。 まずは、 Bootloader から作成します。
Bootloader プロジェクトを作成する
Bootloader プロジェクトを作成するには、通常通りに PSoC Creator で新規プロジェクトを作成します。 その際に、通常のプロジェクトとは、異なる設定を行います。
- プロジェクト名とワークスペース名を明確に分ける
通常、 Name: フィールドにプロジェクト名を記述すると、ワークスペース名には、そのコピーが入ります。 Bootloader を使用する場合には、通常、ひとつの Bootloader プロジェクトと複数の
Bootloadable プロジェクトを共通のワークスペースに混在させて使用します。 ここでは、 "Design102" というワークスペースに "USB_Bootloader" というプロジェクトを作成しています。 - Application Type を指定する
Application Type に "Bootloader" 指定します。 これにより、 Bootloader 用プロジェクトのひな形が使用されて、初期プロジェクトが作成されます。
指定したら、 OK をクリックして、プロジェクトを作成させます。
コンポーネントを準備する
回路図が開いたら、通常のプロジェクトと同様に、必要なコンポーネントを並べていきます。 今回作成する Bootloader プロジェクトでは、 USB の HID インターフェイスを用いて、プログラムを行うプログラムを作成します。 必要なのは、 Bootloader コンポーネントと USBFS コンポーネントです。 それぞれのインスタンス名を "Bootloader" および "USBFS" に変更します。
Bootloader コンポーネントの設定
Bootloader コンポーネントでは、 Communication component フィールドに "USBFS" を指定します。 このフィールドで指定した通信機能を使ってホストとの通信を行います。
この設定画面では、もう一つ、変更した所があります。 それは、 Wait for command time (ms) フィールドで、 10000(10秒)に変更しています。 リセット直後、 Bootloader は、このフィールドで指定された待ち時間だけ、ホストからの接続要求を待ちます。 そして、時間切れになったら、 Bootloadable を呼び出して、通常のアプリケーションとしての動作に移行します。 ここで待ち時間を初期値の2000(2秒)から増やしたのは、後の実験で、 Bootloadable への移行時間を見えやすくするためです。
USBFS の設定
USBFS コンポーネントを設定するためには、一般にかなり深い知識が必要になってきます。 ところが、 Bootloader を作成するだけであれば、ユーザが苦労をする必要はありません。 それは、すでに、 Bootloader のための設定ファイルが用意されているからです。 設定画面で Import ボタンをクリックすると、設定ファイル選択ダイアログが開きます。
ここで選択するのは、 "bootloader.root.xml" というファイルで、 PSoC Creator のインストールディレクトリ配下の以下の場所にあります。
<PSoC Creator InstallDir>\psoc\content\cycomponentlibrary\CyComponentLibrary.cylib\USBFS_v2_60\Custom\template\
USBFS コンポーネントのバージョンは、お使いのコンポーネントのバージョンに合わせてください。
これで、 Bootloader のための設定が追加されました。 まだ、 USBFS の初期設定が残されていますので、ふたつある "Device Descriptor" の上の方を選択し、 "Delete" ボタンをクリックして、削除しておきます。 これで、 USBFS コンポーネントの準備が出来ました。
クロックの設定
この Bootloader は、 USBFS を使用するために、厳密にクロックの設定を行う必要があります。 もちろん、 PSoC Creator であれば、簡単に設定できます。
Workspace Explorer から "USB_Bootloader.cydwr" を開いて、 "Clocks" タブを選択すると、このような画面が開きます。 二つばかり「赤いビックリマーク」が付いていますので、修正が必要です。 "Edit Clock..." をクリックして、クロック設定ダイアログを開きます。
クロック設定ダイアログでは、以下の4点を修正します。
- IMO
IMO の設定を "24.000MHz ±4%" に変更します。 USB の規格で要求とされているのは、 4% どころではない、もっと高精度なクロックです。 ところが、 PSoC には、接続先の USB ホストに合わせて内部クロックを自動的に調整する機能が有ります。 この機能を生かすための設定が、 "24.000MHz ±4%" なのです。
- ILO
ILO の設定を "100kHz" に変更します。 先に説明した IMO を USB ホストに合わせて調整する機能は、 ILO のタイミングで実行されます。 適切な範囲に調整するために、 ILO を "100kHz" に設定します。
- USB
USB のチェックボックスをクリックして、 USB ブロックにクロックを供給します。 与えるクロックは、 IMO のクロックをクロックダブラに通した "IMOx2 - 48.000MHz" です。
- PLL
PLL の出力周波数を "66MHz" に設定します。 USBFS コンポーネントを使用する場合、 USB に与えるクロックよりも速いクロックを "MASTER_CLK" に与える必要があります。 ここでは、 "48MHz" のクロックで十分という事になりますが、許容される最高周波数である "66MHz" を与えています。
これで、クロックの設定は、完了です。
コードを書く
コンポーネントが整ったら、次は、 "main.c" にソースコードを書きます。 ところが、ここでは、何もする必要がありません。 既に必要な記述 "CyBtLdr_Start();" が入っています。
ひとつだけ修正しなくてはならない個所が有りました。 "main()" の戻り値の型を "void" から "int" に変更しておいてください。 どうも、テンプレートの段階から間違っていたようです。
Bootloader の書き込み
Bootloader は、通常のプロジェクトと同様に、プログラマを使って書き込みます。 CY8CKIT-030 の場合には、オンボードのプログラマを使って書き込むことができます。
Bootloader との通信
書き込みが終わったら、接続してみましょう。 Bootloader と通信を行うためには、 USB コネクタを通信用のコネクタに接続しなおして、 PSoC Creator のメニュー "Tools"→"Bootloader Host..." で Bootloader Host というアプリケーションツールを呼び出します。
すると、上のスクリーンショットのように、 "USB Human Interface Device (04B4_B71D)" がポートリストに並びます。 この VID/PID は、 Bootloader の設定ファイルに記述されていたものです。 これで、 Bootloader プログラムと通信できるようになりました。
参考文献
- AN73854 - PSoC® 3, PSoC 4, and PSoC 5LP - Introduction To Bootloaders
- AN73503 - USB HID Bootloader for PSoC® 3 and PSoC 5LP
関連文献
シリーズ最強!PSoC 3ボード+デバッグ・ボード: あのPSoCが生まれ変わった!アナログもディジタルも一新 (トライアルシリーズ)
- 作者: 古平 晃洋
- 出版社/メーカー: CQ出版
- 発売日: 2012/10/23
- メディア: 単行本
トランジスタ技術増刊 基板付き体験編ARM PSoCで作るMyスペシャル・マイコン 2013年 12月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2013/11/21
- メディア: 雑誌
開発編 ARM PSoCで作るMyスペシャル・マイコン (トライアルシリーズ)
- 作者: 圓山 宗智
- 出版社/メーカー: CQ出版
- 発売日: 2013/12/24
- メディア: 単行本
フリースタンディング環境ですから
main() はvoid のままでも問題なしです
by NO NAME (2014-06-16 17:08)