STM32CubeMX とPlatformIOでSTM32開発環境構築（NUCLEO-L432KCでLチカ） 

# はじめに
Windows 10で、STM32CubeMXとPlatformIO（VSCode）を使って開発環境を構築します。

今までSTM32CubeMX＋STM32CubeIDEで開発していましたが、PlatformIO（VSCode）でも同等の環境が構築できたと思います。
STM32の開発ではフレームワークとしてArduinoやMbedなども選べますが、消費電力を限界まで詰めたいようなケースではSTM32CubeMXでHALを使うのが便利かなと思っています。ArduinoやMbedと比べると情報が少なく、2020年6月現在日本語情報がほとんど見つからないので、[PlatformIOのドキュメント](https://docs.platformio.org/en/latest/index.html)を参考に環境構築した手順をまとめます。

# STM32CubeMXのインストール
これは既にいろいろな情報がありますので詳細は省きます。
STM32CubeMX 5.6.1で動作を確認しました。
https://www.st.com/ja/development-tools/stm32cubemx.html
ダウンロード時にメール登録とVaridationが必要なのが少し面倒。
### 注意点１：インストールパス
デフォルトではc:\Program Files (x86)\STMicroelectronics\STM32Cube\STM32CubeMXにインストールされますが、後述するstm32pioがなぜかc:\Program Files\STMicroelectronics\STM32Cube\STM32CubeMXへのインストールを前提に設定されています（しかもなぜか設定ファイルを書き換えても反映されない）。
今の所回避策がわからないので、STM32CubeMXのインストール時に以下のようにパスを設定します。
![STM32CubeMX Installation Wizard  2020_06_21 12_34_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/0770d7d1-f7a4-9a01-d7a0-2a35f2e92db7.png)
### 注意点２：JREのインストール
インストール時にJRE 8が要求されますが、誘導されたページからそのままインストールすると32bit版がインストールされました。でもSTM32CubeMXを起動すると「JRE 8は32bit版ではなく64bit版を推奨します」と毎回しつこくメッセージが表示されます。（一応、無視して進めても今の所問題は起きてません・・・）
### 注意点３：MCU Packagesのインストール
Help→Manage embedded software packagesからSTM32L4用のパッケージをインストールします。
![STM32CubeMX Untitled 2020_06_21 12_42_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/aa496b25-a594-f4ab-1c85-6766b56aa498.png)
記事投稿時の最新版はSTM32Cube_FW_L4_V1.15.1ですが、最初に試したときV1.15.1をインストールしようとしたらエラーが出ました。再度別環境で試したときはすんなり入ったので原因はよくわかりません。最初V1.14.0を入れてからV1.15.0とV1.15.1を入れようとしたのが良くなかったのかもしれません。
エラーが出たときは以下の対処法で回避しました。

- V1.14.0→素直にSTM32CubeMXで上の画面のInstall Nowからインストールできた。
- V1.15.0→[STMicroのWebサイト](https://www.st.com/en/embedded-software/stm32cubel4.html)から直接Zipダウンロードして、上の画面のFrom local...でインストールできた。
- V1.15.1→From local...でもエラーが出たので、ダウンロードしたzipを解凍してフォルダをSTM32Cube_FW_L4_V1.15.1にリネームし、C:\Users\（ユーザー名）\STM32Cube\Repository以下においたら認識された。意味がわからない。

# STM32CubeMXでNUCLEO-L432KC用のプロジェクトを作る
他のボードやMCUでも手順は同じはずです。

1. ACCESS TO BOARD SELECTORを選んで
![STM32CubeMX Untitled 2020_06_21 12_43_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/4d368a06-b528-4e5d-2350-8bcb04896a10.png)
2. NUCLEO-L432KCを検索、ダブルクリック
![STM32CubeMX Untitled 2020_06_21 12_43_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/c5368de4-34d9-368a-f979-07d361098579.png)
3. とりあえずNUCLEOボードに合わせたデフォルトペリフェラル設定を使います（Yes）
![STM32CubeMX Untitled 2020_06_21 12_44_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/1f63a3c1-1308-3e24-7c67-ebb4fe832932.png)
4. ピンとペリフェラルの設定（今回はデフォルトのまま使います）
![STM32CubeMX Untitled 2020_06_21 12_44_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/a3158a20-b8de-ef78-f076-3748a39a93bf.png)
5. Clock Configurationもデフォルトのまま
![STM32CubeMX Untitled 2020_06_21 12_44_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/854b6a19-485b-c4fc-53d0-278b061da94f.png)

6. Project Managerで、プロジェクト名とパスを指定
★ Toolchain / IDEで「Other Toolchains (GPD)」を選択します。
★ プロジェクトのパスに日本語が含まれていると、後でstm32pioがエラーを出したので避ける。もしかしたら半角スペースも怪しい。
![STM32CubeMX Untitled 2020_06_21 12_48_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/b9c53b51-2722-a69a-754c-ff8d3de62b76.png)
7. 左側のCode Generationをクリック、以下のように設定
★ Copy only the necessary library files
★ Generate peripheral initialization as a pair of ~~~
![STM32CubeMX Untitled 2020_06_21 12_48_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/79190711-b5da-f8f9-ed06-9b5cb7767b6b.png)
8. Toolsはそのまま、File→Save Projectで保存
![STM32CubeMX Untitled 2020_06_21 12_49_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/8819efa7-ebbc-5dba-e862-15e263e74583.png)
9. 右上のGENERATE CODEをクリック
![STM32CubeMX Untitled 2020_06_21 12_50_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/d142b783-3d7f-853c-ea98-625355842110.png)
10. 成功するとプロジェクトフォルダは以下のようになる
![piotest 2020_06_21 12_50_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/d913221f-03a4-13c8-2a00-2bc729f827fd.png)

# Python、VSCode、PlatformIOのインストール
これもたくさん情報があるので詳細は省きます。以下のバージョンで確認しています。
・Python 3.7（Anaconda）
・Visual Studio Code 1.46.1
・PlatformIO 1.10.0
（VSCodeの拡張はPlatformIOとBracket Pair Colorizer 2とindent-rainbowとPythonを入れています。）

#stm32pioのインストールとSTM32CubeMXが生成したプロジェクトの変換
STM32CubeMXで作ったプロジェクトをPlatformIO用に変換します。現状、以下の説明の通りstm32pioという変換ツールをかませる必要があります。
https://docs.platformio.org/en/latest/frameworks/stm32cube.html#using-with-stm32cubemx
> At the moment there is no seamless integration with projects generated by STM32CubeMX tool. Instead, a small cross-platform Python application called stm32pio can be used to create and update PlatformIO projects from STM32CubeMX .ioc files. It uses STM32CubeMX to generate a HAL-framework-based code and alongside creates PlatformIO project with compatible parameters to stick them both together.

https://github.com/ussserrr/stm32pio
この説明に従いインストールします。

まず`pip install stm32pio`でインストールします。Anaconda Powershell Promptを使っています。
![Anaconda Powershell Prompt (anaconda3) 2020_06_21 13_01_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/ac7b6bf6-7b23-e220-91e5-4318b1d32b97.png)

stm32pio.exeにパスが通っていることを確認し、適当なフォルダで以下を実行します。これはSTM32CubeMXが生成したプロジェクト（-dで指定したディレクトリ）をPlatformIO用に変換しているので、その場所がPlatformIOでそのまま使われます。

```
stm32pio new -d c:\work\stm\piotest\ -b nucleo_l432kc --start-editor=code --with-build
```
c:\work\stm\piotest\はSTM32CubeMXで作ったプロジェクトのフォルダ（.iocがあるところ）を指定します。

ここで注意すべき点が２つあり、
1. platformio.exeにパスが通っている必要があります。
2. STM32CubeMXのインストールパスに関する問題があります。
詳細は後述しますが、これらの問題を解決してstm32pioを実行し、成功すると以下のようになります。
![Anaconda Powershell Prompt (anaconda3) 2020_06_21 13_12_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/9e0c3d5e-9389-d6f4-e0fa-807ca3f0cc18.png)
初回は足りないパッケージをインストールするので時間がかかる。

成功するとVSCodeが勝手に立ち上がり、変換したプロジェクトをワークスペースに取り込んだ状態でPIO Homeが表示されます。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_12_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/740f8517-7e9e-a6f1-d806-e90a66422696.png)

### 注意点１：platformio.exeのパスを環境変数に設定　
stm32pioはplatformio.exeを呼び出します。
デフォルトではPATHが設定されていないので、`C:\Users\（ユーザー名）\.platformio\penv\Scripts`を環境変数PATHに追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/1da69656-6b1e-9c4c-39fa-a2d15ec9b038.png" width=50%>

### 注意点２：STM32CubeMXのインストールパスに関する問題　
stm32pioはSTM32CubeMXを呼び出します。STM32CubeMXのインストールにも書きましたが、Program Files (x86)以下にSTM32CubeMXがインストールされていると動かない（stm32pioはSTM32CubeMXがProgram Files以下にインストールされてると思っている）という意味不明な問題があります。`C:\ProgramData\Anaconda3\Lib\site-packages\stm32pio\settings.py`を書き換えたら反映されそうなのですが、なぜか回避できませんでした。要調査。

# Lチカ（Build, Upload, Debugger）
Src/gpio.cを確認し、LEDのピンが定義されていることを確認します。NUCLEO-L432KCの場合はLD3ピンです。当然ボードごとに異なります。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_18_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/0a831390-99ad-2336-9b7d-b84b6b348b76.png)

Src/main.cのwhileループにLEDをトグルさせるコードを書きます。

```c:main.c
    HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
    HAL_Delay(500);//ms
```

ちゃんとコード補完される。素晴らしい。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_19_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/a396f917-7236-41d6-91e2-6b5f482ef0f5.png)

完成。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_20_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/57d5a31b-9a72-7967-2428-1d94fe3b5afc.png)

左側のタブからPlatformIOを選択し、正しくプロジェクトが認識されていれば以下のようにPROJECT TASKSが表示される。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_20_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/ed067edc-1095-b83a-8c74-07e8387a02e4.png)

まずBuildをクリック。SUCCESS。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_20_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/be618ca7-364a-4083-666b-2aaa1cc87572.png)

次にUploadをクリック。。。エラーが出た。
![PIO Home - piotest - Visual Studio Code 2020_06_21 13_22_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/43e3bc89-2052-5dd2-e4e9-6aebc64e7ab1.png)

ST-LINKのドライバが入ってないからでした。
![デバイス マネージャー 2020_06_21 14_51_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/3a9e2183-9695-9d51-f419-8c30cbf85305.png)

USBドライバをダウンロード。解凍してdpinst_amd64.exeでインストール。
![ST-LINK_V2 - ST-LINK_V2 in-circuit debugger_programmer for STM8 and STM32 - STMicroelectronics - Mozilla Firefox 2020_06_21 14_53_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/c6683a48-ee3c-3ee1-de9b-e5e635c01946.png)

認識された。
![デバイス マネージャー 2020_06_21 14_55_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/7393f8dc-2e9e-b949-ca17-5b8471187fdb.png)

再度Upload。SUCCESS。
![PIO Home - piotest - Visual Studio Code 2020_06_21 14_55_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/9806a122-e949-62a1-98d5-429ae19a9596.png)
この時点でLEDが光る。はず。

最後にデバッガを使ってみる。
main.cのHAL_Delayにブレークポイントをつけて、PLATFORMIOのタブからQUICK ACCESS→Debug→Start Debugging
![PIO Home - piotest - Visual Studio Code 2020_06_21 14_58_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/c1bef02e-7f57-d74e-9be8-180ce66e32ac.png)

最初はHAL_Initで停止する？みたい。▷Continue(F5)
![PIO Home - piotest - Visual Studio Code 2020_06_21 14_58_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/ac783875-86db-c48a-2a58-0ac36255866c.png)

▷Continue(F5)するとブレークポイントまで進んで停止した。
![PIO Home - piotest - Visual Studio Code 2020_06_21 14_58_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/23486694-ef83-482e-a0bf-1d6115b706fa.png)

▷Continue(F5)するたびにLEDがON/OFFしていれば成功。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/782bdba5-486f-f88b-f7bc-5902288fed32.jpeg" width=45%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263098/e2e5b06d-6bf5-d585-b3d3-ccff199f14a9.jpeg" width=45%>
# さいごに
デバッガまでたどり着きました。
これからADCやSPIを試してみたいと思いますが、今の所問題なくSTM32CubeIDEから移行できそう。よかったよかった。