【チュートリアル】mruby/cをSTM32マイコンで動かす Chapter01: 環境構築

[しまねソフト研究開発センター](https://www.s-itoc.jp)（略称 ITOC）にいます、東です。

本レポートでは、STマイクロエレクトロニクス社製の32bitマイコン「STM32」シリーズに、mruby/c をポーティングする手順を説明します。
今回はその第1回、事前準備としての環境構築を行います。

記事は、複数回に分けて以下の順で進めていきます。
1. Chapter01: 環境構築（今回）
2. [Chapter02: mruby/cでElChika（えるちか）](https://qiita.com/HirohitoHigashi/items/10f9088f32742edf7cd6)
3. [Chapter03: ハードウェアタイマーの使用](https://qiita.com/HirohitoHigashi/items/1b781a6b1ebfaa0e59a3)
4. [Chapter04: halの仕上げ](https://qiita.com/HirohitoHigashi/items/4e29539416d3c8df332b)
5. [Chapter05: GPIOの拡張と、複数プログラムの動作](https://qiita.com/HirohitoHigashi/items/63a863c7879748d7fdc8)


# 全体方針

* ST社製の無償開発環境(STM32CubeIDE) を使う
* コンパイラは、上記付属のgccを使う
* ペリフェラルのコントロールに、ST社純正HALライブラリを使う
* mruby/c のプログラムは、C言語のバイト列へ変換（コンパイル）し、STM32CubeIDE 上でリンクする方式とする

mruby/c プログラムを動作させるやり方はいくつかありますが、今回はmruby/cのバイトコード（中間コード）をC言語の配列へ出力し、他のC言語ファイルとともにリンクする方法を採用します。
なお、記載するキャプチャ画面および手順は、Windows 版をもとにしています。


# 今回の目標

STM32CubeIDEの環境構築を終わらせ、ST社製マイコン評価ボード 「Nucleo-F401RE」 の、オンボードLEDを使って、C言語レベルでLED点滅をさせる。


# 準備するもの

* STM32マイコン評価ボード Nucleo-F401RE
(https://www.st.com/ja/evaluation-tools/nucleo-f401re.html)
* 開発環境　STM32CubeIDE
(https://www.st.com/ja/development-tools/stm32cubeide.html)

STM32CubeIDEは、現時点(2024/05)での最新版、ver 1.15.1　で説明します。

# 作業手順

## インストール

開発環境 STM32CubeIDE をダウンロードし、インストーラのデフォルト値通りでインストールします。

## STM32CubeIDE 初期設定

STM32CubeIDE を起動します。
最初の起動時には、ワークスペースの保存ディレクトリの確認ダイアログが表示されますので、任意のわかりやすいディレクトリを指定します。
![STM32Tuto01-IDE1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/92ba5da8-1374-8d35-f2aa-6037b51388a3.png)

メニューから myST > Login を選び、ST社に登録したIDでログインします。
ログインIDを持っていない方は、ここから登録できます。

![STM32Tuto01-スクリーンショット 2024-05-17 11.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/bce87d10-cd54-107f-9d8e-5e3d2433c630.png)


## STM32CubeIDE プロジェクトの作成

メニューから、File > New > STM32 Project を選び、新規プロジェクトを作ります。
この時、マイコンの型番にあったライブラリを自動的にダウンロードするため、インターネットに接続されている必要があります。
![STM32Tuto01-スクリーンショット 2024-05-17 11.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/7726c80b-451c-a339-ef61-70a70e974744.png)

表示された STM32 Project ダイアログの、[Board Selector] タブをクリックして画面を切り替えてから、Commercial Part Number 欄に F401RE と入力して検索します。
右下に NUCLEO-F401RE ボードが表示されるので、一度クリックして選択された状態で [Next>] ボタンをクリックします。

![STM32Tuto01-スクリーンショット 2024-05-17 11.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/dea53c20-782f-d0d4-c04a-3ebf2b5fcecb.png)

次のダイアログで、任意のプロジェクト名をつけ、その他はデフォルト値のまま [Finish] をクリックします。
プロジェクト名には英数字のみを使い、スペース文字や漢字を使わないようにします。

![STM32Tuto01-スクリーンショット 2024-05-17 11.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/cc929233-acd4-f87a-1253-d3cb71f6bf1e.png)

次のダイアログで、ペリフェラルをデフォルト値で初期化するか聞かれますので、[Yes] をクリックします。

![STM32Tuto01-スクリーンショット 2024-05-17 11.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/5bcc1624-b6c6-5916-790c-26607dfb2266.png)

次のダイアログで、パースペクティブ（画面表示）を、切り替えるかを聞かれますので、[Yes] をクリックします。この後も、何度かパースペクティブを変更して良いか聞かれますが、都度 [Yes]をクリックします。

![STM32Tuto01-スクリーンショット 2024-05-17 11.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/d85b8b24-a031-14b8-4d64-94c9cf53dd1f.png)


最初は、ここでかなりの量のライブラリをダウンロードしますので、しばらく時間がかかります。また、ライブラリ使用ライセンスに同意するか聞かれる場合がありますので、同意するよう操作します。

これで初期化コード（C言語）が自動生成され、準備が整いました。


## ピンアサインの確認

LEDが接続されているピンを確認します。画面上、LD2[GreenLED] と表示されているピンを見ると、PA5 であることが分かります。
もうひとつ、青色のプッシュスイッチは、B1[Blue PushButton] と表示されているピンを確認し、PC13であることが分かります。

![STM32Tuto01-スクリーンショット 2024-05-17 12.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/a972cfc8-bfa6-38c1-fd0c-19bb2c5a27c8.png)


## ここまでの作業が正しいか、C言語で確認

一旦ここまでの作業が正しくできているか、ビルドして確認します。
左ペイン Project Explorer の画面から、Core > Src とたどり、main.c をダブルクリックして開きます。
![STM32Tuto01-スクリーンショット 2024-05-17 17.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504019/70ef3010-cc5f-3134-302c-153dc348438c.png)

右ペインに表示された C言語ソースコードから、`/* USER CODE BEGIN 2 */` の箇所を探し、その下に以下のコードを追記します。

```c:Core/Src/main.c
  /* USER CODE BEGIN 2 */
  while( 1 ) {
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
	HAL_Delay(500);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_Delay(500);	
  }
```

ST製 HAL ライブラリを使って、GPIOの制御と時間待ちを行っています。
HALの説明は、ST製ユーザーマニュアル UM1725 を参照してください。


### ビルド
メニューから、Project > Build Project を選びます。
下部コンソールペインに、`Build Finished. 0 errors, 0 warnings. ` と表示されるのを確認します。

### 書き込み
デバイスをUSBポートへ接続します。
メニューから、Run > Run を選びます。もしくは、Run > Run As > 1 STM32 C/C++ Application を選びます。
Edit Configuration ダイアログが表示される場合がありますが、そのまま [OK] をクリックします。

デバイス上のオンボードLED `LD2` が点滅するのを確認します。


# 終わりに

ファイル全体は、github リポジトリにありますので、そちらをご覧ください。

https://github.com/HirohitoHigashi/mrubyc-tuto-stm32/tree/chapter01

今回は、チップメーカー製のツールを使って、STM32マイコンの開発環境構築を行いました。
次回は、この環境を使って mruby/c のポーティングを行います。