STマイクロエレクトロニクスリファレンスボードでFreeRTOSを動かしてみた | 技術コラム
ネクスティ エレクトロニクスの開発部隊による技術コラムになります。
当社取り扱い商材を活⽤したリファレンスボードを使ったソフトウェア開発の内容を発信します。
今回は当社で開発したSTマイクロエレクトロニクスリファレンスボード(以下、ST版リファレンスボード)を使⽤して、FreeRTOS搭載の簡単なマルチタスクソフトウェアを作成していきます。
概要
-
STマイクロエレクトロニクス製MCUは、同社が頒布している初期化コード⽣成ツール「STM32CubeMX」を使⽤することで、GUIでペリフェラルやミドルウェアの設定を簡単に⾏うことができます。
FreeRTOSは主に組込みシステム⽤のリアルタイムOSで、MITライセンスのオープンソースなため、商⽤・⾮商⽤でも無償で使⽤することができます。
本記事ではST版リファレンスボードに搭載されている4つのLEDを異なるタスクで動かすソフトウェアを作成します。 各LEDは以下のように点滅させます。
-
LED名 | トグル間隔 | タスク名 |
---|---|---|
LD1 | 500msec | defaultTask |
LD2 | 100msec | myTask2 |
LD3 | 1000msec | myTask3 |
LD4 | 2000msec | myTask4 |
必要なもの
-
今回紹介するソフトウェア開発で必要となるハードウェア、ソフトウェアと使⽤しているバージョンを以下に挙げます。
名前 | 用途 | 備考 | 画像 |
---|---|---|---|
ST版 リファレンス ボード |
使用ボード | 携帯MCU: ボード STM32H753XIH6 |
![]() |
i-jet | ファームウェア 書き込み用デバッガ |
Ver: B | |
STM32CubeMX | 初期化コード生成 ツール |
Ver: 6.12.1 | |
IAR EW for Arm | IDE | Ver: 9.30.1 |
STM32CubeMXでの操作
STM32CubeMXを使⽤してピン設定とFreeRTOSの設定をしていきます。
-
1.MCU選択
STM32CubeMXを起動すると、以下のような画⾯が表⽰されるので、「ACCESS TO MCU SELECTOR」をクリックします。
以下のような画⾯が表⽰されるので、「Commercial Part Number」にST版リファレンスボードに搭載されているMCU名「STM32H753XIH6」を⼊⼒します。すると右下部分のMCU候補が2つに絞られます。
表⽰された2つの候補の「STM32H753XIH6」の⽅をクリックして選択し、右上の「Start Project」ボタンをクリックします。
今回のソフトウェアではMPU(メモリ保護ユニット)を使⽤しないため、以下のようなメッセージボックスが表⽰される場合は、「Yes」をクリックします。
-
-
2.ピン設定
今回のハンズオンでは、ST版リファレンスボード上に実装されている4つのLEDを使⽤するので、これらを使⽤するためのピン設定をしていきましょう。
4つのLEDのピンは以下になります。端⼦名 Port LD1 PK3 LD2 PK4 LD3 PK5 LD4 PK6 STM32CubeMXのPinout & Configurationタブが表⽰されているので、右下の検索テキストボックスに 「PK3」と⼊⼒します。するとテキストボックスの上の図でのPK3に対応するピンが点滅します。
点滅したピンをクリックすると、以下の図ようにプルダウンメニューが表⽰されるので、「GPIO_Output」をクリックし、GPIO出⼒設定にします。
PK4, PK5, PK6も同様に設定します。
-
-
3.FreeRTOSの追加・設定
続いて、FreeRTOSを追加・設定していきます。
STM32CubeMXの左側のペインの「Middleware and Software Packs」をクリックし、その中の「FREERTOS」をクリックします。
すると、「FREERTOS Mode and Configuration」というペインが表⽰されます。今回はCMSIS V2インタフェースを使⽤しますので、Interfaceのプルダウンメニューをクリックし、「CMSIS_V2」を選択します。
4.タスクの追加
STM32CubeMXでは、FreeRTOSのタスク設定をGUIで⾏うことができます。今回はLED4つに対してそれぞれタスクを作成します。
STM32CubeMXの真ん中下のConfigurationペインのTasks and
Queuesタブをクリックします。
Tasksリストにはデフォルトで「defaultTask」というタスクのみがあるので、さらに3つのタスクを作成していきましょう。各タスクの設定(優先度、スタックサイズ等)は全てデフォルト値とします。
Tasksリストの下のAddボタンをクリックします。
NewTaskウィンドウが表⽰され、OKボタンをクリックすると、Tasksリストに「myTask02」が追加されます。ここで、Entry Functionの値(StartTask02)がタスク関数名となります。
同様に「myTask03」、「myTask04」を追加します。
5.タイマー設定
FreeRTOSではSystick以外のタイムベースの使⽤を推奨しているため、今回はTIM6を使⽤することにします。 STM32CubeMXの左側のペインの「System Core」をクリックし、その中の「SYS」をクリック、中央上部の ペインのプルダウンメニューをクリックし、「TIM6」を選択します。
6.プロジェクトの設定、コード⽣成
続いてIDEで使⽤するプロジェクトの設定を⾏います。
STM32CubeMXの「Project Manager」タブをクリックし、Project
Nameに作成するプロジェクト名を、Project
Locationにプロジェクトを作成するディレクトリを⼊⼒します。ここでは、プロジェクト名を「st_pfp_rtos_sample」、Project
Locationを「C:\work\HMI_platform\st_board\rtos_for_blog」としています。今回はIDEとしてEWARMを使⽤するので、Toolchain
/ IDEをEWARMに設定します。その他項⽬はデフォルト値でOKです。 右上のGENERATE
CODEボタンをクリックすると、IDEのプロジェクトファイルとコードが⽣成されます。
IDE(EWARM)での操作
STM32CubeMXで⽣成したプロジェクトファイル、コードをIDE(EWARM)で操作します。
-
1.EWARMでプロジェクトを開く
STM32CubeMXのProject Managerタブで設定したディレクトリのEWARMフォルダを開き、その中のファイル「Project.eww」をダブルクリックします。 今回使⽤しているEWARMのバージョン9.30では、以下のメッセージウィンドウが表⽰されますので、「Yes」ボタンをクリックします。
-
-
2.タスク関数のコーディング
STM32CubeMXで⽣成したコードのタスク関数にLEDを点滅させる処理を追加していきます。 EWARMのワークスペースから、「main.c」をダブルクリックし、main.cを開きます。
main.cには、STM32CubeMXで設定したタスクの空関数(StartDefaultTask, StartTask2, StartTask3, StartTask4)があるので、各関数の無限ループ内に以下のようにLEDをトグルし、指定したミリ秒ウェイトする処理を追加します。
/* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN 5 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_3); osDelay(500); } /* USER CODE END 5 */ } /* USER CODE BEGIN Header_StartTask02 */ /** * @brief Function implementing the myTask02 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask02 */ void StartTask02(void *argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_4); osDelay(100); } /* USER CODE END StartTask02 */ } /* USER CODE BEGIN Header_StartTask03 */ /** * @brief Function implementing the myTask03 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask03 */ void StartTask03(void *argument) { /* USER CODE BEGIN StartTask03 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_5); osDelay(1000); } /* USER CODE END StartTask03 */ } /* USER CODE BEGIN Header_StartTask04 */ /** * @brief Function implementing the myTask04 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask04 */ void StartTask04(void *argument) { /* USER CODE BEGIN StartTask04 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOK, GPIO_PIN_6); osDelay(2000); } /* USER CODE END StartTask04 */ }
-
-
3.デバッガの設定
ファームウェア書き込み⽤のデバッガを設定します。
EWARMの「ワークスペース」ペインの「st_pfp_rtos_sample-st_pfp_rtos_sample」を右クリックし、プルダウンメニューの「オプション」をクリックします。オプションウィンドウのカテゴリ「デバッガ」をクリックし、「設定」タブの「ドライバ」のプルダウンメニューで「I-jet」を選択します。
オプションウィンドウのカテゴリ「I-jet」をクリックし、「インタフェース」タブの「インタフェース」ラジオボタンで「SWD」を選択し、「OK」ボタンをクリックします
-
-
4.ビルド、書き込み
ファームウェアのビルドを実⾏し、MCUに書き込みます。
ST版リファレンスボードとI-jetをSWD端⼦で接続し、PCとI-jetをUSBで接続します。
EWARMの「ダウンロードしてデバッグ」ボタンをクリックし、ファームウェアのビルドと書き込み、デバッガを起動します。エラーが無ければデバッガが起動します。EWARMのデバッガメニューの「実⾏」ボタンをクリックし、プログラムを実⾏させます。
すると、ST版リファレンスボード上の4つのLEDがそれぞれ異なるタイミングで点滅することが確認できます。
-
おわりに
-
今回の記事ではST版リファレンスボードで動作するFreeRTOSを使⽤した簡単なマルチタスクのプログラムを作成しました。
STM32CubeMXを使⽤することにより、FreeRTOSのタスクの設定までGUI上で⾏えることがわかりました。
今後はFreeRTOSのキューやセマフォ等を使⽤したタスク間同期を⾏うプログラムを紹介していく予定です。
また、ネクスティ エレクトロニクスの開発部隊では、取り扱い商材を活⽤した⾃社開発、受託開発(ハードウェア、ソフトウェア開発)なども実施しております。
お客さまの困りごとの解決も含め寄り添って対応しますので、お気軽にお問合せください。