STM32CubeIDE更新、文字化け解決

STマイクロエレクトロニクスの統合開発環境:STM32CubeIDEがv1.3.0に更新されました(2月28日、更新自動通知メールにて把握)。デフォルト設定のWindows版STM32CubeIDEは、エディタで追記した日本語コメントに文字化けが発生します。これは、昨年投稿したSTM32CubeIDE v1.1.0v1.2.0と同じで、最新版でも解決されません。

そこで、対策にデフォルト設定を2か所変え、日本語文字化け解決を確認しました。また、Linux Debian版STM32CubeIDEとSW4STM32は、最新環境でもデフォルトで文字化けが無いことも確認しました。

Windows版STM32CubeIDE日本語文字化け発生箇所

2019年4月新登場STマイクロエレクトロニクス統合開発環境:STM32CubeIDE-Winの日本語コメント文字化けは、

  • SW4STM32プロジェクトのSTM32CubeIDEインポート後
  • プラグイン版STM32CubeMXでのコード再生成時

に、エディタでソースコードに追記した日本語コメントに文字化けが発生します。
※Windows版は、Windows 10 Pro 1909の話です。

STM32CubeIDE-Win v1.3.0日本語文字化け対策

数回のメジャー更新を経て登場後約1年のv1.3.0でも、この文字化けはデフォルトのままでは未解決です。そこで、ネット検索したところ、コチラの対策を得ました。

STM32CubeIDEのデフォルト設定を、2か所変更します。

STM32CubeIDEの日本語文字化け2箇所の対策
STM32CubeIDEの日本語文字化け2箇所の対策
  1. フォント設定を、デフォルトConsolasからメイリオなどの日本語文字セットへ変更(ワークスペース毎)
  2. Text file encoding設定を、デフォルトUTF-8からShift-JISへ変更(プロジェクト毎)

※1は、STM32CubeIDEのWindowタブ>Preferenceダイアログ検索窓へ”font”入力>Colors and Font選択>C/C++選択>Editor選択>C/C++ Editor Text Fontを選択し、Edit…クリックで左図表示
※2は、プロジェクト選択>Propertiesクリックで右図表示

右図のようにプルダウンメニューにShift-JIS選択肢が無い時は、Shift-JISと直接入力し、Apply and Closeをクリックします。

1はワークスペース毎、2はプロジェクト毎に設定が必要です。

これら2か所の変更で、SW4STM32プロジェクトインポート後とSTM32CubeMXコード再生成時、どちらもエディタ追記日本語コメント文字化けは解決できました。

以上で、従来のSW4STM32から新しいSTM32CubeIDEへ、日本語コメント文字化け無しにSTM32MCU開発環境を移行できます。

STM32CubeIDE特徴

STM32CubeIDEは、コード生成ツール:STM32CubeMX、開発デバイスファームウェア(弊社ならFW_F0/F1/G0/G4)全てを1パッケージ化し、全て最新版のみを提供する特徴があります。投稿時のSTM32CubeIDE v1.3.0が下図です。

簡単に言うと、開発ソフトウェアが全てSTM32CubeIDEへプラグインされた形式です。

STM32CubeIDE全体構成
STM32CubeIDE全体構成

STM32CubeIDE起動時、またはCheck for Updatesにより、IDEを含めた各プラグイン更新を確認し、常に最新開発環境となります(悪名高いWindows Updateに似ているような…😅)。

これは、プラグイン版STM32CubeMX v5.6.0に、旧ファームウェア選択機能が無いことからも解ります。

最新ファームウェアを使うSTM32CubeMXプラグイン版(左)とファームウェア選択可能なスタンドアロン版(右)
最新ファームウェアを使うSTM32CubeMXプラグイン版(左)とファームウェア選択可能なスタンドアロン版(右)

例えば、顧客先で稼働中ソフトウェアへ変更を加えるなど旧ファームウェアのまま開発希望の場合は、スタンドアロン版STM32CubeMX v5.6.0を使えば、右図のように旧ファームウェア選択も可能です(関連投稿:v1.2.0の開発環境更新リスク、ファームウェア更新リスク回避策の章に背景説明があります)。

純正STM32Cubeツール

STM32MCUソフトウェア開発に使えるIDEは、下図中央のようにIAR:Embedded Workbench、ARM:Keil、AC6:SW4STM32、etc.などサードパーティ製も数多くあります。しかし、純正STM32CubeツールのSTM32CubeIDEが、STマイクロエレクトロニクス一押しの統合開発環境だと思います。

STM32 Software Development Tools(出典:STMサイトに加筆)
STM32 Software Development Tools(出典:STMサイトに加筆)

もちろん、従来からあるSW4STM32もまだ現役(Active)です。ST Communityには、今も多くのSW4STM32事例があります。

そこで、Windows版STM32CubeIDE以外の、SW4STM32とLinux Debian版STM32CubeIDEの現状を調べました。

STM32CubeIDE-DEB

64ビット版のみですが、STM32CubeIDE v1.3.0のLinux Debian版インストーラが、Windows版STM32CubeIDEと同じ純正ソフトウェア入手サイトにあります。

STM32CubeIDE Debian Linux Installer
STM32CubeIDE Debian Linux Installer

筆者は、DebianよりもMintが好きなので、STM32CubeIDE-DEBをLinux Mint 19.3 MATE (64-bit)へインストールし、デフォルト設定でも日本語文字化け無し、評価ボードで正常動作することを確認しました。

STM32CubeIDE-DEBは、デフォルトで日本語文字化けなしで動作
STM32CubeIDE-DEBは、デフォルトで日本語文字化けなしで動作

Mintへのインストール方法が下記です。途中で長いライセンス同意を求められます。

chmod +x st-stm32cubeide_1.3.0….sh
sudo ./st-stm32cubeide_1.3.0….sh、または、sudo bash st-stm32cubeide_1.3.0….sh
※NXP:MCUXpresso IDE v11.1.0のInstallation Guide, Appendix A – Linux Installationを参考にしました。

STM32CubeMXやデバイスファームウェアは、Windows版と同様全てプラグインです。Linux版SW4STM32既成プロジェクトが手元に無いのでインポートは試せませんが、問題無いと思います。

リリースノート:RN0114のLinux動作テスト環境にMintは有りません。自己責任でNXP:MCUXpresso IDE v11.1.0 Linux版ともども、Mint上でSTM32CubeIDE-DEBが正常動作したことをお知らせします。

SW4STM32とスタンドアロン版STM32CubeMX v5.6.0

SW4STM32とスタンドアロン版STM32CubeMX v5.6.0で開発環境を構築する場合は、デフォルトでも日本語文字化けは発生しません。従来環境に慣れた方は、SW4STM32もそのまま使えると思います。

お知らせ:STM32FxテンプレートとSTM32G0xテンプレート改版予定

STM32CubeIDE-Win v1.3.0に加えた本稿2か所変更が、次版以降のSTM32CubeIDEにも必要かは判りません。ただ、いまさらShift-JIS設定?という気はします。WindowsでShift-JIS継続利用の弊害は、コチラの記事がよく解ります。

しかし、懸案であった日本語コメント文字化けが解決、新登場後1年経過しv1.3.0となったこのタイミングで、従来SW4STM32から新しいSTM32CubeIDEへ開発環境を乗換えるのもチャンスだと思います。SW4STM32更新頻度が減ったことや、他の純正STM32Cubeツールとの相性良さも期待できるからです。

そこで、SW4STM32で開発・販売したSTM32FxテンプレートSTM32G0xテンプレートを、STM32CubeIDE-Winを使って再開発に着手し、新にVersion 2として販売する予定です。進行状況などは、本ブログでお知らせします。

TrueSTUDIOとSTM32CubeMXインストール方法、STM32G0xとSTM32F0xの差異

STM32G0x専用テンプレートのIDE:TrueSTUDIOを使った開発環境構築手順も、汎用STM32Fxテンプレートのそれと同じです。

本稿はSTM32G0x専用テンプレート開発用IDE TrueSTUDIOとスタンドアロン版STM32CubeMXのインストール方法を示し、インストールしたSTM32CubeMXを使って同じ汎用MCUでもSTM32G0xとSTM32F0xのどこが違うかを具体的にまとめます。

STM32G0x専用テンプレートIDE:TrueSTUDIOを使った開発環境構築手順

2017年5月投稿のSW4STM32のIDE構築手順が左側、これがTrueSTUDIOに変わると右側になります。

表1 TrueSTUDIOとSTM32CubeMXインストール手順とSW4STM32構築時の比較
手順 SW4STM32で構築(2017年5月) TrueSTUDIOで構築(本稿)
1 SW4STM32インストールとUpdate TrueSTUDIOインストールとUpdate
2 STM32CubeMXプラグインとUpdate STM32CubeMXスタンドアロン版とUpdate
3 評価ボードMCUコアのライブラリダウンロード STM32G0パッケージのダウンロード
4 ライブラリのファイル構成確認 同左(しかし、当面見合わせ)
5 評価ボードデモソフト説明と構築環境の動作検証 同左(しかし、当面見合わせ)

差分はIDEと、STM32CubeMXスタンドアロン版をインストールする点、評価ボードがNucleo-F072RBからNucleo-G071RBに変わったので、STM32CubeMXへダウンロードするMCUパッケージにSTM32G0を加える点です。

前半で手順1~5の簡単な説明、後半は、インストールしたSTM32CubeMXを使って同じ汎用MCUグループのSTM32G0xとSTM32F0xが、電源ピン数やデフォルト使用周辺回路が異なることを示します。

手順1 TrueSTUDIOインストールとUpdate

Atollic TrueSTUDIO for STM32 9.3.0(2019/2/22リリース)は、atollicサイトからダウンロードボタンのクリックで入手できます。以後、Windows版で説明します。

ダウンロード後、インストーラを実行すると言語選択ダイアログが現れます。日本語を選択するとインストール後のTrueSTUDIOメニューも自動的に日本語化されます。
インストール後、ヘルプ(H)>更新の検査、をクリックしTrueSTUDIO を最新状態にします。

※TrueSTUDIOインストール検討中の方は、手順4を読んだ後に再検討してください。

手順2 STM32CubeMXスタンドアロン版とUpdate

コード生成ツールSTM32CubeMX V5.1.0は、SW4STM32と今回インストールするTrueSTUDIOの両方で使います。そこで、各IDEのプラグインではなく、スタンドアロン版としてインストールします。インストール方法は、UM1718 Rev28の3.2を参照してください。
インストール後、Help>Check for Updates、をクリックしSTM32CubeMXを最新状態にします。

※UM1718は、チュートリアルも豊富でSTM32CubeMXの重要マニュアルです。全356ページと分量は多いのですが、読む章を選択するなどして目を通すことをお勧めします。

スタンドアロン版はSTM32CubeMX更新が簡単で、1つのSTM32CubeMXで両方のIDEに生成ファイルを出力する時に便利です。

手順3 評価ボードMCUコアのライブラリダウンロード

評価ボードNucleo-G071RBのMCUコアは、Cortex-M0+です。STM32Fxと同じMainstream(≒汎用)MCUですが、新世代の汎用MCUです。
関連投稿:STM32G0x専用Edge MCUテンプレート開発

STM32CubeMXのHelp>Manage embedded software packagesでSTM32G0を選択し、最新版Package1.1.0をインストールします。

STM32G0インストール
STM32G0 MCU Packegae 1.1.0のインストール

手順4 ライブラリのファイル構成確認

STM32CubeMXは優れものソフトウェアで、IDEプラグインからスタンドアロン版へ途中変更してもデフォルトRepositoryディレクトリ(C:\Users\ユーザ名\STM32Cube\Repository)を変えなければ、プラグイン版Packagesの各MCUパッケージがスタンドアロン版へそのまま引き継がれます。

ただし今回のSTM32G0は、ライブラリファイル構成がSTM32F0/F1をインストールした時と一部異なります。

Repository/STM32Cube_FW_G0_V1.1.0\Projects\NUCLEO-G071RB\Templatesフォルダ内にTrueSTUDIOフォルダが無いのです(EWARM/MDK-ARM/SW4STM32は以前と同様有るが、UM1718にもTrueSTUDIO説明無し)。

残念ながら、手順3でインストールしたSTM32G0は、TrueSTUDIOへ生成コードを現状は出力できないようです😴。

SW4STM32の必然性
TrueSTUDIOではなくSW4STM32の必然性を示す結果となった

という訳で、手順4と5以降は、STM32G0がTrueSTUDIOへ対応した後に検証を行います。Communityによると次版のSTM32G0で対応予定だそうです。

STM32G0x専用テンプレート開発IDEに、SW4STM32からSTM買収後のAtollic TrueSTUDIOへの変更必要性を示すつもりが、今現在は、SW4STM32の使用を続ける必然性を示す結果となりました😴。

STM32CubeMXを使ったSTM32G0xとSTM32F0xの差異まとめ

TrueSTUDIOへ生成コードを出力しなければSTM32CubeMXに問題はないので、(個人的にはマルチOS対応SW4STM32が好きですし……気を取り直して…)、STM32CubeMXを使いSTM32G0xとSTM32F0xの違いをまとめます。

STM32G0xもSTM32F0xも共にMainstream、つまり、汎用MCUに属します。しかし、STM32CubeMXを使うと、評価ボード実装の同じ64ピンパッケージでも、電源ピン数やデフォルト利用の周辺回路が異なることが良く判ります。

Nucleo-G071RBとNucleo-F072RB差異
Nucleo-G071RB(左)とNucleo-F072RB(右)の利用ピン差異

Tips:STM32G0 1.1.0では、評価ボードNucleo-G071RB使用中のLD4(PA5)とB1(PC13)がPinout & Configurationに表示されません。その理由は不明ですが、手動で追加設定する必要があり上左図は設定済みのものを示しています。ちなみに、上右図Nucleo-F072RBは、LD2とB1がデフォルトで表示されます。

電源ピン(VDD/VSS)数

STM32G0xは、黄色で示された電源ピン(VDD/VSS)が1組、一方STM32F0xは4組あります。STM32G0xのCortex-M0+コアと70nmプロセスの結果、電力供給1組でも十分動作します。

不要になった電源ピンは、GPIOに変更し同じ64ピンパッケージでもSTM32F0xよりも多くの外部制御が可能です。

パッケージのピン配置

STM32G0xシリーズのパッケージピン配置が下図です。将来リリース予定の4パッケージピン配置は一貫しています。これにより、基板アートワークや周辺部品の配置も一貫した設計計画が立てられます。

電源ピンはどのパッケージでも1組で、左辺中央です。

STM32G0xシリーズパッケージピン配置(出典:STM32G0 and CubeMX Webinar)
STM32G0xシリーズのパッケージピン配置(出典:STM32G0 and CubeMX Webinar)

デフォルト利用周辺回路

STM32G0xのConnectivity(通信処理)は、デフォルトでLPUART1(Low Power UART、Stopモードからの再起動可)ですが、STM32F0xはUSARTです。STM32G0xもUSARTを実装していますが、低電力動作に適したLPUARTを推薦しているためと思います。

LPUARTとUSARTの差異(出典:STM32G0オンライントレーニング)
LPUARTとUSARTの差異(出典:STM32G0オンライントレーニング)

その他の差異

これら以外にも、STM32G0xは、USB Type-C™ Power Delivery controllerや2.5MspsのADC、メモリープロテクションなどIoT Edge MCU向きの周辺回路を実装済みです。

また、Nucleo-G071RB評価ボードのUSBはMicro-Bコネクタ、Nucleo-F072RBはMini-Bコネクタです。

USB Micro-BとMini-Bコネクタ(出典:ウィキペディア)
USB Micro-BとMini-Bコネクタ(出典:ウィキペディア)

まとめ

STM32G0x専用テンプレート開発に使うTrueSTUDIOとSTM32CubeMXインストール方法を示し、そのSTM32CubeMXを使ってSTM32G0xとSTM32F0xの差異を示しました。

STM32CubeMXは2重起動可能です。STM32G0xとSTM32F0xそれぞれのSTM32CubeMXプロジェクトファイルを同時に開いて比べると、各デバイスのデータシートで比べるより差異が早く良く判ります。

STM32G0x専用テンプレート開発IDEには、当面、筆者が好きなSW4STM32が適していることも判りました。

STM32デモソフトから見える問題点

STM32Fxシンプルテンプレート

前回記事で予告しました、弊社マイコンテンプレートを使い、STM32評価ボードのデモソフトへUART-USB通信機能を追加しました(下記仕様参照)。

デモソフトのSW押下げの代わりに、評価ボードとパソコン間のUART-USB通信コマンドでLED点滅速度を変えます。これをマイコンテンプレートのSTM32F0マイコンへのシンプルな応用例という意味で、STM32Fxシンプルテンプレートとします(年内に既存マイコンテンプレートと同様、Baseboardテンプレートと合わせSTM32Fxマイコンテンプレートとして1000円で販売予定)。

STM32Fxシンプルテンプレート仕様
・動作確認評価ボード:STM32F072RB(Cortex-M0)
・LED出力:評価ボード実装 緑LED LD2点滅速度をUART-USBコマンドで変更
・SW入力:評価ボード実装 青ユーザSW(ソフトチャタリング対策済み)PushをUART-USBで表示
・UART-USB通信:TeraTermなどのターミナルソフトへメッセージ入出力(19200bps 8-Non-1)
・低電力動作:Sleep処理
・使用ライブラリ:HAL

STM32Fx Simple-Template Overview
STM32Fx Simple-Template Overview

STM32評価ボードデモソフトから見えるサンプルソフトの問題点

STM32評価ボードのデモソフトは、マイコンサンプルソフトの問題点を示しています。この問題点は、マイコンサンプルソフト全般に言えます。

サンプルソフトの問題点とは、1つの機能を、初期設定と無限ループを使って説明する点です。この方法は、初心者が単独機能を理解する際には、動作が解り易く、優れています。

しかし、実際のアプリケーションでは、複数の機能が並列的に動作するのが普通です。実アプリケーションの[複数並列(的)動作]と、サンプルソフトの[無限ループ単独動作]とのギャップが大きいことが、マイコン初心者にとっての大きな障壁です。

結論から言うと、サンプルソフトの解り易さに貢献している無限ループの時間消費(浪費)が問題です。

デモソフトの具体例

具体的にSTM32評価ボードのデモソフトで説明します。無限ループ内のLED点滅処理が下図です。

Sample Software Infinite Loop Trouble
Sample Software Infinite Loop Trouble

LED点滅速度は、SW割込みのCallback関数で変えます。このサンプルソフトは、LED出力とSW入力が並列動作しています(サンプルソフトとしては、SW割込みを使う点で珍しい例)。

LED点滅処理を繰り返すのが、無限ループの目的です。1ループのLED処理は、500/100/50ms毎に1回トグルを実行し、その他の時間は、HAL_Delayで時間消費(浪費)です。殆どのサンプルソフトは、この構成です。

つまり、

典型的サンプルソフト ➡[単独処理+時間浪費]の繰り返し

これにより1つの機能を説明する構成です。この方法は、説明の受け側にとっては、解り易いものです。単独処理の中身は、ポーリングが多いのも特徴です。ポーリング結果で、別処理へジャンプするなどします。

別処理の無限ループへの追加

STM32評価ボードのデモソフトは、割込みでSW入力の別処理を追加しています。しかし、無限ループへ、割込み以外で別処理を追加するのは困難です。なぜなら、[単独処理+時間浪費]へ別処理を追加するには、時間浪費の時間を変えるしか手がないからです。

時間浪費の時間を変えたとします。すると、[単独処理+追加処理+変更した時間浪費]となり、既に存在したLED点滅処理の点滅間隔が変わる可能性が生じます。

つまり、処理追加により既存処理へも影響が及ぶのです。厳密には、割込みでも既存処理へ影響が及びますが、その影響は極わずかです。

処理追加で既存処理に影響が及ぶので、追加前の既存処理単独でのデバッグが無駄になります。デバッグの積み重ねができないのです。

それならば、いつも割込みで処理を追加すれば良いかというと、そうでもありません。

割込み処理は、ポーリングに比べデバッグが難しくなります。また、割込み処理のサンプルソフトは、ポーリングに比べ少数です。

サンプルソフトは、単独動作の説明に重点を置いたポーリング動作のものが多数で、実アプリケーション開発へ、そのままでは使いにくい構成、構造になっていることがお判りになったと思います。

弊社マイコンテンプレートの対策

デモソフトのLED点滅処理に着目したのが、弊社マイコンテンプレートです。500ms、100ms、50ms毎に1回処理し、その他の時間は、別処理、低電力処理(Sleep処理)を時分割で処理します。

つまり、

弊社マイコンテンプレート ➡ ①[単独処理]終わり
____________ ➡ ②[別処理]終わり
____________ ➡ ③[低電力処理]終わり
____________  ①~③の繰り返し

簡単に言うと、時分割の無限ループランチャーです(起動される①側からみると、単独で無限ループ内にあるのと同じ、②、③も同様)。複数処理を起動する仕組みをテンプレート自体が持っているとも言えます。

RTOS: Real Time Operating systemを使うと複数処理起動が簡単です。しかし、RTOS理解のオーバーヘッドが必要です。弊社マイコンテンプレートは、簡易的に処理を並列に起動します。

起動される側の処理は繰り返し起動されますので、ポーリング動作のサンプルソフトの多くがそのまま流用できます。数多くあるポーリングサンプルソフトを活用、流用してアプリケーションの早期開発ができるのが、弊社マイコンテンプレートの特徴です。

また、STM32Fxシンプルテンプレート仕様から解るように、実アプリケーションに最低限必要な、低電力処理、LED出力、SW入力、UART-USB通信の各処理は既にシンプルテンプレートに実装済みです。

このシンプルテンプレートへ実用アプリで必要となる処理を追加しさえすれば、直ぐに最終段階アプリとなる構成になっています。プロトタイピング開発に適し、実アプリケーションとサンプルソフトとのギャップを小さくします。

もちろん処理を追加や削除しても、既存処理への影響が小さいので、デバッグの積み重ねもできます。

STM32CubeMX生成ファイルのユーザ処理追記箇所

STM32CubeMXが生成するプロジェクトと自動生成ファイルのユーザ処理追記箇所を解説します。STM32マイコンのソフト開発は、この出力ファイルへ、ユーザ処理コードを追記して完成しますので、どのファイルのどこに追記すれば良いかを知ることが重要です。

前回記事でSTM32CubeMXの使用ライブラリにHAL: Hardware Abstraction Layerを選びました。UM1718の5章に、HAL単独、LL単独とHAL/LL混合の各ライブラリ使用時のSTM32CubeMX生成ファイル詳細説明があります。本ブログ記事は、このHAL単独版に相当します。

STM32CubeMXの設定条件

STM32CubeMXは、設定により出力プロジェクトの生成ファイルが様々に異なりますので、STM32マイコンテンプレート開発で使う下記条件でコード生成します。

前提条件

評価ボード:STM32F072RB(ARM Cortex-M0)
3ウイザード:Pinout、Clock Configurationは評価ボードデフォルト設定、ConfigurationはEXTI line 4 to 15 interruptsに☑設定
使用ライブラリ:HAL

STM32CubeMX Code Generation
STM32CubeMX Code Generation

出力プロジェクトとユーザ処理追記が必要なファイル

STM32CubeMXの出力プロジェクトのうち、ユーザ処理を追記する必要があるファイルは、Inc(ヘッダーファイル)とSrc(ソースファイル)にあります。これらInc/Srcフォルダ内のファイル概要とユーザコード追記箇所の有無一覧が下記です。

USER CODE Add in for STM32CubeMX Project
フォルダ>ファイル 概要 ユーザ処理追記箇所 STM32CubeMX再生成時
Src main.c main処理(動作クロックとHAL初期設定生成コード含む) あり
ユーザ処理以外上書き
stm32f0xx_it.c 割込み処理(EXIT1 4_15) あり(自動割付済み)
stm32f0xx_hal_msp.c HAL MSP処理とエラー処理 あり(可能性は低い)
system_stm32f0xx.c システムクロック設定 なし
Inc main.h IOピンのラベル定義 あり(Pinoutウイザード設定分のみ) 完全上書き
stm32f0xx_it.h 割込み定義 なし
stm32f0xx_hal_conf.h HAL構成定義 なし

Incフォルダのmain.hユーザ追記部分は、Pinoutウイザードでピン名を追加した分のみです。つまり、ウイザード出力があるだけで実質ユーザ追記は不要です。STM32CubeMXで再度コード生成した場合は、ヘッダーファイルは全て上書きされます。

従って、再生成してもユーザ追記コードが残るのは「あり」で示した、main.c、stm32f0xx_it.c、stm43f0xx_hal_msp.cのSrcフォルダ内の3ファイルです。

このうちstm43f0xx_hal_msp.cは、HALライブラリのMSP: MCU Support Package処理(≒ハード抽象化)やエラー処理ファイルですので、通常はユーザが追記する可能性は低いと思います。

結局、ユーザ処理の追記が必要なファイルは、Srcフォルダのmain.cとstm32f0xx_it.c(割込み処理)の2ファイルです。

ユーザ追記コード(割込み処理)

先ず、割込み処理を説明します。

HALライブラリを使うと、割込みの前処理(割込み要因フラグ確認、フラグリセット、ユーザ処理関数callback)は、全てSTM32CubeMXが自動生成する割込みハンドラが行います。但し、この割込みハンドラ名には、HAL_という接頭語が付いていて、コアの割込みハンドラ名と異なるため、コア割込みハンドラと生成割込みハンドラの対応付けが必要です。

このハンドラ名称の対応付けを行うのが、stm32f0xx_it.cです。評価ボードのデモソフト(STM32マイコン統合開発環境参照の5)動作検証参照)の例で示すと、stm32f0xx_it.cの下記部分です。但し、この割付は、ConfigurationウイザードでEXTI line 4 to 15 interruptsに☑設定した結果、自動割付済みです。つまり、ここもウイザード出力結果が反映されていて、実質ユーザ追記が不要です。

stm32f0xx_it.cのユーザ追記箇所
stm32f0xx_it.c

ハンドラがコールするユーザ処理関数は、Callback以外がハンドラ名と同じHAL_GPIO_EXIT_Callback()という関数名というSTM独自の決まりがあります。このCallback関数は、main.c内にあり下記部分です。

main.c
main.cのユーザ追記箇所

まとめると、割込み処理は

EXTI4_15_IRQHandler()は、    コアの割込みハンドラ(startup_stm32f072xb.sに記述)
HAL_GPIO_EXTI_IRQHandler()は、  STM32CubeMX自動生成の割込みハンドラでHAL_GPIO_EXTI_Callback()をコールバック
HAL_GPIO_EXTI_Callback()は、   ユーザが追記する割込み処理でmain.cに処理内容を追記

という3段構成なので、最終的にユーザが追記する割込み処理の箇所は、Callback()の中身つまりmain.cのみです。

ユーザ追記コード(割込み処理以外)

当然main.cは、割込み処理以外にも、様々なユーザ処理を追記します。STM32CubeMXが自動生成する「ナマ(生)のmain.c」を以下に示します。

main.c souce
main.c souce(折り畳み済み)

ユーザ追記箇所を解り易くするために、ソースを折りたたんでいます。先に示した割込み処理HAL_GPIO_EXTI_Callback()の追記箇所は、ソース構造から、USER CODE BEGIN 4の個所であることが判ります。

/* USER CODE BEGIN xyz */から/* USER CODE END xyz */のコメント間にユーザ処理を追記すれば、STM32CubeMXで再生成しても追記部分は、そのまま残ります。

USER CODE xyzのコメントを読んで、追記が必要なユーザ処理を追加していきます。但し、GPIOやシステム動作クロックの初期設定は、STM32CubeMXが自動生成済みですので、更なる追記は、本当にユーザ処理の部分のみということが判ります。デモの場合なら、LED2の点滅速度変更処理LED2_Blink()のみです。

以上をまとめると、STM32CubeMXが自動生成するプロジェクトとファイルへは、

  • 3ウイザードさえ間違わずに設定すれば、main.cのみの最小限ユーザ追記でアプリ完成
  • たとえウイザード設定に間違えても修正し再生成すれば、USER CODE xyzへ追記したユーザコードは保持され安心

STM32CubeMX自動生成の活かし方

プログラムサイズが大きい場合には、全てのユーザ追加ソースを1つのmain.cファイルに記述するのは現実的ではありません。しかし、単機能のサンプルソフト程度であれば、STM32CubeMXが自動生成するmain.cへユーザ処理を追記してもさほど可読性は悪くなりません。

STM32CubeMXは、STM32マイコンソフトを効率的に開発するツールです。なるべく小さく単機能ソフトをSTM32CubeMXで開発し、単体でバグが取れた後に、各機能を結合して目的のソフトへ仕上げるのが、STM32CubeMX自動生成出力を活かす方法です。

この活かす方法を使って次回は、評価ボードUART入出力をUSB経由でパソコンと繋げるUART-USB(VirtualUART)機能と、評価ボードデモの2つを結合し、パソコンコマンドでボードのLED点滅速度を変えるソフト開発の話をする予定です。これは実は、STM32マイコンのシンプルテンプレートに相当します。ご期待ください。

※固定ページ(本ブログの上部タブリンク)を、CurieからSTM32Fxマイコン開発へ全面変更いたしました。

STM32CubeMXの使い方

STM32マイコンのソフト開発を早く効率的にするのが、STM32CubeMXです。コード生成ツールのSTM32CubeMXの概要、使い方を示します。

STM32CubeMXの使い方ビデオ

STMが提供するSTM32CubeMX解説ビデオは、このページの右に2つあります。STM32CubeMX – Overview (6:44)とGetting Start with STM32CubeMX (9:12)です。Overviewを見ると概要が、Getting Startを見ると、5つの使いこなしポイントが判る(かも?)という内容です。STM32CubeMXのマニュアルUM1718もページ下にあります。

この2ビデオとUM1718、その他の関連資料から、私なりにSTM32CubeMXの要点、使い方を纏めましたので以下に示します。

STM32CubeMXのウイザード

STM32CubeMXは、4IDE(SW4STM32ほか3種IDE、前回記事参照)へプロジェクトファイルと初期設定(クロック設定と周辺回路)Cソースコードを自動生成します。この生成の基になるのがPinout、Clock Tree、Peripheral & Middlewareの3ウイザードです。

Power Consumptionウイザードは、生成時の消費電力を評価する計算ツールです(使用例はコチラを参照)。

STM32CubeMX Four Wizard
STM32CubeMX Four Wizard

STM32CubeMXの3ウイザード設定後、コード生成(Ctrl + Shift + G)実行で指定先へプロジェクトファイルが出力され、これをSW4STM32でImportすれば、初期設定コード付きのプロジェクトが得られます。

従って、残りのユーザ処理をプロジェクトへ追加していけば、アプリ完成という段取りです。

STM32CubeMXの2種ドライバライブラリ

注意点は、デフォルトでSTM32CubeMXが生成するのは、HALドライバライブラリを使ったプロジェクトだということです。勿論LLドライバライブラリでの生成も可能ですが、この場合は、初期設定ソースコードが自動生成されません。LLライブラリ利用の場合は、ユーザが初期設定コードも書く必要があります。

つまり、STM32CubeMXでLLドライバを使うと、SW4STM32で、初期設定とユーザ処理の両方をプロジェクトに追記しなければならず、しかも、各LLドライバ分解能はHALに比べて低いので、より多くのLL APIを使った追記が必要です。

HALとLLは、UM1749(全1466ページ)に詳しい説明があります。
HAL: Hardware Abstraction Layerとは、文字通りハードウエアを抽象化し、より簡単に周辺回路制御ができるAPIをユーザ側へ提供します。
一方、LL: Low Layerは、速度優先でエキスパート向けのAPIですので、高速ですが移植性や可読性はHALよりも低くなります。

HALとLLのAPIを相対比較した表が下記です。

STM32CubeMX HAL and LL APIs Comparison
STM32CubeMX HAL and LL APIs Comparison

追記コードはHALの方が少なくても、実際はHALの方が抽象化オーバーヘッドの分だけコンパイル後のコードサイズは大きくなります。プログラムにもよりますが、その差は60~80%だそうです。LLを使うとこのサイズが小さい分だけ高速処理が可能ということです。

STM32CubeMXでLLを使って生成するプロジェクトファイルは、本当の意味でフレームワークのみです。

Peripheralウイザード設定の目的は、SW4STM32のAPI入力支援機能を活用するためです。例えばコード記述中、LL_DAC_まで入力後、Ctrl + spaceを押すと、可能性があるLL APIがリストで選べます(HAL APIも下記のように同様)。Visual StudioのIntellisence機能のマイコン版に相当します。

Intellisence (Ctrl + Space) and USER CODE BEGIN to END
Intellisence (Ctrl + Space) and USER CODE BEGIN to END

このIntellisenceが表示するAPIは、当該周辺回路の全てのAPIを示すと思います。全てのAPIから使えるAPIを選ぶには、Peripherals & Middlewareウイザードの設定意味が解っている必要があるでしょう。

再度STM32CubeMXでコード生成し、プロジェクトファイルを作り直しImportしても、ユーザ追記部分を残すためには、USER CODE BEGINからUSER CODE ENDまでのコメント間に記述します。これは、Runesas CS+のコード生成と同じです。

STM32マイコンテンプレートはHALドライバライブラリを使用

使用するドライバライブラリは、60~80%の高速性か、ポータビリティかの選択です。STM32マイコンは、ROM/RAMが大容量なこと、コア速度も速いこと、STM32CubeMXもデフォルトでHAL使用することから、STM32マイコンテンプレート開発にも、HALライブラリを使います。

これにより、当初の目的であった機種特定を避けCortex-M0/M0+コアのSTM32F0/L0や、Cortex-M3のSTM32F1などのSTM32マイコン全てに使えるベアメタルマイコンテンプレートを開発します。

*  *  *

ここまでが、STM32CubeMXコード生成の使い方です。使用ライブラリにHALを選べば、初期設定Cソースコード付きのSW4STM32プロジェクトが作れます。

ビデオや各種資料もここで終わるものが多いのですが、ソースにユーザ処理の追加が残っています。このユーザ処理の参考にすべきなのが、STM32CubeMXのRepositoryフォルダで提供される周辺回路毎のサンプルソフトです。

STM32CubeMXサンプルソフトの使い方

前回記事Figure4に示したExampleで提供されるのが、HALライブラリ使用のサンプルソフトです。Example_LLはLLライブラリ利用サンプル、Example_MIXは、HALとLLの混合サンプルを示します。

いずれのサンプルも、4IDEで使える構成になっているのは、前回記事の通りです。

サンプルソフトがSTM32CubeMXを使って作られたものなら、そのまま利用できるのでBestですが、残念ながら専門家、人が開発したプロジェクトです。しかし有力なサンプルであることに違いはありません。

従って、使う周辺回路が決まったら先ずこのExampleで使用例を大体でも知ったうえで、コード生成するのが本来のSTM32CubeMXの使い方手順だと思います。この前処理抜きでPinout、Clock Tree、Peripheral & Middlewareの3ウイザードを正しく設定できれば別ですが、分厚いマニュアルを読むよりは効率的だと思います。

まとめ

私は、STM32CubeMXは、コード生成とRepository内のサンプルソフトの両方を、車の両輪のように同時に使うことでSTM32マイコンのソフト開発が早く効率的になると思います。

効率的なSTM32CubeMXの使い方は以下です。

1) Repositoryフォルダから使用する周辺回路とライブラリに応じたサンプルソフトを探し、おおよその利用法、特にユーザ処理を知る(サンプルソフトファースト)
2)コード生成Pinout、Clock Tree、Peripheral & Middleware各ウイザードを出来るならサンプルソフトと同じ設定にし、コード生成を実行(デフォルトはHALライブラリを使うことに注意)
3)生成されたプロジェクトをIDEにImportし、ユーザ処理を1)のサンプルソフトを参考にUSER CODE BEGIN~ENDの間に追記し、デバッグ
4)再度コード生成しても3)で追記したユーザ処理は残る(但し、ヘッダーファイルは完全に上書きされるので注意)

STM32マイコンテンプレートは、STM32CubeMXのHALドライバを使い、MCUコア依存性が少ないベアメタルテンプレート開発にする方針を立てました。STM32マイコンテンプレートの目的を知りたい方は、弊社マイコンテンプレートサイトをご覧ください。

STM32評価ボードNUCLEO-F072RB選定理由

STM32マイコンテンプレートを開発するにあたり、秋月電子さん販売中の多くのSTM32評価ボードのうち、Cortex-M0のNUCLEO-F072RBとCortex-M3のNUCLEO-F103RBを選びました。今回は、この選定理由を示します。

STM Evaluation Boards and MCUs Performance
STM Evaluation Boards and MCUs Performance

NUCLEO-F072RB選定の理由(ARM Cortex-M0)

STMサイトに散りばめられたSTM32 MCU情報から、NUCLEO-F072RB選定の決め手となった資料が下記4つです。UM: User Manual、AN: Application Noteです。

1) UM1779          Getting started with STM32CubeF0 for STM32F0 Series
2) AN4735           STM32Cube firmware examples for STM32F0 Series
3) UM1718          STM32CubeMX for STM32 configuration and initialization C code generation
4) UM1727          Getting started with STM32 Nucleo board software development tools

1)はボード毎に提供されるサンプルソフト数を記載し、STM32F072RBが134個と断トツに多いことが判ります。STM32F072RBとは、NUCLEO-F072RB実装MCUです。MCU/ボードの混在表記なので注意が必要です。2)は、1)のサンプルソフト詳細内容が示されています。

3)は、2)のサンプルソフトを生成するコード生成ツールSTM32CubeMXのユーザマニュアルで、スタンドアロンやEclipse IDEプラグインなどの3動作モードと使用法が書かれています。4)は、STM32MCU開発に使える4IDEの紹介です。

これら資料から、STM32マイコンテンプレートの開発環境を以下としました。

・評価ボード: NUCLEO-F072RB(64ピンSTM32F072RBT6実装、ROM 128KB/RAM 16MB、DAC/CAN/USB等)
・統合開発環境:SW4STM32(無償版コード生成サイズ制限なし)+STM32CubeMxプラグイン

※KeilのuVision(MDK-Lite)は、STM32F0/L0専用ライセンスを使うとコードサイズ256KBまで利用可能です。しかし、F0/L0専用となりSTM32F1開発(NUCLEO-F103RB選定理由参照)には残念ながら使えませんのでやめました。F0/L0のみ開発をする方は、2018年2月までの期間限定のようですが、無料で全機能使えます(少し使ってみた感想はエディタが貧弱ですがまあまあという感じです)。

数種類の評価ボードが簡単に入手できても、STM提供サンプルソフト数が少ないものもあります。弊社マイコンテンプレートは、これらサンプルソフトが簡単に組込めることを特徴としますので、サンプル数の多さは、テンプレート活用機会も多くします。

以上のことから、STM32マイコンテンプレート開発環境を決めました。

STM32 Template Development Environment
STM32 Template Development Environment

STM32マイコンテンプレート開発方針

これら4つ以外にも、様々な有用資料(例えばAN4617:Migrating between STM32F0 and STM32L0 microcontrollersなど)がサイト内に散りばめられていて、ハッキリ言ってCypressサイトなどと比較すると、平面的で資料が見つけにくいサイト構成です。応答速度も遅いです。
しかし、掲載資料は、いずれも優秀なエンジニアが書いたものと思われ、英文量は多いものの中身は良好です。

STM32マイコンテンプレート開発では、このSTMサイトリンクもブログ記事に積極的に掲載しようと思います。私の下手なブログ記事を読むより、STMサイトへ直接アクセスする方が良い読者も多いと思うからです。その結果、2016年マイコン売上5位の実力を持つSTM MCUを使う弊社STMマイコンテンプレートのご購入者が増えることも期待もしております。

NUCLEO-F103RB選定の理由(ARM Cortex-M3)

これまで弊社テンプレート対象MCUは、Cortex-M0/M0+クラスでした。しかし、前回記事に記載したようにRTOSやCMSIS普及を考慮すると、このクラスに拘る必要が薄くなってきました。

MCU価格では、Cortex-M4のSTM32F303K8T6が410円、Cortex-M0のSTM32F042K6T6が250円とややM4が高いものの、ここで使うM0/M3評価ボード価格は、どちらも1500円で同じです(2017年5月秋月販売価格)。

製品の大きさが許せば、評価ボードをそのまま製品へ実装するというのは、いつも私が考える製品構想です。評価ボードが同価格なので、コア性能が不足しても、ホードごと載せ替え可能で安心です。STM32評価ボードは、UM1724: STM32 Nucleo-64 boardで詳細が解ります。

しかも、STM32ソフトウエアスタック(UM1779掲載)から、コアクラスの依存性が低いテンプレート作りも可能だと思います。つまり、LL: Low Layerの代わりにHAL: Hardware Abstraction Layerを使ってテンプレート開発すれば、STM32F0(Cortex-M0)以外にSTM32F1(Cortex-M3)、他のコアへも適用できると考えるからです。

STM32CubeMx Software Stack
STM32CubeMx Software Stack

この可能性を検証するために選んだCortex-M3評価ボードが、NUCLEO-F103RB(64ピンSTM32F103RBT6実装、ROM 128KB/RAM 20MB、CAN/USB等)です。勿論、LLの方が高速処理可能でしょうが、HALの移植性の高さも捨てがたい利点があります。

NUCLEO-F103RB
NUCLEO-F103RB

そこで、STM32マイコンテンプレートでは、あえてF0やF1などと対象コアを明記せず、両方に対応できる(と今は思っている)HAL版テンプレートと、速度重視のLL版テンプレートの両方を開発する予定です。HALで共通化できない場合には、LL版のみをリリースします。この開発経緯などもブログに記載していきます。

*  *  *

STMのMCUが、2016年マイコン売上5位というのは驚きでした。少なくとも私の周りにはSTMマイコンを使う人がいなかったからです。入手性も良く評価ボードも低価格です。STMサイトの情報がもう少し解り易く整理されれば、日本でも人気がでるMCUだと思います。また、HALやCMSIS対応も他社に比べて早そうなので、今後の発展性も期待できます。

まとめると、STM評価ボードは、サンプル数の多さからCortex-M0のNUCLEO-F072RBを選び、M0/M0+とM3とのテンプレート共通化検証のためCortex-M3のNUCLEO-F103RBを選びました。IDEは、Eclipse IDEベースのSW4STM32へSTM32CubeMXをプラグインしてテンプレート開発に使います。

私は、STMサイト構成が、平面的、網羅的で情報検索しにくいと思うので、ブログに関連資料などへのリンクを掲載し、テンプレート開発経緯を記載していきます。