ModusToolboxでPSoC 6のLチカ

これは、[PSoC Advent Calendar 2018]の3日目に突っ込まれた記事です。

##ModusToolbox登場
[PSoC 6 MCU]の開発環境として、新しく[ModusToolbox]という統合開発環境(IDE)が発表されました。といっても、この記事を書いている2018年12月3日時点では、一般公開されたわけではありません。現在はEarly Adapter Program (EAP)参加者だけにベータ版が公開されている段階です。この記事では、EAP番のModusToolboxを使って使い勝手を紹介します。

##やりたいこと
まず、何をするかといえば、やっぱりＬチカでしょう。ここでは、PSoCの流儀に従って、ソフトウェアには極力仕事をさせない方法でＬチカを実現します。回路図で描くとこんな感じでしょうか。

![GS003904.png](https://qiita-image-store.s3.amazonaws.com/0/224737/7c49e333-2c06-6dc5-b5b9-7a0bba9d4a81.png)

クロックをPWMで分周して、LEDを2Hzで点滅させます。

##使用するハードウェアは[CY8CPROTO-063-BLE]
本記事で使用する機材は、[PSoC 6 BLE Prototyping Kit][CY8CPROTO-063-BLE]です。

![GS003935.png](https://qiita-image-store.s3.amazonaws.com/0/224737/21784d2e-6c9f-f22d-e04c-da19ef7a6e97.png)

この評価ボードでは、[CYBLE-416045-02 EZ-BLE™ CREATOR MODULE][CYBLE-416045-02]モジュールが使用されているため、同モジュールを使ったアプリケーションのプロトタイプを作成するのに適しています。基板上に赤と緑の二つのLEDが搭載されているので、Ｌチカには十分です。

他の評価ボードと同様にプログラマとして[PSoC 5LP]が搭載されています。この評価ボードの場合、デフォルトのファームウェアとしてKitProg2が書き込まれています。

##ModusToolboxを開く
それでは、[ModusToolbox]を開いてみましょう。その前にインストールをしなくてはなりませんが、インストール方法については、どなたかが書いてくれるでしょう。

[ModusToolbox]は、[eclipse]をベースとしたIDEです。そのため、作業場所としてWorkspaceを指定しなくてはなりません。[ModusToolbox]を開いたときに最初にあらわれるのが、Workspaceを指定するダイアログです。

![GS003906.png](https://qiita-image-store.s3.amazonaws.com/0/224737/8fa410b6-fc81-eef2-9a0e-cb744223b8f1.png)

[ModusToolbox]では、複数のプロジェクトを作成してひとつのアプリケーションにまとめ上げるという方法でバイナリを作成します。そのため、アプリケーションごとにWorkspaceを作成した方が使いやすいようです。この記事でも、Ｌチカアプリケーションのために"C:\MTW\LChika"というWorkspaceを作成します。

LaunchをクリックするとIDE画面が開きます。

![GS003907.png](https://qiita-image-store.s3.amazonaws.com/0/224737/e1468d62-b8b2-1498-c46e-a4ffd9fb6cbf.png)

最初は、"Welcome"というタブが全面をおおっていますが、必要ないので閉じてしまいましょう。これで作業画面が出てきます。

![GS003908.png](https://qiita-image-store.s3.amazonaws.com/0/224737/f9abe7e3-9367-94b2-1ff7-9765967bce79.png)

##ターゲットとベースアプリケーションを指定する
次にアプリケーションを作成します。画面左下にある"Quick Panel"タブにある"New Application"をクリックします。

![GS003909.png](https://qiita-image-store.s3.amazonaws.com/0/224737/cfef0000-509b-5918-2a0d-3f62cf918a27.png)

すると、"ModusToolbox IDE Application"というダイアログが開きます。

![GS003912.png](https://qiita-image-store.s3.amazonaws.com/0/224737/7c17caae-6e9b-15b9-c077-daf5f8df3f38.png)

このダイアログでは最初にターゲットとなるハードウェアを指定します。本来であれば、上にある"Dev/Eval Kit"をクリックして評価ボードを選ぶべきなのですが、今回使用する[CY8CPROTO-063-BLE]は、[ModusToolbox]に登録されていません。そのため、下の"Custom Hardware"をクリックしモジュールを探すという手順になります。なんで、差別されるんかな。

![GS003913.png](https://qiita-image-store.s3.amazonaws.com/0/224737/ee778760-305b-b632-a0c3-f1cf53cad7e1.png)

リストからモジュール[CYBLE-416045-02]を選んだら、"Next"ボタンをクリックします。
次は、ベースになるアプリケーションを選択します。[ModusToolbox]では、ベースになるアプリケーションから目的のアプリケーションに仕上げていくという手法を考えています。そのため、このステップで目的に一番近いアプリケーションを探します。

![GS003914.png](https://qiita-image-store.s3.amazonaws.com/0/224737/1a7e86ba-8cb7-1db7-9837-a97365b65c9e.png)

とは言っても、この記事では使い勝手を確認するのが目的ですから、何もしないアプリケーションである"EmptyPSoC6App"を選択します。また、"Name:"フィールドにはこれから作成するアプリケーションの名前を入れます。ここでは、"LChika"という名前にしました。

![GS003915.png](https://qiita-image-store.s3.amazonaws.com/0/224737/bc95564b-8567-b05f-b745-e170a15f05af.png)

"Next"をクリックすると最終確認ダイアログに変化します。ここで、"Finish"をクリックしてしばらくすると、アプリケーションが作成されます。

![GS003916.png](https://qiita-image-store.s3.amazonaws.com/0/224737/da9e424f-7b6c-9d73-351c-91bd407eeaf0.png)

左上の"Project Explorer"タブを見ると、作成されたアプリケーションには、５個のプロジェクトが存在するのがわかります。

##出力端子を設定する
PSoCでプロジェクト作成直後にやるのは、ハードウェアの設定です。
作成されたプロジェクトのうち、"LChika_config"には、"design.modus"という名前のファイルが有ります。

![GS003917.png](https://qiita-image-store.s3.amazonaws.com/0/224737/6c50e285-35b2-bd27-e75e-c0a8cfc67f35.png)

このファイルをクリックすると、ハードウェアを設定するための外部プログラムである"Device Configurator"が開きます。

![GS003918.png](https://qiita-image-store.s3.amazonaws.com/0/224737/0b7bb889-954a-7a9e-5419-f98830f4d204.png)

設定を行うためのタブがいくつかあります。しばらく[ModusToolbox]を使ってみた所、最初は"Pins"タブを開いて端子の設定をするのがよさそうです。

![GS003919.png](https://qiita-image-store.s3.amazonaws.com/0/224737/7edbdbd6-9dcc-4db7-9a14-fac5ed77d664.png)

このアプリケーションでは、評価ボードの赤色LEDを点滅させるためにP6[3]を使用します。まず、P6[3]の隣にあるチェックボックスにチェックをいれて、端子の名前を記述します。ここでは、"Pin_LEDR"という名前をつけました。

次に画面右側の"Parameters"タブの設定を行います。

![GS003920.png](https://qiita-image-store.s3.amazonaws.com/0/224737/ecae6348-fce5-ca06-4b6c-73beefd004ef.png)

1. "General: Drive Mode"を"Strong Drive, Input buffer off"に設定して、LEDを駆動できるようにします。
2. "Terminals: Digital Output"を"TCPWM[0] 32-bit Counter 1 pwm_n"に設定して、PWM出力をこの端子から出力できるようにします。

[PSoC 6 MCU]では、端子に割り当てられる機能がかなり制限されています。そのため、LEDが接続された端子に対して割り当て可能なPWM出力を選択するという順序で行った方が便利です。

##PWMを設定する
次は、PWMの設定です。さきほど"TCPWM[0] Counter 1"を設定した"Digital Output"の欄に鎖のアイコンが出てきました。

![GS003921.png](https://qiita-image-store.s3.amazonaws.com/0/224737/ffc662a9-a68f-f159-1345-8cd145c226a4.png)

このアイコンをクリックすると、直接PWMの設定画面に飛ぶことができます。

![GS003922.png](https://qiita-image-store.s3.amazonaws.com/0/224737/ff8f7c41-9244-741a-ebe5-51b75a6d6a53.png)

端子の設定と同様にチェックボックスにチェックを入れて、名前を付けます。ここでは、"PWM_2Hz"としました。

次に画面右側の"Parameters"タブの設定を行います。

![GS003923.png](https://qiita-image-store.s3.amazonaws.com/0/224737/fd067c43-aa32-e073-2f89-c2af144912e2.png)

1. "Period"の値を500000に設定します。まだ設定をしていませんが、このPWMには1MHzのクロックを使用する予定です。そのため、500,000分周して0.5sec周期のPWM出力を得ようとしています。
2. "Compare"の値を250000に設定します。"Period"の半分の値に設定することによって、PWM出力のデューティー比は50%になります。
3. "Clock Signal"を"8 bit Divider 0 clk"に設定します。上述のように1MHzのクロックを出力するためのクロック源を指定します。どのクロックも使用可能です。

また、"Clock Signal"の欄に鎖のアイコンが現れました。このアイコンをクリックして、今度はクロックの設定を行います。

##クロックを設定する
クロック設定タブでは、すでにチェックボックスにチェックが入っています。

![GS003924.png](https://qiita-image-store.s3.amazonaws.com/0/224737/f691e51e-f96e-4cf1-e0c5-637c07498a1e.png)

名前を付けたら、画面右側の"Parameters"タブの設定を行います。

![GS003925.png](https://qiita-image-store.s3.amazonaws.com/0/224737/85a3eb1f-1d17-e54e-c685-7df1bf727cbc.png)

1. "Divider"に72を設定する。

72MHzの"CLK_PERI"から1MHzのクロックを作成するので、"Divider"に72を設定します。"CLK_PERI"を変えたら、忘れずに"Divider"を設定し直さなくてはなりません。なんて不便なんだ。

以上で三つのブロックの設定と相互接続ができました。"Device Configurator"のメニューから"File→Save"を選択して"design.modus"を保存します。保存ができたら"Device Configurator"を"File→Exit"で終了させます。

##ソフトウェア
このアプリケーションでは、**Cortex-M4**側ですべての処理を行わせます。このため、"LChika_mainapp"プロジェクトの"main.c"ファイルにソフトウェアを書きます。

![GS003926.png](https://qiita-image-store.s3.amazonaws.com/0/224737/5733942d-1361-19aa-8d62-68b0c52bcac7.png)

ソフトウェアと言っても、PWMを起動する処理だけです。以下のように3行書くだけでPWMが起動して分周を始めます。

```c:LChika_mainapp/Source/main_cm4.c
int main(void)
{
    /* Set up the device based on configurator selections */
    init_cycfg_all();

    __enable_irq();

    Cy_TCPWM_PWM_Init(PWM_2Hz_HW, PWM_2Hz_NUM, &PWM_2Hz_config);
    Cy_TCPWM_PWM_Enable(PWM_2Hz_HW, PWM_2Hz_NUM);
    Cy_TCPWM_TriggerStart(PWM_2Hz_HW, PWM_2Hz_MASK);

    for(;;)
    {
    }
}
```

##プログラムしようとしたのだけど
以上で、設定とプログラムはおしまいです。あとは、[PSoC 6 MCU]に書き込むだけです。

![GS003927.png](https://qiita-image-store.s3.amazonaws.com/0/224737/a7b7d90a-9971-34fe-81d0-fdc8e81ee0db.png)

左下の"Quick Start"タブの一番下に"LChika Program (KitProg3)"という項目があります。評価ボードを接続し、ここをクリックすると、アプリケーションのビルドとターゲットデバイスへの書き込みまでをしてくれます。クロックすると、コンソールに何やら赤いエラーが現れました。

![GS003928.png](https://qiita-image-store.s3.amazonaws.com/0/224737/0f9d2711-6e6b-e8d0-6b41-109f257a5ef2.png)

「CMSIS-DAPが見つからない」

この評価ボードの初期設定は、KitProgモードになっています。"CMSIS-DAP"を使用するには、SW3(MODE)を押して、モードを切り替えます。すると、LED2(STATUS)が点灯から消灯に切り替わります。これで、"CMSIS-DAP"が使えるようになります。もういちど、"LChika Program (KitProg3)"をクリックします。

![GS003929.png](https://qiita-image-store.s3.amazonaws.com/0/224737/10cb713d-6475-8b4c-0a35-b679eb365e11.png)

「KitProgファームウェアが古いので、fw-loaderを使って最新版アップデートせよ」

このエラーは、[PSoC 5LP]にKitProg2が書かれているのが原因です。[ModusToolbox]で使用するためには、KitProg3が必要になってきます。書き換えるためには、fw-loaderというプログラムを使用する必要があります。

fw-loaderは、実行ファイルが"C:\Users\<user id>\ModusToolbox_1.0\tools\fw-loader-1.0\bin"に有りますが、コンソールから開く必要があります。

1. 実行ファイルのあるフォルダでコマンドラインを立ち上げます。
2. SW3(MODE)を押して、KitProgモードに入れます。
3. "fw-loader --device-list"を実行します。

```
C:\ .. \bin>fw-loader --device-list
Cypress Firmware Updater, Version: 1.0.0.505
(C) Copyright 2018 by Cypress Semiconductor
All Rights Reserved

Info: Start API initialization
Info: Connected - KitProg2-1B14156503068400
Info: Hardware initialization complete (713 ms)
Connected supported devices:
        1: KitProg2-1B14156503068400    FW Version 1.5.0
```

この出力結果の"KitProg2-1B14156503068400"の部分が[CY8CPROTO-063-BLE]に搭載されたKitProgのIDです。これを使って、ファームウェアをKitProg3にアップグレードします。

```
C:\ .. \bin>fw-loader --update-kp3 "KitProg2-1B14156503068400"
Cypress Firmware Updater, Version: 1.0.0.505
(C) Copyright 2018 by Cypress Semiconductor
All Rights Reserved

Info: Start API initialization
Info: Connected - KitProg2-1B14156503068400
Info: Hardware initialization complete (721 ms)
Device 'KitProg2-1B14156503068400' opened successfully
Info: Kit FW is 'KitProg2' ver. 1.05 b000. Upgrade file is 'KitProg3' ver. 1.01 b158
Info: Disconnected - KitProg2-1B14156503068400
Info: Connected - KitProg Bootloader-1B14156503068400
Info: Bootloader Version: Major 1, Minor 1, Build 40
Info: FW Upgrade to version: 1.01 b158
Info: Bootloading ...
Info: Verifying ...
Info: FW Upgrade completed
Info: Connected - KitProg3 CMSIS-DAP BULK-1B14156503068400
FW update completed successfully
Info: Disconnected - KitProg Bootloader-1B14156503068400
```

これで、KitProg3に書き換えられました。もう一度SW3(MODE)を押してCMSIS-DAPが使えるモードにします。

##再び、プログラム
もういちど、"LChika Program (KitProg3)"をクリックすると、こんどは、うまく書き込めました。LEDも点滅しています。

![GS003930.png](https://qiita-image-store.s3.amazonaws.com/0/224737/5b79fbd8-e7ee-9011-133d-4cd6dfcc5f66.png)

ただのＬチカなのに、18kBも必要なんですね。

##関連サイト
[PSoC 6 BLE Prototyping Kit][CY8CPROTO-063-BLE]
[ModusToolbox™ Software Environment][ModusToolbox]

[PSoC Advent Calendar 2017]:https://qiita.com/advent-calendar/2017/psoc
[PSoC Advent Calendar 2018]:https://qiita.com/advent-calendar/2018/psoc
[PSoC 6 MCU]:http://www.cypress.com/psoc6
[ModusToolbox]:http://www.cypress.com/modustoolbox
[CY8CPROTO-063-BLE]:http://www.cypress.com/cy8cproto-063-ble
[CYBLE-416045-02]:http://www.cypress.com/cyble-416045-02
[PSoC 5LP]:http://www.cypress.com/psoc5lp
[eclipse]:https://www.eclipse.org/
[CY8CKIT-062-BLE]:http://www.cypress.com/cy8ckit-062-ble
[AN215656]:https://www.cypress.com/an215656
[CE216795]:https://www.cypress.com/ce216795
[CE219339]:https://www.cypress.com/ce219339
[AN217666]:https://www.cypress.com/an217666
[PSoC63BLE ATRM]:http://www.cypress.com/file/385621/download
[LC(1)]:https://qiita.com/noritan_org/items/d08f4578a91d63b93c06