オフラインでmbedが使いたい(STM32)
どうもお久しぶりです。かめらちゃんです。皆様いかがお過ごしでしょうか。
研究とかでSTM32使うことも多いのですが、皆が皆手軽に扱える代物ではないので、手軽にmbedを使って開発ができれば楽ちんですね。
ただmbed、オンラインでは手軽なんですけどオフラインではなかなか癖があるらしく、解説のブログ記事などがあまり見当たりません(探し方が悪いともいう)。
今回はみんな大好きSW4STM32
を使ったmbedオフラインコンパイルを紹介する記事にしたいと思います。SW4STM32のインストール自体はyuqlid君の記事内で書かれているのでインストールは済んでいるものとして進めていきます。
使用するマイコンは今手元にちょうどあったNUCLEO-F746ZGを使いたいと思います。
mbed、mbedと一口に言いますが、どうも最近は元々あったmbed 2.0とmbed OS 5という2つの使い方(?)があるそうなのですが、今回は元々のmbed 2.0を用いて作業環境構築を行いたいと思います。
[lang:ja] mbed OS 5に関する諸々 | mbed
mbedオンラインコンパイラ側でまずは適当なプロジェクトファイルを作ります。(このとき間違えてmbed OS 5のプロジェクトファイルを生成しないようにすること)。
そのまま特にいじることなくプログラムワークスペースのプロジェクトで右クリック→プログラムのエクスポート(Ctrl+E)
Export ToolchainをSW4STM32に合わせてExportし、適当な場所に解凍します。
解凍したフォルダをsw4stm32でインポートします。
インポートできたらプロジェクトのプロパティを開き、
C/C++ Build>Settingsへ移動します。
その中のMCU SettingsのFloating point hardwareがNo unitになっているので
fpv5-sp-d16に変更、
Floating-point ABIがsoftになっているのでsoftfpに変更します。
そこまでできたらとりあえずDebugボタンを押してコンパイルします。
ちなみに失敗します。
するとこういうエラーが5件ほどでます。
- "MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE" was not declared in this scope, RawSerial.h
- "MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE" was not declared in this scope, Serial.h
- "MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE" was not declared in this scope, UARTSerial.h
- "STM32_D11_SPI_ETHERNET_PIN" was not declared in this scope, PinNames.h
というエラーがでてきますので、RawSerial.h、Serial.h、UARTSerial.hの頭あたりに
#define MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE 9600を追加してやります。PinNames.hのD11にエラーが出ているので、STM32_D11_SPI_ETHERNET_PINをPA_7に書き換えます。
これらは本来プロジェクトのmbedフォルダにあるtargets.jsonファイルに記述されており、そこから読み込まれるはずがSW4STM32が読み出してくれないので、直で書き直す必要があります。
変更を終えたら再びデバッグボタンを押すとエラーがなくなり、
コンパイルに成功します。
プロジェクト右クリック→Debug As→Debug Configuration
Ac6 STM32 DebuggingでNew launch configurationをクリックするとDebugもしくはRun設定が追加され、OpenOCDが実行されます。
また、ボードをつないでおくと自動的にプログラムがダウンロードされ、記述したプログラムが実行されます。
おわり!!皆様よいmbedオフラインコンパイルライフを!!
ちなみに私はこのNucleoボードのEthernetポートが使いたいのでmbed RTOSを別途インポートする必要があるのですが、mbedRTOSをインポートした状態でオフラインコンパイルを行おうとするとエラーが頻出してまだうまく動かせてません。
うまく動かせるようになったら記事にします。
なお、mbed OS 5はもとよりRTOSが入ってますので、SW4STM32でやるとどうもエラーが出るので扱いませんでした。
こちらも解決したら記事にするつもりです。
それでは!