汎用STM32FxテンプレートのSTM32G0x使用法

LL APIを利用するSTM32G0x「専用テンプレート」開発は、3月からの投稿で一応目安が付きました。
※投稿下欄タグ:専用テンプレートをクリックすると本稿を含め関連投稿が読めます。

これらの投稿で販売中の汎用STM32Fxテンプレートは、HAL APIを使っているので別STM32MCU、例えばG0シリーズMCUのSTM32G071RBなどへの使用・移植も簡単であることを何度か書いてきました。

そこで、この「汎用テンプレート」のSTM32G071RBへの使用法を説明します。

STM32Fxテンプレートは、図1に示すようにF0シリーズMCUのSTM32F072RBと、F1シリーズMCUのSTM32F103RB両方で動作確認済みです。本稿は、このSTM32FxテンプレートをSTM32G0へポーティングします。

汎用STM32Fxテンプレートのソフトウェアアークテクチャ
汎用STM32Fxテンプレートのソフトウェアアークテクチャ

汎用STM32FxテンプレートのSTM32G0x使用法まとめ

  • HAL APIはSTM32MCUで共通なので、HAL API利用アプリケーション(この場合はテンプレート、STM32Fx Template)は、STM32デバイスが変わってもそのまま使える
  • HAL APIより下層のソフトウェアは、STM32CubeMXを使って自動生成
  • STM開発環境にMCU移植機能が無い現状では、移植デバイス先のSTM32CubeMX設定さえ間違わなければ、HAL APIより上層アプリケーションの使用・移植は、簡単

汎用STM32Fxテンプレートを購入検討中の方、または既にSTM32Fxテンプレートをお持ちの方は、HAL API利用STM32Fxテンプレートの別デバイス移植性が優れていることが本稿でご理解頂けると思います。

汎用STM32F0シンプルテンプレートのSTM32G071RB移植手順

手順1.SW4STM32で、F0SimpleTemplateプロジェクト名をG0SimpleTemplateへリネームコピー

手順2.STM32CubeMXで、評価ボードNucleo-G071RBプロジェクトを新規作成し、F0SimpleTemplate.icoと同じ変更を加え、手順1でリネームしたG0SimpleTemplate.icoへ上書き保存後、コード生成

手順3.SW4STM32で、G0SimpleTemplateのmain.cとUserDefine.hなど数か所を変更&コンパイル

手順4.STM32G071RB評価ボードNucleo-G071RBで、移植シンプルテンプレート動作確認

文章で書くと手順1~4のように量が多くなります。しかし、HAL APIはSTM32MCUで共通、デバイスが変わってもHAL API利用アプリケーションをそのまま使うために、下層の構築にSTM32CubeMXを使うだけです。HAL APIアプリケーション移植は簡単です。

手順詳細を説明します。

手順1:SW4STM32で、F0SimpleTemplateプロジェクトをG0SimpleTemplateへリネームコピー

F0SimpleTemplateをコピー、同じワークスペースへペーストする時にG0SimpleTemplateへリネームします。

F0SimpleTemplateをG0SimpleTempleteへリネームコピー
F0SimpleTemplateをG0SimpleTempleteへリネームコピー

G0SimpleTemplateフォルダ内のF0SimpleTemplate.iocをG0SimpleTemplate.iocへF2:リネームします。
※手順1の目的は、F0SimpleTemplateソースコードのユーザ追記部分を、丸ごとG0SimpleTemplateで流用するためです。

手順2:STM32CubeMXで、Nucleo-G071RB新規作成とコード生成

現状のSTM32CubeMXには、MCUデバイス間の移植機能がありません。そこで、F0SimpleTemplate.iocファイルを見ながら、新規作成Nucleo-G071RBの周辺回路を手動で同じ設定にします。

先ずG0SimpleTemplete.iocファイルを新規作成し、手順1でリネームしたG0SimpleTemplete.iocへ上書き保存します。その後、STM32CubeMXの2重起動を活かしF0SimpleTemplate.iocを見ながらG0SimpleTemplete.ioc周辺回路を同じ設定にします。最後に、全ての周辺回路をHAL APIでコード生成します。

STM32CubeMXのNucleo-G071RB設定
STM32CubeMXのNucleo-G071RB設定

※Connectivityは、F0SimpleTemplateに合わせてUSART2、Clock Configurationは、HCLK Max.の64MHz、Timerは、F0SimpleTemplateのTIM3機能に近いTIM7を使いました。

手順3:SW4STM32で、main.cとuserdefine.hの数か所を修正&コンパイル

どのようなアプリケーションソフトでも、デバイス依存の箇所があります。F0SimpleTemplateも同様です。これらは手動で変更・修正するとビルドが成功します。変更・修正箇所が下記です。

  • HALライブラリとBSP(Board Support Package)変更
    stm32f0xx_hal.h→stm32g0xx_hal_conf.h、stm32f0xx_nucleo.h→stm32g0xx_nucleo.h(UserDefine.h)
  • BSPはRepository\STM32Cube_FW_G0_V1.2.0\Drivers\BSP\STM32G0xx_Nucleoのstm32g0xx_nucleo.c/hをSrc/Incへコピー
  • TIM3の代わりにTIM7を使ったので、htim3→htim7(main.c)
  • G0SimpleTemplateに無関係ファイル削除(stm32f0xx_nucleo.c/h, system_stm32f0xx.c)

手順4:評価ボードNucleo-G071RBで動作確認

F0SimpleTemplateをG0SimpleTempletaへ流用したVitrual COMポート画面
F0SimpleTemplateをG0SimpleTempletaへ流用したVitrual COMポート画面

※表示メッセージは、STM32G0xデバイス対応に変更しています。

あとがき

繰返しますが、文章で書くと移植手順は長く複雑に感じます(特に手順3)。しかし、ソフトウェアアーキテクチャ図1が理解済みならHAL API利用アプリケーションの別デバイスへの移植は簡単です。手順3内容は、デバイスが変われば当然必要となる事柄です。

HAL API利用アプリケーションの最大メリットは、MCU移植が容易なことです。つまり、HAL APIアプリケーションは、「STM32MCUデバイス非依存」とも言えます。

現状では、このメリットを活かす開発環境が不備なだけです。不備分は手動で補い、STM32F0/F1アプリケーションをSTM32G0アプリケーションへ移植する方法を示しました。

近い将来、STM開発環境にMCUデバイス移植機能が提供されると筆者は思います。

お知らせ:LL APIを利用するLL APIのSTM32G0x「専用」テンプレートの販売時には、本稿のHAL API利用「汎用」G0SimpleTemplateも添付し、専用と汎用の両方を1パッケージで販売する予定です。

※LL APIとHAL APIの差を把握したい方は、STM32CubeMXのLow-Layer API利用法(2)を参照ください。

STM32G0x専用テンプレート開発全体像俯瞰

STM32G0x専用テンプレートの開発着手にあたり、汎用STM32Fxテンプレート開発から2017年9月のテンプレート発売までをざっと振り返り、今回の専用開発との差分になりそうな箇所を示しSTM32G0x専用テンプレート開発全体像を俯瞰、力を入れる投稿予定を示します。

汎用STM32Fxテンプレート開発History

汎用STM32Fxテンプレート開発時の主な投稿と内容
年月日 投稿タイトル 主な内容
2017年5 STM32マイコンIDE構築 SW4STM32の構築
2017年6 STM32CubeMXの使い方 HAL APIの選定理由と利用法
STM32CubeMX生成ファイルのユーザ追記箇所 HAL利用時のユーザ追記箇所
2017年8 評価ボードの利用ピン指針 Baseboardとの接続指針
2017年9 STM32Fxテンプレート発売 汎用STM32Fxテンプレート発売

2017年5月当時は、4種ある無償IDEの中からマルチOS(Windows/MacOS/Linux)対応、仏/AC6社のSW4STM32を使いました。2017年末、無償IDE TrueSTUDIO提供のスウェーデン/Atollic社がSTマイクロエレクトロニクス(以下STM)に買収され、公式にはTrueSTUDIOがSTM32マイコンの純正無償IDEに昇格(!?)したようです😅。

関連投稿:STM32のStep-by-Step Guideの、気になる点1:TrueSTUDIO参照

STM32G0x専用テンプレート開発IDE:TrueSTUDIO

そこで、STM32G0x専用テンプレート開発には、TrueSTUDIO無償版(Windows/Linux対応、MacOSなし)を使います。現在SW4STM32を使っている方にも判り易いようにTrueSTUDIOとの差分を説明する予定です。

但し、筆者はSW4STM32利用中の開発者が、あえてTrueSTUDIOに変更する必要は、今のところ少ないと考えています。ソフトウェア開発の主役は、STM純正コード生成ツールSTM32CubeMXだからです。最新STM32CubeMXを使えば、IDE差は少ないと今は思っています。

勿論、TrueSTUDIOの買収昇格時点でBetterなのは当然だと思います。専用テンプレート開発を通じBetterよりもSW4STM32からTrueSTUDIOへ変更するMust条件が判れば、本ブログでお知らせします。

Tips:STMの日本語資料強化の一環なのか、TrueSTUDIOはEclipseベースIDEなのにインストーラは日本語対応、メニューも日本語になっています(下図参照)。但し、C\ユーザ名\Atollic\TrueSTUDIO for STM32 9.3.0\Manuals\Generalにある重要マニュアル5種は全て英文です。例えば、SW4STM32プロジェクトのTrueSTUDIOインポート方法や注意点は、User GuideのP75~に英文で詳しく説明されています。

日本語対応のTrueSTUDIOメニュー
日本語対応のTrueSTUDIOメニュー

STM32CubeMX:LL API(Application Programing Interface)利用

STM32G0x専用テンプレートは、汎用STM32Fxテンプレート開発で使ったHAL(Hardware Abstraction Layer)APIに変わりLL(Low Layer)APIを使います。LL利用により、STM32CubeMX生成ファイルの初期化コードやユーザ追記箇所がHALとは異なります。LL APIの利用は、専用テンプレートの肝ですので、ブログで詳しく説明します。

IoTサービス例:2.5Msps12ビットADC必須+α

汎用STM32Fxテンプレートは、Baseboardと評価ボードを接続し、基本動作完成形のBaseboardテンプレートを開発しました。STM32G0x専用テンプレートは、Arduinoコネクタに何らかのIoTサービスを示すシールドを接続する予定です。しかし、最悪の場合、汎用と同じBaseboard接続にする可能性もあります。

ただし、特に2.5Mspsの12ビットADCは、3タイプある全STM32G0xデバイスに実装済みで、IoTサービス必須機能ですので、このADCを活かしたIoTサービスは実装必須にします。その他のIoTサービスに関しては、今後決めます。

2.5Msps12ビットADC (RM0444より)
2.5Msps12ビットADC (出典:RM0444)

STM32G0x専用テンプレート発売:2019/3Q~

汎用STM32Fxテンプレートは、5か月の期間で開発しました。STM32G0x専用テンプレートは、HALよりもLL API利用難易度が高いことを考慮すると、最低でも同じ開発期間が必要だと思います。

STM32G0x専用テンプレート開発全体像俯瞰の結果

以上、STM32G0x専用テンプレート開発の全体像を俯瞰しました。
SW4STM32からTrueSTUDIO IDEへの変更必要性、STM32CubeMX のLL API利用法、全STM32G0xデバイス実装済みでIoTサービス必須機能2.5Msps12ビットADC使用法、これらを読者の方々が理解できよう力を入れて投稿記事を作成します。

STM32G0x専用Edge MCUテンプレート開発

本稿は、STマイクロエレクトロニクス(以下STM)のSTM32G0xデバイス(Cortex-M0+/60MHz)が、汎用MCUのSTM32Fx(F0/Cortex-M0/48MHz、F1/Cortex-M3/72MHz)と異なり、IoT向きの新世代Edge MCUであること、そのテンプレート開発も汎用STM32Fxテンプレートと異なること、これら理由を説明します。

まとめ

はじめに内容をまとめた表1と表2、図1を示し、次章からその詳細理由を説明します。

要するに、STM32G0xデバイスのIoT Edge MCU向きの広いハードウェア性能を活かすには、LL(Low Layer)APIを利用したSTM32G0x専用Edge MCUテンプレート開発が得策だということです。

表1 STM32G0xデバイスとSTM32F0/F1デバイスのハードウェア差
デバイス名 製造プロセス コア 最大動作周波数 Edge MCU向き周辺回路
STM32G0x
デバイス
70nm Cortex-M0+ 60MHz 2.5Msps 12ビットADC、USB Type-C、暗号化処理
STM32F0/F1
デバイス
120nm Cortex-M0/M3 48/72MHz 特になし(汎用MCU)
表2 STM32G0x Edge MCUテンプレートとSTM32Fxテンプレートの違い
テンプレート名 使用API 流用性 動作確認評価ボード IoTサービス 重点ポイント
STM32G0x Edge MCU
テンプレート
LL(+HAL) 低い STM32G071RB 今後決める(TBD) STM32G0x性能発揮
STM32Fx
テンプレート
HAL 高い STM32F072RB
STM32F103RB
特になし(汎用) デバイス間移植・流用性
テンプレート開発の方向性
図1 テンプレート開発方向性。同じメインストリームMCUでもSTM32G0xデバイスは専用性、STM32Fxデバイスは汎用性重視。

STM32G0xデバイス(Cortex-M0+/60MHz)の特徴

STMの場合、新世代Edge MCUと従来MCUの最も異なる点は、製造プロセスです。STM32G0xは70nm、STM32Fxは120nmの製造プロセスです。

製造プロセスによる性能差は、Intelプロセサでお馴染みだと思います。ごく簡単に言うと、製造プロセスを小さくすると、全く同じMCUでも、動作周波数が上がり、消費電力は下がる、販売コストも下がるなど、良いこと尽くめの効果が期待できます。

さらにSTM32G0xは、Cortex-M0の電力消費を改良しCortex-M3の良さを取り入れたCortex-M0+コアを採用しています。つまり、コアと製造プロセスの両方でCortex-M0のSTM32F0デバイスを上回り、動作周波数をCortex-M3のSTM32F1デバイス72MHzに近い60MHzとしたことで、STM32F1と同程度の高性能なのに超低電力動作します。まさに新世代のIoT MCUです。

また、2.5Mspsの12ビットADC、USB Type-C、暗号化処理などEdge MCUに相応しい周辺回路を実装しています(3タイプあるデバイスで実装周辺回路を変え、低価格供給中)。

STM32G0xデバイスとSTM32F0/F1デバイスのハードウェア差をまとめたのが表1です。STM32G0x出現で、STM32F1/F0デバイスで開発する意味は、低下したとも言えるでしょう。
※但し、他デバイスへの移植性・流用性を重視した開発ならSTM32F1/F0デバイスを使い汎用STM32Fxテンプレート使う意味は依然として大きいです。

現在はSTMから何のアナウンスもありませんが、STM32G0xと同じ70nm製造プロセスでCortex-M3/≦100MHzの上位デバイスSTM32G1xが発売されれば、なおさら低下します。

関連投稿に上記特徴の出典などがあります。
関連投稿:守備範囲が広いSTM32G0
関連投稿:STM新汎用MCU STM32G0

STM32G0x専用Edge MCUテンプレートと汎用STM32Fxテンプレートの違い

STM32Fxテンプレートは、ハードウェア差を隠蔽するHAL(Hardware Abstraction Layer)APIを使い、万一性能不足などでデバイスを変える事態が生じても、同じソフトウェアを使えます。従って、STM32F0とSTM32F1の両デバイスで動作するアプリケーションが、ほんの少しの修正で素早く作成できます。

これは、HALのおかげです。HALがデバイスや周辺回路差を吸収するため、アプリケーション側は移植性の高いシンプルな記述ができるのです。その副作用として、アプリケーション記述コードは少なくてもコンパイル後のコードサイズは、周辺回路を直接制御するLL(Low Layer)に比べ大きくなります。

関連投稿:STM32CubeMXの使い方、STM32CubeMXの2種ドライバライブラリの章参照

HALを使うと言うことは、たとえデバイスが変わっても開発したソフトウェアとその労力を無駄にせず、流用・応用できることが最大のメリットです。

汎用「STM32Fxテンプレート」は、この流用・応用に適したテンプレートです。動作確認評価ボードは、STM32F072RBとSTM32F103RBのみですが、全ての汎用STM32Fxデバイスへ応用できます。勿論、ここで示したSTM32G0xデバイスにもこのHALを使う手法は適用可能です。

一方、「STM32G0x専用Edge MCUテンプレート」は、LL APIを使います。つまり、STM32G0x専用のテンプレートです。※LL APIは、使用デバイスにより異なるので専用テンプレートになります。

STM32G1xデバイスが持つCortex-M0からCortex-M3までをカバーする広い適用力と超低電力動作を活かすには、ソフトウェア開発にHAL比60~80%の高速処理のLLを使った方が得策と判断しました。

つまり、STM32G0xデバイスをEdge MCUと認め、そのSTM32G0xの性能や能力を十分に発揮する専用テンプレートがSTM32G0x専用Edge MCUテンプレートです。
※但し、流用性が高い一部機能には、HAL活用も考慮中です。LLとHALは混在可能です。

STM32G0x専用Edge MCUテンプレートと汎用STM32Fxテンプレートの違いをまとめたのが表2、テンプレート開発の方向性を示したのが図1です。

STM32G0x Edge MCU評価ボード選定

STM32G0x専用Edge MCUテンプレートの動作確認評価ボードには、Nucleo-G071RB(¥1,203)を予定しています。

前投稿で示したEdge MCUテンプレート評価ボードの3要件を再掲します。

  • R1. 低価格、入手先豊富なEdge MCU評価ボード <¥3,000
  • R2. 最新Edge MCU使用(2018年後半の新しいIoTトレンドに沿って開発されたEdge MCUであること)
  • R3. 何らかのIoTサービス例を簡単に示せる

これら3要件のうち、R3:何らかのIoTサービス例を示す要件がNucleo-G071RB 単独ではNGですが、Arduinoコネクタに何らかのIoTサービスシールドを追加することで満たす予定です。

評価ボードNucleo-G071RB
評価ボードNucleo-G071RB。64ピンパッケージでも電源供給が2本のみのなのでアートワーク担当者が喜ぶ。

※STM32G0xデバイスの評価ボードで、IoTのUSB Type-Cサービスを示すSTM32G0 Discovery Kitや、暗号化処理サービスを示すSTM32G081B-EVALは、両方ともR3要件を満たしますが、価格要件R1<¥3,000を満たさないので利用を断念しました。

STM新汎用MCU STM32G0

2018年12月4日、STマイクロエレクトロニクス(以下STM)の公式ブログで新汎用MCU STM32G0、Cortex-M0+/64MHzを発表しました。以下の特徴があります。
※汎用=メインストリームと本稿では考えます。

新汎用STM32G0、Cortex-M0+/64MHz、メインストリーム90nmの特徴

STM32メインストリームMCU
STM32メインストリームMCU:STM32FxとSTM32G0の違い(出典:STM32 Mainstream)
  • 「メインストリーム初の90nmプロセスMCU」:従来メインストリームSTM32F0は180nmプロセス
  • 「ハイブリッド」:STM32L4(90nmプロセス)の低消費電力とSTM32F0のメインストリームの両方をハイブリッド
  • 「モアIO」:64ピンパッケージSTM32F071比較でIOピン9本増加、48ピンでもIOピン7本増加
  • 「単一電源供給」:PCBパターン設計が容易
  • 「セキュリティハード内蔵/非内蔵」:128/256ビットAES、セキュアブート、乱数発生器、Memory Protection Unit (MPU)
  • 「USB-C」: IPによりUSB-Type-C可能
  • NUCLEO-G071RB board」:低価格評価ボード提供中、「STM32G081B-EVAL board」:$382
STM32G0ラインナップ (出典:STM公式ブログ)
供給中の3種製品とSTM32G0ラインナップ (出典:STM公式ブログ)
STM32G0 Product Lines(出典:STM32G0 Serie Presentation)
STM32G0 Product Linesから3種製品の違いが解る(出典:STM32G0 Series Presentation)

STM32G0オンライントレーニング

データシートよりも解りやすいSTM32G0オンライントレーニング資料が多数あります(要ログイン)。

例えば、以下のような興味深い情報が得られます。各数ページの英文スライド形式ですので、STM32G0以外のMCUを使用中の方でも、チョットした空き時間に読めます。

  • STM32G0 Series Presentation:内蔵ハードウェアによりValue/Access/Access & Encryptionの3種製品特徴
  • ARM Cortex-M0+ (Core):Cortex-M0とM0+の差、Memory Protection Unit 説明
  • Safety:安全基準とその実現方法
  • Random Number Generator (RNG):アナログノイズに基づいた32ビット乱数発生
  • STM32G0 Boards:NUCLEO-G071RB board解説

STM32CubeMX V5.0.0

STM32G0のコード生成は、STM32CubeMX V5.0.0からサポートされました。

V4までと同じSW4STM32、TrueSTUDIO、両方のIDEで使えます。STM32CubeMX V5が提供するMCUファームパッケージで、本ブログ関連を抜粋したのが下表です。

STM32CubeMX V5.0.0提供MCUファームウェア版数
対象MCU firmware(評価ボード、STM32G0ボード暫定) 最新Version
STM32F1(STM32F103RB、Cortex-M3/64MHz V1.7.0
STM32F0(STM32F072RB、Cortex-M0/48MHz V1.9.0
STM32G0(V5で新設、STM32G071RB、Cortex-M0+/64MHz V1.0.0

STM32Fxテンプレートでも使用中のHAL(Hardware Abstraction Layer)ライブラリでコード生成すれば、STM32F1、STM32F0とSTM32G0間で、流用/応用が容易なソフトウェア開発ができると思います。

まとめ

新発売のSTM32G0は、90nmプロセス初のメインストリーム汎用MCUです。一般的に製造プロセスを微細化すれば、動作クロックが高速になり電力消費も低下します。さらに、STM32G0は、Cortex-M0より性能が向上したCortex-M0+コアの採用により、Cortex-M3のSTM32F1クラスに並ぶ高性能と超低消費電力動作をハイブリッドした新汎用MCUと言えます。

周辺回路では、IoTで懸念されるセキュリティ対策をハードウェアで実施、IOピン数増加、PCB化容易、USB-Type Cインタフェース提供など、各種IoTエッジMCU要求を満たす十分な魅力を持つMCUです。

競合するライバルMCUは、Cortex-M0+のNXP S32K116/S32K118(2018/7発売)などが考えられます。

関連投稿:NXP新汎用MCU S32K1