STM32CubeIDEで速攻FreeRTOS

タイトル通りで、2019年4月リリースのSTM32CubeIDEで、素早くFreeRTOSを動かしてみたよ！という記事です。

# 背景

いきなり本編を読みたい！って方は[こちら](#本編)からどうぞ

### ボード購入まで

ここ10年くらいRTOSに触れる機会が多かったので、造詣を深めたく、
**「評価用マイコンボードで色んなRTOSを動かしてみよう！」**
と思いついたのがきっかけでありました。

でもって、[Amazon FreeRTOS](https://aws.amazon.com/jp/freertos/) とやらが何となくトレンディ！に感じたので、対応ボード [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) を購入しました（7,000円でお釣りが来るくらい）。

### 高機能なボードだった

買った後に気付くのも残念なのですが、それはもう色んな機能がてんこ盛りなボードなのでした。
クラウドって何？AWSって？IoTって？的な私はかなりの戸惑いを覚えたわけですが、
**何はどうあれいったん動かす**
ことを目標としました。

### とりあえずAmazon FreeRTOSを動かす

ボードがまんま同じだったので、以下の [Yutaka Kato](https://mikan.github.io/) 様のサイトをまんま参考にさせていただき（ありがとうございます！）、
**AWS IoT画面にゴリゴリとHello Worldが届く**
ところまで確認しました。

https://mikan.github.io/2017/12/13/setup-amazon-freertos-on-stm32l4-discovery-kit-iot-node/

### 振り出しに戻る（戻す）

・・・どうやらAmazon FreeRTOSとやらはボードで動作しているようなのですが、
**RTOS使ってLEDをチカチカさす**
程度のことから始めたい私には、ものすごく仰々しかったのでした。泣

ということで、初心に帰りまして、本ボードに導入するRTOS（と開発環境）を選定することとしました。

### やっぱりFreeRTOSだった

TOPPERSやT-Kernel等も調べましたが、
**STMicroelectronics IDEで超簡単にFreeRTOSが動かせるらしい**
ということを知り、本記事を書くに至ったのでありました。

# 本編

## 1. 環境

- IDE: [STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)
@usashirou 様の以下の記事前半に、インストール方法は記載されています。感謝。
https://qiita.com/usashirou/items/65be086c28f7a6feac7d

- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A
STMicroelectronics製の他のボードでもOKかと。

## 2. やってみよう！

### 2-1. STM32プロジェクトを作る

STM32CubeIDEを起動し、以下のように辿ります（雑）。
![SnapCrab_STM32CubeIDE - STM32CubeIDE_2019-6-26_16-36-14_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/52e6466f-873e-174c-1c78-c1bdedb824b8.png)

「Target Selection」画面が表示されますので、「Board Selector」から自身のボードを選び、「Next」を押下します。
（私の場合は前述の「B-L475E-IOT01A」です）
![SnapCrab_Desktop_2019-7-1_8-21-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/df1bf777-946c-6f74-3207-a554a8ea02e6.png)

「Project Name」に「FreeRTOS」とでも入力して「Finish」押下。
![SnapCrab_STM32 Project_2019-7-1_8-24-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/929382d2-3f6e-13a7-b0aa-d8dfa57ed76f.png)

ダイアログが連発で出るので（雑）、「Yes」連打で、、、完成です！
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_13-11-45_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/3543c6a0-a0bb-c349-97dc-ba21d5bf3154.png)


### 2-2. FreeRTOS導入～タスク追加など

「Device Configuration Tool」（iocファイルが開いた状態）の左側、「Categories」から「Middleware」-「FREERTOS」をクリック。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_13-13-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/df5a5b17-4b15-a9d2-eab4-1d38a456c404.png)

一つ右側に「Mode」が出てくるので、ドロップダウンから「CMSYS_1」をクリック。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_8-47-11_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e541ff3c-d0e0-92d9-6be0-266c7390d607.png)

ここまででいったんFreeRTOSの導入は完了です。

#### 2-2-1. タスク追加

「Configuration」にわらわらとタブが出てきますが、鬱陶しいので「Pinout」を隠すなどしておきます（画面は省略します）。
その後、「Mode」の下、「Configuration」の「Tasks and Queues」を選び、「Add」をクリック。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_10-42-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/8df20abc-cf13-1687-c0f8-ae24650e1cf8.png)

タスク追加画面ですが、特に何も考えず「OK」をクリック。
![SnapCrab_New Task_2019-7-1_10-43-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/9a4186ab-a09b-52ed-b68f-613c45d06131.png)

無事、myTask02が追加されました（見にくいので、ペインを最大化しています）。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_10-44-30_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/4c96bef0-96e9-32ab-878c-727cd3e13b2c.png)

#### 2-2-2. 後処理

このままだとビルド時に怒られるので、Timebase Tickを変更します。
（ペインは最大化したままです）
「Categories」から「System Core」の「SYS」をクリック。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_11-9-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/65b5e1b6-d8f5-a2b9-c87f-557eee63f611.png)

「Timebase Source」を「SysTick」から変更します。私は「TIM17」にしておきました。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-1_11-16-24_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/8f8ac1c6-1e14-130b-4053-fec350cf6ab4.png)

#### 2-2-3. コード生成

Ctrl+Sで変更を保存します。
すると以下画面が出るので、「Yes」押下でコード生成してやります。
![SnapCrab_Question_2019-7-1_11-24-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/a8e800f0-1231-ddb6-c448-d93b6b55a479.png)

## 2-3. タスクでLEDを点滅させてみる

上記の通り作成した場合、main.cにタスク関数StartTask02()が生成されます。

そのループ内に以下のコードを追加します（B-L475E-IOT01Aの場合）。
見ての通り、500msecおきにLEDをトグルするだけです。

```C:
    HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
    osDelay(500);
```

一応画像は貼っておきます。
![SnapCrab_STM32CubeIDE - FreeRTOSSrcmainc - STM32CubeIDE_2019-7-1_11-55-13_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/026d83f6-cd0d-dc1a-f0af-f7106a73afe8.png)

## 2-4. いざ、ビルド！

「Project」-「Build All」またはCtrl+Bでビルドします。画面は省略。
エラーもワーニングもないことを確認してください。

`HH:MM:SS Build Finished. 0 errors, 0 warnings. (took 8s.485ms)`

## 2-5. いざ、実行！

**（まずは、PCとターゲットボードを接続してから、、、）**
「STM32 MCU C/C++ Application」として実行します。画像参照。
![SnapCrab_STM32CubeIDE - FreeRTOSSrcmainc - STM32CubeIDE_2019-7-1_11-57-14_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/46a5b8a2-ae43-030c-8d1d-44ea1f55daf5.png)

初回は、以下のような画面が出ますので、何も考えずに「OK」。
![SnapCrab_Edit Configuration_2019-7-1_12-54-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/ba3dc224-5c94-6094-fc43-5c75be1234ab.png)

先頭で停止するので、F8押下、もしくは画面のボタンをクリック。
![SnapCrab_STM32CubeIDE - FreeRTOSSrcmainc - STM32CubeIDE_2019-7-1_12-55-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/cb21482a-7a50-02d2-43bc-d27e72775bdb.png)

**これでLEDが点滅するはずです！**

# おわりに

ツールの使い方9割ですが、とても簡単にFreeRTOSが導入できるのは素晴らしいかと思います！

また、どのベンダも下回りは自動生成にしてきてるなーと思ったり。昔気質のエンジニアには抵抗がありそうですが・・・。

次回も(Free)RTOS周りの記事を書く予定です。