2018年3月21日水曜日

STM32CubeMXの導入とSTM32プログラミング開始

STM32はCortex-MなどARMベースのマイコンで、高性能で安価なmbed対応のNucleoの出現に加え、mcHFやCentSDRなどスタンドアロンなSDRに採用されており、開発上非常に魅力あるデバイスですが、開発環境を整えるのにやや敷居が高く、PICやAVRと違い例えばGPIOの設定一つでもより細かい設定が必要でなかなか取っつきにくいものがありました。

そうはいってもいつまでも躊躇している場合ではないのですが、ちょうど関ハムシンポでSTM32F1の格安小型マイコンボード、通称BlackPillをJF1DIR広瀬OMから譲っていただいたことをきっかけに開発環境構築について改めて調べてみました。その結果Arduinoやmbedに依存しないオフラインな開発環境としては、現時点ではSTM32CubeMXとSW4STM32がよさそうです。

STM32CubeMXは最初登録が必要ですがソフトウエアのダウンロードと使用は個人的使用の範囲では基本的に自由です。(商用目的の場合は確認していません)このソフトは便利でかつ強力なSTmicro純正開発支援ツールです。要は主プログラムで使用する機能とピンを設定に基づき、各IDEなどに合わせたプロジェクトファイル群を自動生成してくれるソフトウエアです。本体ソフトウエアをインストールし、各STM32シリーズごとのライブラリファイルをSTM32CubeMX内でダウンロード、インストールしておきます。(Helpメニューの"Manage embedded software packages"から)


なぜ"Cube"なのかよくわかりませんが、とにかくウインドウ内左中央の"New Project"を左クリックして開始します。そうするとソフトウエアのアップデート確認、インストール後に目的のマイコン選択ウインドウが出てきます。


 該当する項目のチェックボックスにクリックして目的のモデルまで絞り込んでいきます。


 この例では秋月で単体販売されているF303K8T(6)を選択しました。右端中央にあるStart Projectボタンをクリックすると、各種設定用のウインドウに切り替わります。


 ウインドウ右には実際のチップを模したグラフィック表示になっています。ここでピンに割り当てられた機能を直感的に確認したり変更したりすることが可能です。機能が固定されたVDDとVSSなどは当たり前ですがすでに割り当てられています。左はチップに内蔵されている各種機能をツリー表示したものです。ある機能を有効にしたときに、機能で割り当てられるピンが自動的に選択されます。

実際には各機能相互で使用するピンのコンフリクトを避けるために、右のツリーからプログラムで必要な機能を選択してからそれ以外のGPIOを指定する流れがスムーズかと思われます。


 例として内蔵基準発振器、SPI接続のTFT LCD、I2C接続のペリフェラル、AD変換ポート、デバッグ用ポートを使いたいとします。

左のツリーから必要な機能をすべて選択すると、各機能にあたるピンを自動的に設定されています。あとはSPI接続で他に必要なCSとD/Cポートを空いている適当なピンに合わせて左クリックしGPIO_Outputにチェックします。チェックしたピンは緑色に変わります。

次に上の"Clock_configuration"タブをクリックします。


 すると各モジュールの動作クロックを設定するウインドウにかわります。

 中央にあるシステムクロックSYSCLKを基準にしてラジオボタンとプリスケーラのプルダウンリストを適切に選択します。ここでは8MHzのRC内蔵発振器を使用するため、4MHz入力PLLでの最高倍率16倍である64MHzをSYSCLKとしてあります。その際にモジュールの中でオーバークロックになるところが赤色に変化して注意を促されるため該当モジュール前のプリスケーラの倍率を設定して最高周波数以内にします。エラーがなくなったのを確認して次に上の"Configuration"タブをクリックして各機能の設定を確認調整します。


 ここでは各モジュールやミドルウエア個々の設定を行います。

気を付けておきたいのは、デフォルトの設定をそのまま使うと一部を除きたいていは動きません。(苦笑)

よく使うモジュールとしていくつか例に挙げると、まずはI2C。スピードはデフォルトで100kHzに設定されていますが、LCD表示器など含めて400kHzのFast modeに対応しているので変更しておいたほうが良いです。1MHzのFast mode plusは外付けEEPROMの多くが対応しているものの、LCD関連は非対応のことが多くFast modeの400kHzに設定するのが無難です。それからSPIですがデータ転送幅がデフォルトで4bitになっていて、最初気が付かずこのままにしていたためTFT LCDがまったく動かなくてしばらく悩みました。ここは8bitへ変更することが必要です。最後にGPIOです。動作速度はFastに変更、input設定の場合プルアップ、プルダウン、両方なしいずれかの設定、outputの場合正論理か負論理か、プッシュプル出力かオープンドレイン出力かの設定を必ず確認し正しい設定にします。

設定が済んだら、 "generate code"コマンドボタンもしくはメニューを選択します。


ここでプロジェクト名を入力し、必要があればプロジェクトファイル群を置く場所を指定(デフォルトの作業ディレクトリ以外)、Toolchain / IDEプルダウンメニューでSW4STM32に指定しOKすると作業場所にHALライブラリを含んだプロジェクトファイル群を生成されるので、それらをeclipseでインポートします。インポートしたプロジェクトでコードを書いてビルドすれば実行ファイルが生成されます。

ちなみにIDEのSW4STM32はフリーのeclipseベースですが、供給元からダウンロードの際細かい個人情報の入力を要求されるので注意が必要です。私の場合は日本語化プラグインとJDE関連などが含まれたeclipseベースのPleiadesをインストールして、eclipseからSW4STM32をインストールしました。さらにSTmicroからSTM32CubeMXプラグインも導入し、eclipseからSTM32CubeMXを呼び出して、生成されたプロジェクトファイル群を自動インポートできるようにしました。

作業スペースもdropboxのクラウド環境において簡単にバージョン統一を行っています。

まぁ言ってしまえばaruduinoIDEもmbedもSTM32CubeMXも設定を効率化してその分コード書きに集中できるようにする便利なツールです。何より標準でHALドライバがつかえるのと設定がうまく体系化されている印象で取っつきにくさを解消してくれています。こういったツールについていろいろと意見があるようですが、私のようななんちゃってプログラマには本当にありがたいツールですね。

最後にテスト動画を。


 秋月で1個250円のSTM32F042K6T6単体で160x128のSPI接続カラーTFT LCDをつなぎ、ADC入力電圧を表示させています。