STM32ソフト開発に、HAL:Hardware Abstraction Layerライブラリを使えば、文字通りARMコアを抽象化したソフトが作れます。コード生成ツールSTM32CubeMXが、HALをデフォルトで使うのもこの理由からです(HALとLLライブラリについては、6月5日記事も参考にしてください)。
そこで、STM32CubeMXのHAL出力とF0:Cortex-M0評価ボードSTM32F072RB(48MHz)で動作するSTM32Fxシンプルテンプレートを、F1:Cortex-M3評価ボードSTM32F103RB(64MHz)へ載せ替えた時のソースコード変更箇所を示し、HALを使ってARMコアを抽象化した結果、ソースコードのどこが共通化でき、どこが異なるのかを具体的に示し、HALの利用効果を評価します。
※STM32Fxシンプルテンプレート仕様は、前回記事参照。
※STM32F072RBとSTM32F103RBは、ARMコアのみが異なる評価ボードで、実装済みの緑LEDとユーザ青SWも同一GPIOピンを使用しているので、STM32F0:Cortex-M0からSTM32F1:Cortex-M3へのソフト載せ替え評価に最適。
STM32FxシンプルテンプレートのSTM32F0からSTM32F1へのソースコード変更箇所
(1)HALライブラリのインクルード
結果から言うと、ARMコア抽象化機能を持つHALライブラリを使えばユーザが追記したソースコードは、大部分を共通にできます。
しかしHALライブラリ自身は、ARMコアにより異なります。このため、HALライブラリをインクルードするソースコードの箇所は、下記のようにstm32f0xx_hal.hからstm32f1xx_hal.hへ変更が必要です。
(2)割込み:NVICプログラマーズモデル
Cortex-M0/M0+は、割込み最大数32、優先度レベル4、一方Cortex-M3は、割込み最大数240、優先度レベル8~256とコアで異なるモデルですので、割込み関連ヘッダファイルの変更が必要です。
※STM32Fxシンプルテンプレートは、SysTick割込み以外はポーリングを使っています。GPIO割込みは、未使用です。この箇所は、デモソフトのGPIO割込み利用部分が参考になるため、テンプレートにそのまま流用した結果、変更が必要になった箇所です。
テンプレートへGPIO割込み処理を追加し、更にARMコアを変更する場合には、このNVICプログラマーズモデルの違いで変更が必要になります。
* * *
HALライブラリを使った結果、上記2か所以外のユーザソース、ヘッダファイルは、STM32F0とF1のMCUで共通化できました。共通ソースコードの一部を示します。動作クロックが48MHzと64MHzと異なりますが、同じHAL API:HAL_UART_Transmit()によりUART2送受信(19200bps 8-Non-1)ができています。
Cortex-M3のSTM32F103RB(64MHz)動作STM32Fxシンプルテンプレートファイル構成が下記です。
弊社が追加したソースファイルやヘッダファイルは、Pascal形式でファイル名を付けますので、図示のように赤で色分けしなくても一目でSTM32CubeMX生成ファイルとの区別ができます。
STM32CubeMX生成ファイルのHALライブラリインクルード部分は、STM32CubeMXが当該HALライブラリ(stm32f1xx_hal.h)を、また割込みは、当該NVICプログラマーズデモルに応じたソースを「上書きで」生成しますので、コア載せ替えによる修正箇所は、弊社追加ソースファイルとヘッダファイルに限定できます。
この限定ファイル(1)と(2)の個所のみを変更すれば、STM32F0ソースコードをF1へそのまま使えます。HALライブラリ利用によるソース/ヘッダの共通化効果は、非常に高いと言えるでしょう。
弊社ソースファイル、ヘッダファイルの変更箇所は、#ifdefプリプロセッサを使って、コアによる差分箇所を1つへまとめることも可能です。リリース版では、これを採用したいと考えています。HALライブラリ利用により、ARMコアに依存しないSTM32Fxテンプレート構想(x=0 or 1)が実現します。