2024年12月8日日曜日

Simplicity Studioを使ってみた! その3

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


「Simplicity Studio」でプログラミング

インストールしたSilicon Labs社のマイコン用の統合開発環境「Simplicity Studio」で、テストプログラムを動かしてみましょう。

前回は、そのテストプログラムのためのプロジェクトを作りました。

その過程で、ターゲットボードで使用するハードウェアの設定と、それに使用するソフトウェア・コンポーネント(ドライバみたいなものですね!)を紐づけました。

これでコーディング作業に取り掛かる準備は万端です!

閉じてしまった方は「Simplicity Studio」を立ち上げましょう。

スプラッシュスクリーン


起動したら画面左上の「Project Explorer」タブに注目!

Simplicity Studio - 1


ここに前回作成した「empty」プロジェクトが表示されています。

プロジェクトに属しているファイルの一覧が表示されていない場合は「empty」という表示の先頭にある「V」マークをクリックして中身を展開しましょう。

さて、ある程度自動生成されているソースコードを見ていく訳ですが、今回使うのはC言語なので、一番最初に実行される関数は、多分「main()」。

なので、これが実装されているのは「main.c」かな?

…というわけで、ファイルの一覧から「main.c」をダブルクリックして、ソースコードを見てみましょう。

Simplicity Studio - 2


ソースコードを見てみると、やはりありましたよ「main()」。

コメントから推測するに、ユーザーのアプリケーションを実装するための関数は「app_init()」と「app_process_action()」のようですね。

まず「app_init()」は、ターゲットの起動時に一回だけ実行するべき処理を記述…。

その後、whileループの中にある「app_process_action()」に、アプリケーションの処理を記述すれば良さそうですね。

  • ...
  • int main(void)
  • {
  •   // Silicon Labsデバイス、システム、サービス、プロトコル スタックを初期化します。
  •   // カーネルが存在する場合、この呼び出しによって処理タスクが作成されることに
  •   // 注意してください。
  •   sl_system_init();

  •   // アプリケーションを初期化します。たとえば、カーネルが存在する場合は、
  •   // 周期タイマーまたはタスクを作成します。
  •   app_init();

  • #if defined(SL_CATALOG_KERNEL_PRESENT)
  •   // カーネルを起動します。app_init()で作成されたタスクが実行を開始します。
  •   sl_system_kernel_start();
  • #else // SL_CATALOG_KERNEL_PRESENT
  •   while (1) {
  •     // この呼び出しを削除しないでください: Silicon Labsコンポーネント・プロセス・アクション・ルーチンは、
  •     // スーパーループから呼び出す必要があります。
  •     sl_system_process_action();

  •     // アプリケーション・プロセス.
  •     app_process_action();

  • #if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
  •     // システムが許可する場合は、CPUをスリープ状態にします。
  •     sl_power_manager_sleep();
  • #endif
  •   }
  • #endif // SL_CATALOG_KERNEL_PRESENT
  • }


では「app_init()」や「app_process_action()」は一体何処に存在するのか?

この「Simplicity Studio」も元となっているのは「Eclipse」ですので、同様の操作でソースコードから別のソースコードにある関数へジャンプできます。

すなわち、キーボードの「Ctrl」キーを押しながら、ジャンプしたい関数の記述にマウスカーソルを重ねれば、リンク状態となり、それをクリックすることで実際の関数の記述位置へジャンプすることができます。

Simplicity Studio - 3


ジャンプの結果「app_init()」と「app_process_action()」は共に「main.c」と同じディレクトリにある「app.c」であることが分かりました。

両方の関数は、今は空っぽの状態です。

ですので、この「app.c」に自分のプログラムを書いていけば良さそうです。


LEDとプッシュボタンとシリアル通信を使用した簡単なサンプルプログラムかぁ…。

こんなふうに作ってみました。

以下、実装した「app.c」のソースコードです。

  • /***************************************************************************//**
  •  * @file
  •  * @brief Top level application functions
  •  *******************************************************************************
  •  * # License
  •  * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
  •  *******************************************************************************
  •  *
  •  * The licensor of this software is Silicon Laboratories Inc. Your use of this
  •  * software is governed by the terms of Silicon Labs Master Software License
  •  * Agreement (MSLA) available at
  •  * www.silabs.com/about-us/legal/master-software-license-agreement. This
  •  * software is distributed to you in Source Code format and is governed by the
  •  * sections of the MSLA applicable to Source Code.
  •  *
  •  ******************************************************************************/

  • #include "pin_config.h"
  • /*
  •  * これ以降は「autogen」ディレクトリ以下に生成されたコンポーネントのヘッダファイル
  •  * コンポーネント、ドライバの関数やインスタンスを使用するために必要
  •  */
  • #include "sl_simple_led_instances.h"
  • #include "sl_simple_button_instances.h"
  • #include "sl_uartdrv_instances.h"

  • /***************************************************************************//**
  •  * Initialize application.
  •  ******************************************************************************/
  • void app_init(void)
  • {
  •   /*
  •    * VCOM_ENABLEピンをHighにして仮想シリアルポートを有効化
  •    */
  •   GPIO_PinOutSet(VCOM_ENABLE_PORT, VCOM_ENABLE_PIN);
  • }

  • /***************************************************************************//**
  •  * App ticking function.
  •  ******************************************************************************/
  • void app_process_action(void)
  • {
  •   sl_button_state_t s;
  •   static sl_button_state_t st0 = 0;
  •   static sl_button_state_t st1 = 0;

  •   /*
  •    * プッシュボタン0(PB0)の処理
  •    */
  •   s = sl_button_btn0.get_state(&sl_button_btn0);
  •   if (st0 != s) {
  •     // 以前の状態から変化があった場合
  •     st0 = s;
  •     if (st0) { // 押されている
  •         // LED0を点灯
  •         sl_simple_led_turn_on(sl_led_led0.context);
  •         // PB0が押されたメッセージを送信
  •         UARTDRV_TransmitB(sl_uartdrv_usart_vcom_handle, (uint8_t*)"PB0 Pushed!\r\n", 13);
  •     } else { // 放されている
  •         // LED0を消灯
  •         sl_simple_led_turn_off(sl_led_led0.context);
  •         // PB0が放されたメッセージを送信
  •         UARTDRV_TransmitB(sl_uartdrv_usart_vcom_handle, (uint8_t*)"PB0 Released!\r\n", 15);
  •     }
  •   }

  •   /*
  •    * プッシュボタン1(PB1)の処理
  •    */
  •   s = sl_button_btn1.get_state(&sl_button_btn1);
  •   if (st1 != s) {
  •     // 以前の状態から変化があった場合
  •     st1 = s;
  •     if (st1) { // 押されている
  •         // LED1を点灯
  •         sl_simple_led_turn_on(sl_led_led1.context);
  •         // PB1が押されたメッセージを送信
  •         UARTDRV_TransmitB(sl_uartdrv_usart_vcom_handle, (uint8_t*)"PB1 Pushed!\r\n", 13);
  •     } else { // 放されている
  •         // LED1を消灯
  •         sl_simple_led_turn_off(sl_led_led1.context);
  •         // PB1が放されたメッセージを送信
  •         UARTDRV_TransmitB(sl_uartdrv_usart_vcom_handle, (uint8_t*)"PB1 Released!\r\n", 15);
  •     }
  •   }
  • }


このプログラムの内容は、プッシュボタン(0と1)を押したり放されたりするとLED(0と1)が点灯、または消灯し、シリアル通信で各々の場合にメッセージが送信されるといった内容になります。

気をつけなければならないのは「app_init()」関数の内容です。

USBを経由した仮想シリアルポートを使用する場合は「VCOM_ENABLE」という信号線をHighにしなければなりません。

前回出てきた以下の回路図を思い出してください。

今回の場合、ターゲット起動時に一回だけ処理しなければならない処理、すなわち「app_init()」関数に記述するべき内容は、これだけです。

VCOM_ENABLE信号


実行は、ターゲットをパソコンとUSBで接続し、編集した「app.c」を必ず保存してから「Simplicity Studio」左上の虫マークをクリックします。

これだけでビルド作業が開始され、デバッガが起動するはずです。

Simplicity Studio - 4


なにかワチャワチャ作業が始まりますが、やがて以下のように「sl_system_init()」関数の行で実行がストップします。

デフォルトの設定では、いきなりプログラムを開始するのではなくて、最初の行でデバッグが一時停止(ブレーク)するようになっているようです。

ここから「Resume」という操作を行えば、プログラムは再開されますが、せっかくなのでブレークポイントの仕掛け方も確認しておきましょう。

試しに、今回色々実装した「app_process_action()」関数で一時停止(ブレーク)するようにしてみます。

それには「app_process_action()」の行の先頭の部分、行番号の左側をダブルクリックします。

青い丸が表示されると、この行にブレークポイントが仕掛けられたことを意味します。

(解除は、同じくダブルクリックで青い丸を消せば可能です。)

Simplicity Studio - 5


ブレークポイントを仕掛けたら「Simplicity Studio」左上の「▶」マークをクリックします。

これで「Resume」という操作を行ったことになり、プログラムが再開されます。

Simplicity Studio - 6


しかし、すぐに「app_process_action()」の行まで処理が進み、以下のように再度一時停止(ブレーク)となります。

これで、ブレークポイントが正しく動作していることが確認できました。

尚、この行はwhileループの中にあります。

このままだと毎回止まってしまうので、必ずブレークポイントを解除しましょう!

解除してから、再度「▶」マークをクリックしてプログラムを再開させましょう。

Simplicity Studio - 7


今、ターゲット上では、今回作成したプログラムが動作しているはずです。

LEDの点灯は目視で分かりますが、シリアル通信の受信内容を見るためには「TeraTerm」などのターミナルソフトが必要です。

インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。

もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。

ボーレートは「9600」です。


では、動きを見てみましょう!

プッシュボタン0(BTN0)を押すと、LED0が点灯し…

ターゲット - 1


…その瞬間に、ターミナルには「PB0 Pushed!」という表示が出力されます。

TeraTerm - 1


プッシュボタン0(BTN0)を放すと、LED0が消灯し…

ターゲット - 2


…その瞬間に、ターミナルには「PB0 Released!」という表示が出力されます。

TeraTerm - 2


プッシュボタン1(BTN1)とLED1の組み合わせも同様の動きになっています。

ターゲット - 3


TeraTerm - 3


どうやら、正しくプログラミングできているみたいです!

プログラムを停止するには「Simplicity Studio」左上の「■」マークをクリックします。

Simplicity Studio - 8


現在「Simplicity Studio」は「Debug」モードになっています。

プログラムの編集など、通常モードに戻すためには「Simplicity Studio」右上の「Simplicity IDE」ボタンをクリックし「Debug」から切り替えます。

再度デバッグを開始する際には、自動的に「Debug」モードに切り替わります。

Simplicity Studio - 9


Silicon Labs社の統合開発環境「Simplicity Studio」、若干クセはあるものの思った以上に使いやすい印象です。

マイコンのピンの機能をGUIで設定できて、その設定のソースコードへのエクスポート、デバイスドライバやコンポーネントの生成、更には雛形のプロジェクトまで吐き出してくれるとは…便利な時代となりましたね。

(マイコンのデータシートを隅から隅まで舐め回すように読み耽り、シリアル通信のドライバすら実装に一苦労していた時代は何だったのか…!?)

その点、STマイクロエレクトロニクス社の「STM32CubeIDE」や、ルネサスエレクトロニクス社の「e2 Studio」などと比較しても、通常の開発レベルでは遜色のない出来だと思います。


Silicon Labs社のマイコンは、各種無線に特化している魅力的なラインナップが揃ってます。

でも評価ボードは非常にいたって高価で、マイコンの小売販売はしていないため、ホビー用途には使えないのが残念です。

秋葉原あたりで買える安価で手軽な評価ボード、どこかが作ってくれないかなぁ…。


<終わり>

2024年11月24日日曜日

Simplicity Studioを使ってみた! その2

前回からの続きです。


「Simplicity Studio」でのプロジェクト作成

インストールした「Simplicity Studio」の動作確認を兼ねて、簡単なプログラムを作ってターゲットを動かしてみましょう。

ターゲットは「Z-Wave 800 Pro キット」という評価ボードを使用することを前提として書いています。

ターゲット - 1


そのために、まずはプロジェクトの作成が必要です。

何はともあれ「Simplicity Studio」を起動させましょう。

Simplicity Studio - 1


画面左上のメニューから「File」→「New」→「Silicon Labs Project Wizard...」と順にクリックしていきましょう。

Simplicity Studio - 2


すると「New Project Wizard」というダイアログが表示されます。

ここでは、これから作成するプロジェクトのターゲット情報を設定するのですが、各項目、自動入力されていますね。

誤りがなければ、ダイアログ下部の「NEXT」ボタンをクリックしてください。

Simplicity Studio - 3


次の表示では、とりあえず「Empty C Project」を選択しましょう。

そして「NEXT」ボタンをクリック…。

Simplicity Studio - 4


次の表示では、プロジェクト名やその保存先を設定します。

しかし、デフォルトでプロジェクト名は「empty」と入力されていますので、このままでも良いです。

気になる方は、お好きな名前を。

プロジェクトの保存先においても、特別な事情がない限りはそのままで結構です。

ただし、SDKの扱いだけは「Copy contents」にラジオボタンを選択しています。

これを選択した方が、SDKのソースコードが作成するプロジェクト内にコピーされる仕組みとなるので、特に他人にプロジェクトを渡すときにトラブルが無さそうです。

ダイアログ下部の「FINISH」ボタンをクリックして「New Project Wizard」を終了させます。

Simplicity Studio - 5


これで「empty」という新しいプロジェクトが作成されたはず。

画面左上の「Project Explorer」に注目です。

Simplicity Studio - 6


このように、いくつかのディレクトリやファイルが「empty」プロジェクトのディレクトリ以下に生成されていることが分かります。

これらの中で「empty.pintool」というファイルをダブルクリックしてみてください。

Simplicity Studio - 7


すると「Simplicity Studio」のメインタブに、マイコンの絵とピンの機能を説明する表が現れました。

他のマイコンメーカーの統合開発環境と同じく、ここにピンの役割を設定してやって、ドライバーやミドルウェアをプロジェクトに追加していくのでしょう。

Simplicity Studio - 8


さて、今回は「Simplicity Studio」の味見と試運転が目的ですから、そんなに凝ったプログラムは書きません。

それでも、最低限のハードウェアの動きは見てみたいと思います。

(そうじゃなきゃツマンナイ。)

ターゲット上に用意されている、簡単に、且つ気軽に使えるハードウェアはどれかな~?

ターゲットのクイックスタートガイドをダウンロードし、一通り読んでみましょう。

まず、このターゲットには、LEDとプッシュボタンがそれぞれ2つずつ載ってるみたいですね。

回路図 - 1


実際にはこれらの場所…。

ターゲット - 2


加えて、シリアル通信も使えそうです。

これは、ターゲット上でUSBに変換されて、パソコンに差すとシリアルポートとして認識されるタイプです。

回路図 - 2


USB Cタイプのジャックはターゲットの左側にあります。

これは、デバッグポートも兼ねていますので、ケーブル一本でデバッグもシリアル通信もできてしまう親切設計ですね。

ターゲット - 3


これらを踏まえた上で「Simplicity Studio」上で、マイコンのピンに機能を割り振っていきましょう。


まずは、1つ目のLEDです。

上記の回路図から、これは「PB02」に接続されています。

ですので、「Simplicity Studio」のメインタブに現れた表の中から「PB02」の行を見つけて、これをダブルクリックします。

Simplicity Studio - 9


以下のような編集画面が表示されましたね。

ここに必要事項を設定していきましょう。

まずは一番上の「Function:」の欄、これはコンボボックスになっていますので、右端の「」マークをクリックです。

Simplicity Studio - 10


選択できる項目が表示されます。

LEDは、マイコンのGPIO(General Purpose Input/Output)という機能を使用しますので、ここでは「GPIO_mode」を選択します。

これにより「PB02」のピンはGPIOとして使用するように設定されたことになります。

Simplicity Studio - 11


次の「Custom Pin Name:」のテキストボックスは飛ばして…。

(せっかく入力しても、この後の操作でクリアされてしまうので。)

その下の「Please add a compatible component for the Function:」の欄のコンボボックスの右側の「NEW」というボタン…。

これをクリックします。

Simplicity Studio - 12


すると、以下のような画面に切り替わります。

ここでは、このピンに紐づけるドライバやミドルウェアなどのコンポーネント(これらを「SDK」と呼んでいます。)を選択します。

とはいえ、左側に表示されているように、これらの数は膨大です。

絞り込みのために画面上部の「Search keywords: component's name」の欄にキーワードを入力します。

Simplicity Studio - 13


キーワードは「LED」としましょう。

入力と同時に左側の選択肢も大分絞られたと思います。

Simplicity Studio - 14


絞られた選択肢の中から、今回は「Simple LED」というのを選びましょう。

「Simple」っていう名前に惹かれました!

左側の一覧で「Platform」→「Driver」→「LED」と展開していき、表示された「Simple LED」をクリックし、更に右側に表示された説明文の上の「Intsall」ボタンをクリックします。

Simplicity Studio - 15


以下のような確認画面が表示されます。

この「Simple LED」というコンポーネントを「led0」という名前でインスタンスを作成するけどいい?…って聞いています。

もちろん「Done」ボタンをクリックです。

Simplicity Studio - 16


無事にコンポーネントがインストールされて「led0」インスタンスが生成されると以下のような表示となります。

「Simplicity Studio」のメインタブを「empty.pintool」に切り替えましょう。

Simplicity Studio - 17


まずは「Please add a compatible component for the Function:」の欄のコンボボックスに「Simple LED」コンポーネントの「led0」インスタンスが選択されていることを確認してください。

正しければ「Custom Pin Name:」のテキストボックスに「PB02」の信号名を入力します。

上記の回路図では「UIF_LED0」という名前でしたね。

入力したら「APPLY AND CLOSE」ボタンをクリックします。

Simplicity Studio - 18


マイコンの絵とピンの機能を説明する表に戻ってきました!

「PB02」の行に、今までの設定の結果が表示されているはずですね。

これで1つ目のLEDの設定は完了です。

Simplicity Studio - 19


次に、2つ目のLEDです。

2つ目のLEDは「PD03」ピンを「UIF_LED1」という名前で「Function: GPIO_mode」と設定します。

1つ目のLEDの時の作業と同様ですが「Simple LED」コンポーネントのインスタンスを作成する時の操作が異なります。

この時点でコンポーネントは既にインストールされているため、今回は以下のように「Simple LED」コンポーネントの説明文の下部の「Add New Instances」ボタンをクリックします。

Simplicity Studio - 20


今回は「led1」という名前でインスタンスが作成されるようです。

Done」ボタンをクリックします。

Simplicity Studio - 21


メインタブを「empty.pintool」に切り替え「Custom Pin Name:」のテキストボックスに「PD03」の信号名を入力します。

上記の回路図では「UIF_LED1」という名前でしたね。

入力したら「APPLY AND CLOSE」ボタンをクリックします。

Simplicity Studio - 22


次に、2つのプッシュボタンの設定です。

作業はLEDのときとぼぼ一緒。

1つ目は「PB01」ピンを「UIF_PB0」という名前で「Function: GPIO_mode」…

2つ目は「PB03」ピンを「UIF_PB1」という名前で「Function: GPIO_mode」…

とそれぞれ設定すれば良いのですが、異なるのはコンポーネントの部分だけです。

LEDのときは「Simple LED」というコンポーネントでしたが、今回は「Simple Button」というコンポーネントを使います。

以下の通り、コンポーネントを検索するキーワードは「button」とでも入力すれば良いでしょう。

Simplicity Studio - 23


最後にシリアル通信の設定です。

上記の回路図では、5つのピンを使用することが分かります。

面倒くさいのですが、まずは「PA08」ピンを「VCOM_TX」という名前で「Function: USART0_TX」として設定していきます。

基本、今までと同様に作業していきますが、今回のコンポーネントは「UARTDRV USART」です。

検索キーワードは「uart」が良いでしょう。

Simplicity Studio - 24


今回は「vcom」という名前でインスタンスが作成されるようです。

Done」ボタンをクリックします。

Simplicity Studio - 25


メインタブを「empty.pintool」に切り替え「Custom Pin Name:」のテキストボックスに「PA08」の信号名「VCOM_TX」を入力し「APPLY AND CLOSE」ボタンをクリックします。

Simplicity Studio - 26


さて、残りのピンも設定しないと…と思ってピンの設定一覧表を見てみると…。

なんと!残りのピンのインスタンスも設定されているではないですか!?

どうやら、シリアル通信のような複数のピンを使用するコンポーネントを設定する場合、その中の一つでも設定された時点で残りのピンの設定も自動的に行われる仕組みのようです。

便利~。

ただし、ピンの名前「Custom Pin Name:」だけは空欄のままですので「VCOM_RX」、「VCOM_CTS」…などと、手動で入力してあげましょう。


最終的に、各ピンが以下のように設定できていればOKです。

(この表は各項目でソート可能で、以下は「Custom Pin Name」でソートした例。)

同時に左側のマイコンの絵のピンにも、設定内容が反映されていますね!

Simplicity Studio - 27


最後に「Simplicity Studio」の上部に配置されている「保存」ボタンをクリックして「empty.pintool」を保存しましょう。

面倒くさい作業だったので、設定が失われたら大変だ…。

Simplicity Studio - 28


ここまで、意外と手数が必要でしたね…。

他のマイコンメーカーのツールと比べて、ちょっと変わった操作感で戸惑うところはありましたが、慣れの問題でしょうね。

さて、これでいよいよコーディング作業に移ることができます。

長くなっちゃうので、次回…。


<続く>

Simplicity Studioを使ってみた! その3

前回からの続き です。 このテーマを最初からご覧になる場合は こちら からどうぞ。 「Simplicity Studio」でプログラミング インストールしたSilicon Labs社のマイコン用の統合開発環境「 Simplicity Studio 」で、テストプログラムを動かして...