itagagaki’s blog

Itagaki's Software Development Blog

STM32F446 Nucleo-144 でZephyrを動かしてみる

ZephyrというRTOSリポジトリのIssuesへのコントリビューションを始めることにしました。

Issues解決のためには、問題を実際に確認・把握し、コードを調査して原因、改善点、影響範囲などを分析し、修正を行い、テストを行って問題が解消したことを確認する必要があります。

そこでまずは、Zephyrを実際に動かすためのSoCボードを調達した。ZephyrはQEMU等でも動せるそうなんですが、現実のハードウェアで動かしてみるに越したことはありません。

様々なボードがある中で、お勧めを頂戴して STM32F446 Nucleo-144 を選びました。

STM32F446ZET6 144 PINS とあります。

さて、これからの作業に必要なことは、

  • PCでコードを書いたり修正したりする
  • PCでプログラムをビルドする
  • ボードに転送して動かす
  • リモートデバッガーでデバッグする

で、いろいろと検索して調べてみたところ、このボードに対してのビルドと実行には以下の方法があることがわかりました。

おそらくSTM32CubeIDEを使うのが、デバッグ等も含めた効率は良さそうな気がします。 しかし、残念ながら「STM32CubeIDEはZephyrを動かすようには作られていない」そうです。(How to use stm32cubeIDE to build and debug? · Issue #27559 · zephyrproject-rtos/zephyr) したがって、この選択肢は、残念ながら、はい消えた。

次に PlatformIO。これはとにかく試してみたら、あっけなくサンプルコードをビルド・転送して動かすことができました。そこにたどり着くまで、たぶん小一時間だったと思います。 しかも、一番時間がかかったのは、ボードへの転送がエラーになる原因を、あーでもないこーでもないと調べたこと。結局それはUSBケーブルが給電専用のものだったというオチでした。給電専用のUSBケーブルなんて滅んでほしい。そしてST-LINK USBドライバーを使うためにSTSW-LINK009をインストールしておく必要があります。

その後の手順は:

  1. PlatformIOのHomeで[Project Examples]をクリック
  2. [Zephyr-blink]を選んでインポート
  3. ワークスペースのplatformio.iniには4つの環境が記述されています。ぜんぶ要りません。代わりに自分の環境を書きます。私の場合は
[env:nucleo_f446ze]
platform = ststm32
framework = zephyr
board = nucleo_f446ze

です。

そしてBuildしてUploadします。これでボードのLD1が点滅します。 src/main.c の

#define SLEEP_TIME_MS 300

をいじって点滅速度を変えてみることができます。

さて、しかし、ビルドと転送と実行ができたのはいいけれど、問題はデバッギングです。 どうやらST-LINKという道具をボードに接続すればデバッグが可能になるっぽいですが、これ無しでなんとかならんのか?

もう一つ問題がありました。 そういえば、目的はZephyrのリポジトリのIssues解決だったわけですが、いまここで動いているZephyrは一体どこから来たのでしょう?? 探してみたら、%HOMEPATH%\.platformio\packages\framework-zephyrに一式がありました。 (環境はWindows 10です)。 しかしリポジトリのmainブランチの内容と比較してみると、リビジョンが違っているようでした。 ということは、つまり、この仕組みのままではZephyr自身の開発はできないということになります。 何か別のやり方もあるのかもしれませんが、このPlatformIOも残念ながら今回はちょっと使えないかなぁ。

そして最後に、Zephyrのwestというツールで開発する方法。 もうこれしか無さそうです。 Developing with Zephyr — Zephyr Project Documentationを読み込んで説明のとおりにやってみたら、これも小一時間でできました。 具体的には samples/basic/blinky をビルドして動かしてみることができました。 そして試しに west debug を実行してみたらgdbが起動したのでデバッグもできそうな雰囲気です。

続く、かな?