はじめに
Windows 10で、STM32CubeMXとPlatformIO(VSCode)を使って開発環境を構築します。
今までSTM32CubeMX+STM32CubeIDEで開発していましたが、PlatformIO(VSCode)でも同等の環境が構築できたと思います。
STM32の開発ではフレームワークとしてArduinoやMbedなども選べますが、消費電力を限界まで詰めたいようなケースではSTM32CubeMXでHALを使うのが便利かなと思っています。ArduinoやMbedと比べると情報が少なく、2020年6月現在日本語情報がほとんど見つからないので、PlatformIOのドキュメントを参考に環境構築した手順をまとめます。
STM32CubeMXのインストール
これは既にいろいろな情報がありますので詳細は省きます。
STM32CubeMX 5.6.1で動作を確認しました。
https://www.st.com/ja/development-tools/stm32cubemx.html
ダウンロード時にメール登録とVaridationが必要なのが少し面倒。
注意点1:インストールパス
デフォルトではc:\Program Files (x86)\STMicroelectronics\STM32Cube\STM32CubeMXにインストールされますが、後述するstm32pioがなぜかc:\Program Files\STMicroelectronics\STM32Cube\STM32CubeMXへのインストールを前提に設定されています(しかもなぜか設定ファイルを書き換えても反映されない)。
今の所回避策がわからないので、STM32CubeMXのインストール時に以下のようにパスを設定します。
注意点2:JREのインストール
インストール時にJRE 8が要求されますが、誘導されたページからそのままインストールすると32bit版がインストールされました。でもSTM32CubeMXを起動すると「JRE 8は32bit版ではなく64bit版を推奨します」と毎回しつこくメッセージが表示されます。(一応、無視して進めても今の所問題は起きてません・・・)
注意点3:MCU Packagesのインストール
Help→Manage embedded software packagesからSTM32L4用のパッケージをインストールします。
記事投稿時の最新版は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サイトから直接Zipダウンロードして、上の画面のFrom local...でインストールできた。
- V1.15.1→From local...でもエラーが出たので、ダウンロードしたzipを解凍してフォルダをSTM32Cube_FW_L4_V1.15.1にリネームし、C:\Users\(ユーザー名)\STM32Cube\Repository以下においたら認識された。意味がわからない。
STM32CubeMXでNUCLEO-L432KC用のプロジェクトを作る
他のボードやMCUでも手順は同じはずです。
-
Project Managerで、プロジェクト名とパスを指定
★ Toolchain / IDEで「Other Toolchains (GPD)」を選択します。
★ プロジェクトのパスに日本語が含まれていると、後でstm32pioがエラーを出したので避ける。もしかしたら半角スペースも怪しい。
-
左側のCode Generationをクリック、以下のように設定
★ Copy only the necessary library files
★ Generate peripheral initialization as a pair of ~~~
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を使っています。
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があるところ)を指定します。
ここで注意すべき点が2つあり、
- platformio.exeにパスが通っている必要があります。
- STM32CubeMXのインストールパスに関する問題があります。
詳細は後述しますが、これらの問題を解決してstm32pioを実行し、成功すると以下のようになります。
初回は足りないパッケージをインストールするので時間がかかる。
成功するとVSCodeが勝手に立ち上がり、変換したプロジェクトをワークスペースに取り込んだ状態でPIO Homeが表示されます。
注意点1:platformio.exeのパスを環境変数に設定
stm32pioはplatformio.exeを呼び出します。
デフォルトではPATHが設定されていないので、C:\Users\(ユーザー名)\.platformio\penv\Scripts
を環境変数PATHに追加します。
注意点2: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ピンです。当然ボードごとに異なります。
Src/main.cのwhileループにLEDをトグルさせるコードを書きます。
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
HAL_Delay(500);//ms
左側のタブからPlatformIOを選択し、正しくプロジェクトが認識されていれば以下のようにPROJECT TASKSが表示される。
USBドライバをダウンロード。解凍してdpinst_amd64.exeでインストール。
再度Upload。SUCCESS。
この時点でLEDが光る。はず。
最後にデバッガを使ってみる。
main.cのHAL_Delayにブレークポイントをつけて、PLATFORMIOのタブからQUICK ACCESS→Debug→Start Debugging
最初はHAL_Initで停止する?みたい。▷Continue(F5)
▷Continue(F5)するとブレークポイントまで進んで停止した。
▷Continue(F5)するたびにLEDがON/OFFしていれば成功。
さいごに
デバッガまでたどり着きました。
これからADCやSPIを試してみたいと思いますが、今の所問題なくSTM32CubeIDEから移行できそう。よかったよかった。