やっつけな日常(69) STM32 Nucleo、LCDシールドはF401REに落ち着いた?

Joseph Halfmoon

Arduino Uno R3用の「バニラ味」シールドボードに2行8文字の文字表示LCDを搭載したもの。Arduino Uno R3からUno R4、そしてSTM32 Nucleo F072RBとピンソケットの上を流れ流れてまいりました。今回接続のNucleo F401REボードでそろそろ落ち着くのか?

※「やっつけな日常」投稿順 Index はこちら

手元のNUCLEOボード揃ぶみ

以下写真は、手元にあるST Microelectronis社製NUCLEOボードです。赤丸つけた型番を見なければまったく同じボードが3枚並んでいる感じです。NUCLEOsEC

ボードの左右の端には2列のピンヘッダと、1列のピンソケットが並んでます。ピンヘッダの方がST社の独自規格のMolphoコネクタです。搭載マイコンのほぼ全ての機能にアクセスできる筈のもの。一方内側にならんでいるピンソケットが

Arduino Unoシリーズと端子機能「ほぼ同等」

のArduinoソケットです。端子的には同等の機能の端子がまったく同じ配置で出力されているのですが、Arduino Unoシリーズとの最大の差異はIO電圧です。Arduino Unoは5V、NUCLEOは3.3Vです。

さて見た目はソックリなNUCLEO(正確にはNucleo-64、64ピンのマイコンを搭載しているシリーズなので)ですが、ボードに搭載しているマイコンは異なります。手元3機種のメモリ容量と最高動作周波数を表にしたものが以下に。

ボード MCU Flash SRAM Max Freq.
NUCLEO-F072RB STM32F072RB 128KB 16KB 48MHz
NUCLEO-F401RE STM32F401RE 512KB 96KB 84MHz
NUCLEO-F446RE STM32F446RE 512KB 128KB 180MHz

こうしてみると前回使用のNUCLEO-F072RBがかなり「低スペック」であることが分かります。特にSRAM容量が小さいデス。これはArduino環境のようなほぼ「ベアメタル」な開発であれば、お値段考えればありか、と思いますが、Mbed OS6のようなRTOS前提だとチトツライです。そういえば昔、Keil Studio Cloudの初期のころ、NUCLEO-F072RBではOS6のRTOSモードは非推奨だった気がします。最近はフットプリント小さくなったのか何も言われんけど。。。

また、NUCLEO-F072RBのSTM32 F0シリーズはArm Cortex-M0コアを搭載です。まあArmコアとしては「プレイン・バニラ味」。一方、F401RE、F446REなどのSTM 32 F4シリーズとなるとArm Cortex-M4コア登載です。単精度ながら浮動小数演算器を搭載、各種性能なども多いに向上している筈の品種です。ちょっとした信号処理くらい余裕だったりする。

まあ、ST社のホームページに行くとこの他にもNUCLEOボードどもがごちゃまんと並んでおります。

LCDボードはNUCLEO F401REに載せ替え

Arm社純正RTOS、Mbed OS6を使っての運用を考え、結局LCDボードはNUCLEO F401REに載せ替えることにいたしました。載せ替えは簡単。ハード的にはF072RBのコネクタから引き抜いて、F401REのコネクタに差し込むだけ。

ソフト的にはArm Keil StudioのCloud環境上の前回使用のプロジェクトはそのままに、Build targetをNUCLEO-F401REに変更するだけ(ボードそのものは差し込めば自動で認識され、Nucleo F401REとConnected deviceに表示がでます。)こんな感じ。F401REproj

実は前回久しぶりにKeil Studio Cloudでビルドしたときに気づいたのが以下です。ビルドの末尾に使用FlashサイズとMemoryサイズ(SRAMのことだと思われる)が表示されることです。以前のArmのWeb開発環境が「ディスコン」になってKeil Studio Cloudになったころはどこ探してもこういう情報が出てこなかったです(以前のWeb開発環境では棒グラフで詳細な使用状況が見えたのに。)一歩前進した感じ? ただしFlashの使用容量は参考になるけど、Memory(SRAM)の使用容量はRTOS使うと常に全容量使っている(RTOSの支配下にあるということだと思います)表示になります。トホホ。。。まあRTOSにいろいろAPIがあったので、実使用量はAPI使えってことなのかな?後で調べてみます。BuildResults

ソースに1行追加

上記で前回コードそのままでビルドしてF401REに書き込んだところ、表示の1文字目が一文字落ちてしまいました。多分初期化後のI2Cの通信開始が早すぎてLCD側が追従しきれてない感じデス。そこで main.cpp に以下のように1行

sleep_for(1000ms)

を加えました。1000msは長大すぎるけれど、絶対動くであろう数字デス。後で初期化関数の方にもっと短い値コッソリ潜ませておくか。F401REMAIN

上記の結果が以下に。F401Runs

NUCLEO-F401REへの換装は出来。次回からは「モダンOS」のシリーズだな。

やっつけな日常(68) STM32 Nucleo、Mbed OS6 でもバッチリ に戻る