PlatformIO を使う(2025年版)
IoTPlatformIO
2025-1-9 16:05 JST

Nucleo STM32L4R5ZI と B-L475E-IOT01A を購入したので、PlatformIO で使ってみます。

venv(python3) 環境を作る

まずは python の venv から。

$ python3 -m venv pio
$ cd pio
$ mkdir Work
$ source bin/activate
(pio) arendt:pio$ cd Work
(pio) arendt:Work$ 

2021 年との大きな違いは自分の環境が今更ながら、tcsh から bash に変わったことかな。

PlatformIO をインストール

次に pip で PlatformIO をインストール。

(pio) arendt:Work$ pip install platformio
(pio) arendt:Work$ pio --version
PlatformIO Core, version 6.1.16

コマンドは pio が使える。pio コマンドで対応するボードがあるか確かめてみましょう。

(pio) arendt:Work$ pio boards | grep l4[rs]
nucleo_l4r5zi       STM32L4R5ZIT6 120MHz 2MB 640KB     ST Nucleo L4R5ZI
disco_l4s5i_iot01a  STM32L4S5VIT6 80MHz  2MB 640KB     ST STM32L4+ Discovery kit IoT node

ボード固有の環境を作る

pio boardコマンドは変わっていなかったのですが、init などは大きく様がわりしました。

(pio) arendt:Work$ mkdir STM32L4R5ZI
(pio) arendt:Work$ cd STM32L4R5ZI
(pio) arendt:Work$ pio project init --board nucleo_l4r5zi

pio initpio project initに変わりました。

以下、src/test.ino を変更して upload するまで。test.ino は Arudino の簡単なプログラムなのでここではオミット。あと platformio.ini にupload_protocol = stlinkを追加してます。

(pio) arendt:Work$ vi src/test.ino
(pio) arendt:Work$ pio run
(pio) arendt:Work$ pio pkg update
(pio) arendt:Work$ curl -fsSL \\
     https://raw.githubusercontent.com/platformio/platformio-core/\\
develop/platformio/assets/system/99-platformio-udev.rules  \\
     | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
(pio) arendt:Work$ sudo systemctl restart udev
(pio) arendt:Work$ vi platform.ini
(pio) arendt:Work$ pio run -t upload

パッケージの追加

ついでにパッケージも追加。

(pio) arendt:Work$ pio pkg install --library "stm32duino/FatFs@^2.0.3"
(pio) arendt:Work$ pio pkg install --library "stm32duino/STM32duino STM32SD@^1.4.0"

本当は SDIO のテストをしたかったのですが、なぜか、STM32L4R5ZI の環境は SD カードしか HAL で対応していませんでした。LL レベルでは MMCSD という SDIO にも対応したライブラリが揃っているのですが。

ソースを読むと STM32U5xx_HAL_Driver では stm32u5xx_hal_sdio.cがあるのでそれをベースにつくれば SDIO 対応できそうでした。ソースを読んで CMD52 とか CMD53 とか出てきて、そういえばやったな、、、と少し思い出しました。

B-L475E-IOT01A はboard としてdisco_l4s5i_iot01aを指定します。結果として、どちらも Hello World までは簡単にできました。

CYW43439 と 43362

どちらも Infineon (昔は Cypress) のチップです。

ソースを読むと、SDIO でアクセスするときはファンクション1とファンクション2を有効にしてから、ファンクション1の Infineon 固有のレジスタにアクセスし、初期設定した後に、ファンクション2を通してパケットのやり取りをするみたいです。

802.11 はパケットのやりとりでアソシエーションを実行するのですね。なので、ドライバレベルでは細かい 802.11 のプロトコルを知っている必要がありません。

B-L475E-IOT01A は WiFi のモジュールとSPI 接続です(でした)。SDIO の CMD52, CMD53 相当の機能を実現するために、先頭の 32bit が特別な意味を持っています。

CYW43439 では Bluetooth がついているので SDIO を通してどうするのかと思ってソースを読んでいくと、ファンクション1 の CYW43439 固有のレジスタをアクセスすることでBluetooth のやりとりを実現していました。

この辺 Raspberry Pi PicoW も同じような仕組みなので、どっかで詳しく書きたいと思います。

リンク集