MicroPython的午睡(77) STM32版MicroPython、WSL2でビルド

Joseph Halfmoon

MicroPython、ソースからのビルド・シリーズも4回目。ラズパイPico用、Raspberry Pi 4用、SAMD21用とやってきて、今回はST Microelectronics社 STM32マイコン用です。ターゲットボードはNucleo F401RE。ビルド簡単、書き込み簡単。調子乗ってんじゃねえよ、自分。

※「MicroPython的午睡」投稿順 Indexはこちら

今回もクロス環境はWSL2使用

ラズパイPico用のクロスではRaspberry Pi 4を母艦にしましたが、前回SAMD21用(ターゲットボードは、Seeeduino Xiao、SAMD21G18マイコン搭載)からはWindows11上のWSL2(Ubuntu 20.04LTS)を使用しています。クロス環境のセットアップについては前回記事をご覧くだされや。

Pythonソースをバイトコードへコンパイルする mpy-cross については、SAM21だろうと STM32だろうと同じもので良いみたいなので、今回はmpy-cross作成後からの手順となります。

STM32の機種対応

micropython/ports/stm32/boards/ ディレクトリの中を調べたら60種以上のSTM32マイコン搭載ボードに対応していました。ある程度のメモリ容量を確保したボードには対応しているようです。その一部が以下に。STM32boards

設定ファイルを自力で用意すればここにリストされていないボードでもメモリが許せば対応可能と思われます(がやってません。)今回ターゲットにするのは歴戦のNucleo-F401REボードであります。

ビルド

ビルド手順はSAMD21のときと変わりません。まずは micropythonディレクトリ配下のstm32マイコンのディレクトリに入ります。Makefileはそこにあります。

cd ports/etm32

手順は2ステップ

    1. submodulesのビルド
    2. 本体MicroPythonのビルド

これまたSAMD21同様、BOARD=~ の形でターゲットボード名を指定するとよきに計らってくれます。まず、submodulesの準備作業の様子の先頭部分が以下に。

submod

問題なく上記が終わったら、今度は本体のビルドです。開始したところが以下に。buildStart

ビルドの末尾が以下に。buildResults

生成されたファイルは以下のようでした。

firmware

Nucleo-F401REボードへの書き込み

上記で dfu、elf、hex、bin と4種類もオブジェクトファイルを準備してくれてます。今回ボードへの書き込みに使用したのは .hex です(モトローラSフォーマットかと予想してファイルの中を覗いてみたら、まさかのインテル形式みたい。)

ビルドまではWSL2でしたが書き込みはWindows11からです。MbedOSなどのオブジェクトを書き込むために Nucleoボードをセットアップしてあれば(ST社のST-Linkドライバをインストール済ということ)、Nucleo-F401REボードをUSBに接続した瞬間にストレージとして認識され、Windowsのドライブとして見えると思います。Windows上からもWSL2のファイルは見えるので、フツーにHEXファイルをドラッグ&ドロップすればFlashへの書き込みOKでした。

起動後、伝統のTeratermで接続。ボーレートは115200bps、8N1です(MbedOSのデフォルトは9600bpsなので、Nucleoボードの場合、いつも9600設定で使っているのですが、MicroPythonは違います。)

REPLから見える、MicroPythonのバージョンが以下に。しっかりNUCLEO-F401REと表示されとります。MicroPythonGreeting

このバージョンmに含まれるモジュールを眺めてみると以下のようでした。

Teraterm00

そのなかで stm という、いかにもSTM32マイコン用のモジュールがあるのでimportして中身を眺めてみてます。上記はその先頭部分のみ。内部には大量の定数が定義されてます。ほぼほぼSTM32マイコンのペリフェラルを直接操作するための定数のようです。他のマイコン用のMicroPythonではあまりこの手の「サービス」は無かったのでちょっとうれしいかもしれません。mem関数使うか、uctypesモジュールを使えば直接のハードウエアが制御がやり放題?

MicroPython的午睡(76) SAMD21版MicroPython、WSL2でビルド へ戻る

MicroPython的午睡(78) 限りなくPyboardに近いNucleo へ進む