T2G でマルチプロセッサ (1)

GSH000142.png

最近の PSoC は、 Modus ToolBox という開発環境でファームウェアを作るようになってきました。 このシリーズでは、 Modus ToolBox を使って Traveo-II のファームウェアに挑んでみます。

使用するハードウェア

DSC_0334a.JPG

この記事では、手元にあった CYTVII-B-E-1M-SK を使用します。 すでに評価ボードとしては主流ではないように見えますが、まだ使えるでしょう。

プロジェクトの作成手順

Traveo-II に限らず、プロジェクトを新規作成するときには、 ModusToolBox の Quick Panelメニューから New Application をクリックします。

GSH000118.png

すると、 Project Creator が立ち上がります。 このアプリケーションを使って新たにプロジェクトを作成します。

GSH000153.png

最初は、 Board Support Package (BSP) と呼ばれるハードウェアの情報を格納したデータベースを選択します。 ところが、今回使用する予定の CYTVII-B-E-1M-SK の BSP は並んでいません。 でも大丈夫。 ウィンドウの上の方にある Create from MPN... でターゲットのデバイス名を選ぶと、新たに BSP を作成してくれます。

GSH000154.png

CYTVII-B-E-1M-SK に搭載されている MCU は、 CYT2B75 です。 Filter... のところに cyt2b75 とタイプしたら、候補 MCU のリストが表示されます。 ここでは、この中から CYT2B75CAS を選択します。 また、一緒に使用されるデバイス (Companion) はありませんので、 Companion: は None を選択します。

さらに、新たに作成する BSP の名前として New BSP name には CYTVII-B-E-1M-SK をタイプします。

OK ボタンをクリックしたら BSP が作成されて BSP Assistant が開きます。

GSH000155.png

作成した BSP の中身を整えていきます。 最初は、 Devices です。 ここには、 MCU と周辺デバイスの情報を提供しますが、今回は MCU を単独で使うのでデフォルトのままで大丈夫です。

GSH000156.png

次の項目は、 Configurations の中の Device Configurator です。 ここでは、 MCU の外部端子や内蔵ペリフェラルの設定を行いますが、項目が多いので別のアプリケーションを使います。 Edit Configuration ボタンをクリックすると、 Device Configurator が開きます。

GSH000157.png

アプリケーションより先にダイアログが開きました。 どうやら、この Modus ToolBox で用意されていた CYT2B75CAS のひな型は、古いバージョンの Modus ToolBox で作成されたようです。 そのため、新しいフォーマットに変換してもよいかと問われています。 良いかと問われても他に選択肢は無いので、 OK ボタンをクリックします。 この BSP を再度編集する際には、このダイアログは表示されません。

というか、ひな型のメンテナンスぐらいしてほしい。
GSH000158.png

Device Configurator が開きました。 ここで設定するのは LED 出力端子のみです。 Pin と書かれたタブをクリックすると、外部端子設定画面が開きます。 中央に MCU の端子配置図が置かれて、左側に設定される端子、右側に端子の属性が表示されています。

今回は P19[0] 端子を設定します。 左側の端子表で Port19 の中にある P19[0] の左側にあるチェックボックスにチェックを入れます。 これで、 P19[0] が使用できるようになります。 P19[0] の右側には端子の名前を入れられます。 ここでは、 LED1 と名前を付けます。

右側の属性設定では、以下の属性を設定します。

属性名 (Name)値 (Value)
Drive ModeStrong Drive, Input buffer on
Initial Drive StateLow (0)

Drive Mode は、端子の入出力設定を示します。 今回は LED 出力ですので、強い出力 (Strong Drive) に設定します。 入力バッファON (Input buffer on) は、この端子からのディジタル入力を使う事を示します。 今回のプロジェクトでは、入力としては使いませんが、機能としては生かしてあります。

Initial Drive State は、端子を初期化した時の出力状態を設定します。 この出力端子は、 LED のアノード側に接続されています。 初期化したときは LED が消えていてほしいので、 Low (0) 出力としています。

設定が終わったら、 File->Save で設定を保存して、 Device Configurator を閉じます。

以上で BSP の作成は完了です。 BSP Assistant の画面に戻ったら、 Save ボタンをクリックして Project Creator に戻ります。

GSH000159.png

新たに作成された BSP が一覧表に並びました。 ただし、この BSP は、このプロジェクト固有のものなので、他のプロジェクトでも使いたい場合には、別途書き出す必要があります。

"Next >" ボタンをクリックして次の画面に移ります。

GSH000160.png

この画面では、新たに作成するプロジェクトを指定します。 プロジェクトのひな型として Getting Started -> Empty Project を使用したいのですが、困ったことがわかりました。 "Empty Project" が、ふたつ並んでいるのです。 今回ひな型に使いたいのは "mtb_example_empty_app" なのですが、これら二つは見分けがつきません。 唯一異なっていたのが、右側に表示されているプロジェクト概要の "README on GitHub" の飛び先です。 これらのうち一方が "mtb_example_empty_app" になっています。

プロジェクトを選択してチェックボックスにチェックを入れたら、 New Application Name にプロジェクト名を入れます。 ここでは "Proj001_single_blink" という名前を付けました。

最後に Create ボタンをクリックすると、プロジェクトが作成されて Modus ToolBox の画面に戻ります。

プロジェクトを Build してみる

GSH000161.png

プロジェクトができたら、ひとまず Build してみます。

GSH000162.png

プロジェクトを選択しておいて Quick Panel メニューの Build Project をクリックすると、 Build が始まります。 Build の様子は、 Console ウィンドウに表示されていきます。

GSH000163.png

最後に Build Finished. と表示されたら、 Build 完了です。

賢明なる読者諸君は、 Build Finished. に続いて 2 warnings と表示されていることに気が付いたでしょう。 そうなのです。 このプロジェクトは、最初からライブラリの中に warning が発生しているのです。

一つ目の warning の内容は「マクロが多重に定義されている」という恥ずかしい内容です。

GSH000141.png

今のところ実害はなさそうなので、放置していますが、こんな状態でリリースしないでほしいですよね。

二つ目の warning は、プログラムの書き込み先が RWX (読み書き実行可能)になっているので、プログラムが改ざんされる恐れがあるというものです。 プログラムを格納する Code Flash は、実行中のプログラムから書き換える機能を持っています。 厳密にリンカスクリプトを作れば対処できますが、手間が多くなりそうなので、今は放置しておきます。

ソフトウェアの作成

GSH000164.png

ここから、ソフトウェアを作ります。 Project Explorer から main.c をダブルクリックで開きます。

GSH000134.png

変更箇所は、 main() 関数の末尾にある for ループの中です。 この例では、112行目に2行のプログラムを追加します。

GSH000135.png
Cy_SysLib_Delay(250);
Cy_SysLib_Delay() 関数はソフトウェアループで待ち時間を作ります。 待ち時間の単位はミリ秒です。 ソフトウェアループで作った時間ですので、精度はありませんし、割り込みが入ったらその分遅れます。
Cy_GPIO_Inv(LED1_PORT, LED1_PIN);
Cy_GPIO_Inv() 関数は、指定した GPIO 出力を反転させます。 出力端子の指定には、ポートと端子番号を使います。 ここでは、 LED1 端子のポートと端子番号を指定します。 こんな書き方ができるのも、 BSP で出力端子を設定しておいたおかげです。

これで、250ミリ秒ごとに LED1 出力が反転するので、 LED1 は 2Hz で点滅することになります。

ところで、上のプログラムには出力端子の初期化が入っていません。 これは、 LED1 の初期値を BSP に設定したため BSP の初期化ルーチンに LED1 の初期設定が含まれてしまったためです。 99行目で cybsp_init() が呼び出されていますが、ここで LED1 が初期設定されます。

GSH000136.png

Build したらバイナリファイルが出来上がります。

MCU に書き込んで実行

GSH000166.png

出来上がったバイナリファイルを MCU に書き込みます。 Quick Panel から Proj001_single_blink Debug (KitProg3_MiniProg4) をクリックします。 すると、プログラムが MCU に書き込まれた後で IDE がデバッガ表示に変化します。

GSH000167.png

最初は、 main() 関数の先頭で停止した状態です。 Resume ボタンをクリックすると、 MCU の実行が始まり、 LED1 が点滅します。

この記事へのコメント