先日秋月にてSTM32F401 Nucleoを購入したので適当に検索してやり方を調べつつmbedで何か書いてみるテスト。

 開封後、なにも考えずにボードをminiUSBケーブルでパソコンに繋げるとドライブとして認識されてフォルダが開く。ただし、Windows Server 2003ではドライバを要求されてしまったので、Windows7以降で動かしたほうがいいかもしれない。
(ドライバを拾ってきて色々やったがどうしてもVCPがエラーで動かなかった)

 開いたフォルダの中のmbed.htmをクリックしてブラウザに読ませると、mbedのwebに飛んでログイン画面になる。初めてだったので適当なメールアドレスで登録作業を行った。

 ログイン後、画面をななめ読みしているとアップデートしろとか書いてあったので、手順通りにアップデートを行った。ここで、ドライバのインストールがあってVirtual Com Portなるものが追加された。

 アップデートが終わってようやくコンパイラ画面を呼び出した。(画面右のopen mbed compiler)
すると「新しいプログラムの名前を入れろ」と要求されるが、テンプレートのプルダウンメニューにいくつかのサンプルがあったので、Display the date and time using RTCというものを選択。どうやらボード(CPU?)にはRTCが内蔵されているらしい。そのままコンパイルボタンを押すとサーバ側でコンパイルしてバイナリを送ってくるので(Nucleo_d.bin)、適当なフォルダに保存し、それをNUCLEOのドライブのルートにコピーするといきなりプログラムがスタートし始める。ArduinoならIDEのメニューにシリアルモニタがあり、そこでボードからのSerial.println()などの出力を見ることができるが、mbedにはそれが無いので代わりに適当な通信ソフトでcomポートを見る必要がある。ここではputtyを使った。COMポート番号は先ほどインストールしたVCPのポートを指定する。

 ここで問題発生。本来ならメインルーチンはwhileループになっていて、1秒ごとに日時を表示するはずがなぜか1回だけ表示して止まっている。ボード上のリセットボタンを押すとまた表示されるが1回だけ。原因を特定するためにあちこちにprintfを入れてみると、どうやらwait()関数で止まっているらしい。更に、一切printf()を入れない(シリアルへの出力が無い)ループでは動いている。結局、wait()のバグらしいということで、代替手段としてwait_ms()に書き換えた。ms単位なので値を1000倍にする。ついでに時刻表示部分に改行がなかったので\rを追加。再びコンパイルしてバイナリをコピーしたところ、今度はうまく1秒ごとに日時が表示された。