STM32G0xのADC利用法

STM32G0xのラインナップは、Value/Access/Access&Encryptionの3製品です。製品により内蔵周辺回路が異なりますが全製品共通回路が、2.5MSPS 12bit ADCです。本稿は、このSTM32G0xのADC利用法を解説します。

STM32G0xのADC資料一覧

時短に役立つ資料を表1にリストアップしました。

表1 STM32G0xのADC資料一覧(2019年4月現在)
資料名 概要
STM32G0 – ADC STM32G0のADCトレーニング資料。全20ページの内容は判り易く良書。
AN5110 STM32CubeMXを使い生成可能なSTM32G0x公式サンプルプロジェクト一覧表。
HAL API 4個、LL API 8個、HALとLL混在1個のADC公式STM32CubeMXプロジェクト掲載アプリケーションノート。
AN2834 全STM32MCUのADCを精度よく使う方法アプリケーションノート。全49ページ。

3資料と数は少ないですが、ADC内容は盛り沢山です。

STM32G0xのADC公式サンプルプロジェクトAN5110とオンライントレーニング資料を中心に、AN2834も参照するアプローチで解説します。

STM32G0とSTM32F0のADC差

STM32G0は最新IoT Edge MCU、STM32F0は普通の汎用MCUで、どちらもMainstream(≒汎用)MCUですが内蔵12bit ADCは異なります。トレーニング資料P18に特徴の比較があります。

STM32G0とSTM32F0のADC差
STM32G0とSTM32F0のADC差分(※説明のため着色しています。出典:ADCオンライントレーニング資料)

先ず、Conversion:ADC変換時間が0.4usと高速になった点。STM32G0xはMax. 64MHz動作(F0は48MHz)ですが2倍以上高速です。次に、Analog watchdog対応数が増え、バッテリー動作に備え低圧側に動作電圧が広がっています。ハードウェアオーバーサンプリングと高度なシーケンサーが新しい機能です。

勿論、普通のSTM32F0と同じADC制御もできますが、これら新機能を使いこなし、コアMCU負担を減らすように制御すると上手い使い方と言えるでしょう。

トレーニング資料は英文ですが、ポイントを抑えた非常に良くできた資料です。筆者の下手な解説より資料を読んで頂くと、STM32G0xのADCの使い方が判ると思います。

実践的ADCの使い方習得

トレーニング資料が一番効果的ですが、本稿では、開発中のSTM32G0x専用テンプレート動作確認評価ボードNucleo-G071RBで動作するAN5110のExamples_LL掲載サンプルプロジェクト(MXアイコン付きの下記8個)を使って、実践的にLL APIによるADCの使い方を習得します。

なぜLL APIを使うのかは、STM32G0x専用テンプレート開発全体像俯瞰、また、全般的なLL API利用法はSTM32CubeMXのLow-Layer API利用法 (1)~(3)を参照してください。

LL APIを使ったADCプロジェクト一覧(出典:AN5110)
LL APIを使ったADCプロジェクト一覧(出典:AN5110)

Descriptionを読むと、大別して4種類のサンプルプロジェクトがあることが解ります。AN5110は、Examples_LLフォルダを名前順に表示したもので、MXアイコン付き8個を制御別に解り易く並び変えたものが表2です。

表2 MXアイコン付き8プロジェクトを制御別に並び換える
制御 基本プロジェクト名(_Init省略) 応用プロジェクト名(_Init省略)
1 ADC SingleConversion TriggerSW

ADC SingleConversion TriggerSW DMA

ADC SingleConversion TriggerSW IT

ADC SingleConversion TriggerTimer DMA

2 ADC ContinuousConversion TriggerSW ADC ContinuousConversion TriggerSW LowPower
3 ADC Oversampling なし
4 ADC  AnalogWatchdog なし

4種類を整理すると、最も基本のADCプロジェクトが1です。

1のSingleConversion_TriggerSoftwareは、ソフトウェアトリガでADCを開始し、ポーリングでデータ取得、データ転送にDMA転送、割込みなどの応用例があります。タイマをトリガにDMA転送の発展例もあります。ADC処理回数は1回です。

2のContinuousConversionは、1のADC処理回数の連続形で、LowPowerでの応用例があります。
※1と2のConversion Mode説明が、トレーニング資料P11にあります。

3のOversamplingは、新機能のサンプルプロジェクトです。
※Hardware Oversampling説明が、トレーニング資料P12にあります。

4のAnalogWatchdogも、新機能の3個AnalogWatchdogを使ったサンプルプロジェクトです。
※AnalogWatchdog説明が、トレーニング資料P13にあります。

いかがですか? ADCサンプルプロジェクトだけでもおなか一杯で、しかも、これでもADCの豊富な機能の一部抜粋です。さらに、省電力動作や、実際に接続するアナログセンサ出力への対応、加えてAN2834記載の変換精度向上なども考慮すると、ADCだけでも上手く使うのはかなりのスキルや経験が必要なのが分ります。

こういう時は、最も基本のADC_SingleConversion_TriggerSWを先ず理解し、プライオリティに応じて順次ステップアップするのが常套手段です。プライオリティ無しの手当たり次第の理解は、消化不良を起こします😂。
※なおSTM32G0x専用テンプレートは、このADC_SingleConversion_TriggerSWを実装予定です。

ADC_SingleConversion_TriggerSW_InitのSW4STM32インポート

※統合開発環境SW4STM32とコード生成ツールSTM32CubeMXは、Windowsパソコンへインストール済みとします。インストール方法は、関連投稿を参照してください。

先ず、ADC_SingleConversion_TriggerSW_Initを使って、STM32G0xのADC使い方を説明します。

サンプルプロジェクト:ADC_SingleConversion_TriggerSW_InitをIDE:SW4STM32へインポートする方法は色々あります。簡単な方法が下記です。

1.STM32CubeMXをインストールしたPCの          、
STM32Cube\Repository\STM32Cube_FW_G0_V1.1.0\Projects\NUCLEO-G071RB\Examples_LL\ADC\ADC_SingleConversion_TriggerSW_Initフォルダを開き、ADC_SingleConversion_TriggerSW_Init.iocをクリックすると、STM32CubeMXが起動します。

2.起動したSTM32CubeMXのProject Manager>Projectで、Toolchain/IDEをSW4STM32へ変えます。Advanced SettingsタブでADCや周辺回路のLL利用を確認しておきます。

3.GENERATE CODEをクリックし、表示されるダイアログでOpen Projectをクリックすると、SW4STM32が起動します。ワークスペースを入力後、下記Successfully imported the project…が表示されればインポート完了です。

SW2STM32インポート成功時ダイアログ
SW2STM32インポート成功時ダイアログ

4.SW4STM32でreadme.txtを開くとインポートしたプロジェクト内容が解ります。評価ボード:Nucleo-G071RBのPA.04、またはArduinoコネクタCN8 A2接続の、0から3.3Vまでのアナログ入力電圧を、ソフトウェアトリガでADCスタートし、ADC完了ポーリングでデータ変換完了を確認するのがこのプロジェクトです。
評価ボード単独でもアナログ入力電圧は不定ですが、動作可能です。

サンプルプロジェクトmain.cソースコードの読み方

初めてmain.cを見た方は、ソースコード行数が多いのでビックリするかもしれません。しかし、以下のSTM32CubeMX(以下MX)生成ソースコードの構造を押さえて読めば簡単です。

  • 自動生成ソースコードは、ユーザコード/コメントを追記する部分と、MX生成部分の2つからなる
  • ユーザコード/コメント部分は、再度MXで新たにコード生成しても、上書きされそのまま残る
  • コーザコード/コメント部分は、/* USER CODE BEGIN… */ ~ /* USER CODE END… */で囲まれている

従って、サンプルプロジェクトのユーザコード/コメント部分は、「ユーザの代わりにSTMが作成したコードと明示的に説明を加えた箇所」です。注意して読みましょう。それ以外のMX生成部分は、コメントを眺める程度で十分です。

サンプルプロジェクトmain.c解説

ソースコードが読めると、サンプルプロジェクト内の重要関数も解ります。

ADC_SingleConversion_TriggerSW_Initの場合は、L121のConversionStartPoll_ADC_GrpRegular(void)とL120のActivate_ADC(void)が重要関数です。

これら以外のLED点滅関数(L122~124)とMX生成関数(L116~118)は、他のプロジェクトでも使える、いわばLL API開発時の汎用関数です。

ADC_SingleConversion_TriggerSW_Initのmain.c
ADC_SingleConversion_TriggerSW_Initのmain.c解説。重要関数と汎用関数に分けて読む。

L121へカーソルを移動し、F3を押すとConversionStartPoll_ADC_GrpRegular(void)の定義場所へ簡単に移動できます。

ConversionStartPoll_ADC_GrpRegular()
重要関数 ConversionStartPoll_ADC_GrpRegular()本体

ConversionStartPoll_ADC_GrpRegular(void)は、本来ユーザが作成する関数を、STMが代わりに作成した信頼性が高い関数です。ユーザが利用しない手はありません。ライセンス上も問題なく使えます。

しかも、STMが明示的に付けたコメントがありますので、自分の開発ソースコードへ利用・活用できるようにコメントを読んで内容を理解しておきましょう。内容理解には、readme.txtやトレーニング資料も役立ちます。

同様に、もう1つの重要関数:Activate_ADC(void)も利用・活用できるように理解しましょう。

以上のように重要関数を理解すると、サンプルプロジェクト:ADC_SingleConversion_TriggerSW_Initが示した処理内容とその中から利用できる関数を、自分が開発するプロジェクトの代替関数(≒一種の部品)として使えるようになります。

公式サンプルプロジェクトは、この「高信頼部品の宝庫」です。部品を利用すれば、開発速度が上がります。
また、公式サンプルプロジェクトは、「周辺回路利用時の作法」も明示STMコメントが示しています。

ユーザは、どこに、何を、追記すべきか

前章は、ADC_SingleConversion_TriggerSW_Initを使って、サンプルプロジェクトソースコード:main.cの理解方法を示しました。

一般的な周辺回路のユーザ追記箇所は、前章のように主としてmain.cの無限ループです。周辺回路の初期設定(前章で言えばMX_ADC1_Init(void)やMX_GPIO_Init(void))は、STM32CubeMXが担うからです。

サンプルプロジェクトには、周辺回路に割込みやDMAを利用した例もあります。

この場合は、STM32CubeMXのLow-Layer API利用法 (3)で示した割込みNVIC利用時のユーザ追記箇所と、本稿で示した周辺回路ユーザ追記箇所の2つに分けてソースコードを理解します。

STM32CubeMXが自動生成したソースコードの、「どこに、何を、ユーザが追記すべきか」は、本章で示した方法でサンプルプロジェクトを理解すれば、自然に解るようになります。
逆に、「どこに、何を、追記すべきか」かが解らないなら、まだサンプルプロジェクト理解が足りないと言えます。

公式サンプルプロジェクトのソースコードを作成するのは、STM32CubeMXと「ユーザ代替のSTMプロフェッショナル」です。両者の役割、作成部分やソースコード構造を理解するのがユーザ開発の第一歩です。

ここでは、表2の中で最も基本のADC_SingleConversion_TriggerSWサンプルプロジェクトを使って、STM32G0xのADC利用法を解説しました。

ADCサンプルプロジェクトは他にも多数あります。自分の開発プライオリティに応じて、他プロジェクトも同様に理解し、ステップアップすれば良いでしょう。

STM32G0x専用テンプレートの目的

MCUソフトウェア開発は、0から着手するのではなく、コード生成ツール:STM32CubeMX活用や前章で示した公式サンプルプロジェクトの部品利用・活用で、効率的に早く開発する、いわゆるプロトタイプ開発が主流です。また、プロトタイプ開発をしないと、競合他社とのビジネスには不利です。

プロトタイプ開発は、開発スピードが要求されます。何がしかの動作確認済みテンプレート(ひな形)と評価ボード、詳しい説明資料があれば、開発着手時のつまずきや手間が省け、より検討すべき項目に時間が割けます。
このテンプレートが、弊社汎用マイコンテンプレートです。

本稿のSTM32G0x専用テンプレートは、新しいEdge MCU「STM32G0xシリーズ専用」テンプレートで、STM32MCUで汎用性がある上記テンプレートとは異なりますが、目的や役割は汎用と同じです。

関連投稿:STM32G0x専用Edge MCUテンプレート開発

STM32G0x専用テンプレートには、本稿で示したADC重要関数や、USB経由のADC変換データパソコン出力、パソコンからの評価ボードLED点滅制御など、STM32G0x開発着手時に最低限必要な機能や部品をあらかじめテンプレートに実装済みです。

STM32G0x専用テンプレートをサンプルプロジェクトとの差分で説明すると、複数サンプルプロジェクトが実装済みで、プロトタイプ開発着手のレベルにより近いプロジェクト、これがテンプレートとも言えます。また、各種サンプルプロジェクト追加や削除が簡単なのも特徴です。

テンプレートのソースコードには、日本語コメントを豊富に付加し、初心・中級開発者が理解できるよう詳細な解説資料付きで提供します。

STM32G0x専用テンプレートを利用すると、STM32G0xプロトタイプ開発を即座に始められます。

STM32G0x専用テンプレートは、近日中に発売予定です。

STM32CubeMXのLow-Layer API利用法 (3)

STM32G0x専用テンプレートで使うSTM32CubeMXのLL API利用法第3回(最終回)は、STM32CubeMXのLL API利用設定、NVIC利用時のユーザ追記箇所を示し、最後にLow-Layer API利用法第1回から本稿まで全体をまとめます。
LL API利用法第1回第2回は、リンク先参照。

LL API利用設定

STM32CubeMXでHAL API利用時と異なるのは、Project Manager>Advanced Settingsの赤囲みの部分のみです。デフォルトは全てHALです。これを、HALからLLへ周辺回路毎に変更します。

LL API利用時の設定箇所
LL API利用時の設定箇所。デフォルトはHALなので全てLLへの変更必要。

第2回で説明したように、LLとHALの混在利用は避けた方が無難です。各周辺回路で両者の選択ができますが、HALかLLの二者択一をお勧めします。また、周辺回路追加・変更時は、デフォルトHALです。LL APIアプリケーション開発時は、注意してください。

STM32CubeMX便利機能に各種設定値のPDF出力:File > Generate Reportがありますが、v5.1.0ではLL/HAL設定値は未出力です。

LL API利用の割込み:NVIC利用時のソースコードユーザ追記箇所

LL APIの割込み:NVIC利用時のユーザ追記箇所は、HAL API利用時に比べ多いです。
※HAL API割込み処理のユーザ追記箇所は、関連投稿:STM32CubeMX生成ファイルのユーザ処理追記箇所を参照してください。

第1回で示したAN5110で説明します。Examples_LLサンプルプロジェクト、EXIT_ToggleLedOnIT_Init.iocのNVIC設定が下図です。このプロジェクトは、評価ボードのUserButtonを押すと割込みが発生しLED4がトグル点滅します。NVICのユーザ追記箇所が赤囲みです。

EXIT_ToggleLedOnIT_Init.iocのユーザNVIC設定箇所
EXIT_ToggleLedOnIT_Init.iocのユーザNVIC設定箇所

GENERATE CODEをクリックすると、stm32g0xx_it.cのL149~L166にEXIT4_15_IRQHandler(void)が自動生成されます。
stm32g0xx_it.cのL160のUserButton_Callback()は、ユーザが追記したCallback関数です。
main.hのL71で、このUserButton_Callback(void)は、ユーザが宣言します。
main.cのL209~L212で、UserButton_Callback(void)は、ユーザがCallback関数の中身を記述します。

自動生成されたファイル名(橙色)とユーザ追記位置(緑色)とユーザ追記コード(赤色)
自動生成されたファイル名(橙色)、ユーザ追記位置(緑色)、ユーザ追記コード(赤色)

STM32CubeMXは、IRQハンドラ関数の割込み発生原因:トリガ検出部分を生成するのみです。

ユーザは、Callback関数とその中身を、「/* USER CODE BEGEN… */ ~ /* USER CODE END… */」で囲まれた3ファイル指定場所に追記します。囲まれた範囲は、STM32CubeMXで再度GENERATE CODEをクリックしても上書きされ残ります。

本章は、NVIC利用時のユーザ追記箇所を示しました。これらは、ADCなどの一般的な周辺回路利用時のユーザ追記箇所とは大きく異なります。
※一般的な周辺回路のユーザ追記箇所は、ADCを例に説明します。

STM32CubeMXが生成したソースコードの「どこに、何を、ユーザが追記すべきか」は、生成ソースコード理解が必要です。これには、公式サンプルプロジェクトソースコードの理解が役立ちます。
※これも、ADC例を使って、ソースコード理解方法を説明します。

STM32CubeMXのLow-Layer API利用法:全体まとめ

3回に分けて説明した「STM32G0x専用テンプレートで使うSTM32CubeMXのLL API利用法」全体をまとめます。

初期化処理生成

(第1回)

・STM32CubeMXを使う方法と、高性能小サイズなユーザ自作方法の2つ

・STM32CubeMX生成の初期化処理関数名は、接頭語にMX_が付く

・STM32CubeMXを使うと、無限ループ内処理に集中できる

LLとHALの違い

(第2回)

・LL:HALよりもハードウェアに近く、高速軽量なエキスパート向け

・HAL:ハードウェア抽象化で、STM32MCU間で最大限の移植性を保証

・LLは、HALハンドルレジスタを直接上書きする可能性あり

・LLとHAL混在:同一はもとより異なる周辺回路でも混在は避けた方が無難

STM32CubeMX設定

(第3回:本稿)

・Project ManagerのAdvanced Settingsで全周辺回路をLLに一括変更

・周辺回路追加・変更時、Advanced SettingsデフォルトHALに注意

・NVIC生成ハンドラのCallback関数と中身は、ユーザ作成が必要

これら3分野を把握しておけば、STM32CubeMXのLL APIを安全に利用できると思います。

上記まとめで少し気になるのは、安全側評価で「異なる周辺回路でもLLとHAL混在は避けた方が無難」とした点です。本当に異なる周辺回路で混在利用はできないでしょうか?

周辺回路が異なれば、LLがアクセスするハードウェアも当然異なり、競合は無いハズです。例えば、I2CはHAL API、GPIOはLL API利用でも競合問題はなさそうです。

多分、API利用者が、アプリケーションレベルでレジスタ競合などが無いことを確認できれば、「自己責任で異なる周辺回路なら混在可能」だと思います。但しこれを行うには、LLやHALの深い部分まで解読、競合調査が必要です。

AN5110のExamples_MIXサンプルプロジェクトで示された、HALの一部をLLへ置換え、処理高速化を狙う例に止めた方が良さそうです。

以上、STM32CubeMXのLow-Layer API利用法をまとめました。

LL APIとHAL APIは、トレードオフ

LL APIを使うと、MCUハードウェア性能を活かし、少ない容量で高性能アプリケーション開発ができます。半面、他のSTM32MCUへの移植性はHAL APIに比べ低下します。

LL APIとHAL APIは、トレードオフの関係です。LLかHAL、どちらのAPIでソフトウェア開発するかは、このトレードオフ評価で決めます。

STM32F0/F1両デバイス性能を1MCUでカバーするSTM32G0xは、専用アプリケーション、つまりLL API開発に値するデバイスだと思います。STM32G0xテンプレートは、LL APIを使い専用テンプレートとして開発します。

次回は、全てのSTM32G0xデバイスで実装済みでIoT MCU必須機能、2.5Msps12ビットADCのLow-Layer APIでの使い方を解説します。

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が適していることも判りました。

守備範囲が広いSTM32G0

2018年12月のSTM32マイコンマンスリー・アップデートのトップページに、先日投稿した新汎用MCU STM32G0の概要とブロック図が記載されました。また、12月18日のEDN JapanにもIoT機器を小型化効率化する32ビットマイコンとしてSTM32G070(48ピン/ROM128KB)が約69セントと安価であることが紹介されています。

STM32G0シリーズブロック図
STM32G0シリーズブロック図(出典:マンスリー・アップデート2018年12月トップページ)

本稿は、これら新MCU STM32G0記事を整理し、開発ベースとして最適なアクセス・ライン製品STM32G71と評価ボードの入手性、価格について示します。

3製品:バリュー・ライン、アクセス・ライン、アクセス・ライン&エンクリプション

STM32G0の説明がある時、3製品のどれを説明しているかを区別、意識する必要があります。というのは、STM32G0のアプリケーション守備範囲が、とても広いからです。3製品の特長をまとめたのが下表です。

STM32G0の3製品特徴
製品ライン 型番例 特徴
バリュー・ライン STM32G70 コスト最重視のエントリクラス製品
アクセス・ライン STM32G71 ハードウェアセキュリティ搭載の標準製品
アクセス・ライン&エンクリプション STM32G81 アクセス・ラインに暗号化機能搭載製品

EDN Japan記事のSTM32G070(48ピン/ROM128KB)の69¢は、バリュー・ラインのことです。マンスリー・アップデートのブロック図は、3製品機能をAND表示したものです。

3製品差を理解するには、STMサイトのSTM32G0製品シリーズと、オンライントレーニング資料STM32G0 Series Presentation P2が役立ちます。

STM32G0製品シリーズ
STM32G0製品シリーズ(出典:STMサイト)
STM32G0の3製品差
STM32G0の3製品差(出典:STM32G0 Series Presentation P2)

現在供給中の3製品差と、今後のラインナップを整理すると以下になります。

供給中デバイスと開発予定ラインナップ
供給中デバイスと開発予定ラインナップ(出典:STM公式ブログ)

バリュー・ライン(灰色)
アナログフロントエンド向きのアプリケーションに特化した2.5Mspsの高速12ビットADC実装のバリュー・ライン(STM32G070)は、価格最重視のエントリ製品でEDN Japan記事のように1$以下の調達ができます。また、供給中と今後のラインナップの図から、8/20ピンなどの小ピン&小ROM製品が予定されていることも解ります。

アクセス・ライン(水色)
バリュー・ラインと同様小ピン&小ROM製品に加え、100ピン&大ROM製品の予定もあります。アプリケーションに応じてDAC、USB-PO、CAN FDなどの周辺回路が実装可能です。さらに、1.65-3.6Vと他製品より低電圧側への広い動作も特徴です(Presentation P2参照)。

これらの仕様の幅広さから、STM32G0の最も標準的なベースMCUと言えます。アクセス・ラインでプロトタイプ開発しておけば、内蔵周辺回路が同じシリーズのバリュー・ラインやアクセス・ライン&エンクリプションへそのまま応用・適用できるからです。

アクセス・ライン&エンクリプション(紺色)
IoTアプリケーションでは必須になるハードウェア暗号化機能をアクセス・ラインに追加しています。

STM32G0の幅広いMCUコア性能

これも先の投稿で示したSTM32FxとSTM32G0の違い図から、STM32G0はSTM32F0より低い消費電力と、STM32F1並みの高性能をハイブリッドしたMCUであることが解ります。つまり、STM32G0(Cortex-M0+/64MHz)で、F0~F1のMCUコア性能範囲をカバーできるのです。

STM32G0のGは、アプリケーション守備範囲の広さを示すGlobal、またはGeneral(汎用性)を表しているのかもしれません。STM32FxのFは、Flexibilityでしょうか?

STM32G0のサンプルソフトウェア

アクセス・ラインSTM32G071RB(64ピン/ROM128KB)実装の評価ボードNUCLEO-G071RBは、STMの公式サンプルソフトウェア数が159個(AN5110参照)と現在最も多く、STM32G0のアプリケーション開発に適していると思います。

この評価ボードとサンプルソフトを活かして開発したソフトは、バリュー・ラインやアクセス・ライン&エンクリプションへも同じシリーズですので、容易に応用・流用が可能です。

また、暗号化機能搭載のアクセス・ライン&エンクリプションSTM32G081RB搭載の評価ボードSTM32G081B-EVAL board:$382を使えば、暗号化認証手順や鍵管理などのセキュリティ関連が効率的に習得できるハズ(?)です。
※セキュリティ関連は、ホストとスレーブの2役が必要など、筆者自身不明な点も多いため、今後別途調査したいと考えています。

STM32G0の入手性と価格

ネット通販が盛んになったおかげで、近頃は新発売後1ヶ月も経っていない最新デバイスであっても、個人で1個から入手できます。

2018年12月24日現在、Mouser(マウサー日本)のアクセス・ラインSTM32G071RB(64ピン/ROM128KB)と、評価ボードNUCLEO-G071RBの価格表です。もちろん代理店経由なら、この価格よりも安く入手できるでしょう。

STM32G0の価格(2018年12月調査)
Mouser入手の場合 数量 価格(JPY
STM32G071RB 1 398
10 360
100 298
1000 213
NUCLEO-G071RB 1 1,203

STM32G0は、たとえ個人でも、入手性良く低価格で入手できると言えるでしょう。

まとめ

新発売STM32G0は、従来メインストームSTM32F0~STM32F1で開発していた広いアプリケーション範囲をカバーできる汎用MCUです。またIoTエッジMCUに必要になる暗号化機能をハードウェアで実装済みの製品もあります。

3種ある製品のうち、アクセス・ラインのSTM32G071RB(64ピン/ROM128KB)実装の評価ボードNUCLEO-G071RB は、STM公式サンプルソフトウェア数が現時点で最も多く、STM32G0の汎用性、広範囲アプリケーション対応性を活かした開発のベースに最適と評価しました。

これら評価ボードとSTM32G071RBデバイスは、個人でも比較的安価に入手できることも分かりました。

マイコンテンプレート活用プロトタイピング開発(4)

マイコンテンプレートへ機能を追加するには、既に枠組みが出来上がっているテンプレートへ、追加機能名のファイルを新規作成し、追加機能をこのファイル内で記述、テンプレートのLauncher()で起動すれば完成です。長文であった第3回を、一口で言えばこうなります(トホホ… Orz)。

Basic Form of Embedded Software (Initial Setting and Repetitive)
無限ループ前に1回実行する初期設定処理と、無限ループ内の繰返し処理の2つから構成される「組込みソフトの基本形」

これは、Arduino IDEの新規作成ファイル画面です。このsetup()とloop()の構造は、Arduinoに限らず全ての「組込みソフトの基本形」です。つまり、無限ループ前に1回実行する「初期設定処理」と、無限ループ内の「繰返し処理」の2つから構成されます。

弊社マイコンテンプレートもこの基本形に則っています。但し、機能追加がし易いように、無限ループがLauncher()に変形し、複数のユーザ関数を起動できるように工夫しているだけです。

従って、最も安直(!?)な機能追加の方法は、追加機能のサンプルソフトを見つけることです。あとはテンプレートのLauncher()でこのサンプルソフトを起動すれば、テンプレートへ機能追加ができるのです。

今回の目標は、テンプレートへのSDカード機能の追加です。そこで、このSDカード機能追加に最適と思うサンプルソフト:Developing Applications on STM32Cube with FatFs:UM1721を解説します。

UM1721: Developing Applications on STM32Cube with FatFs

2014年6月版 UM1721では、STM32Cubeと記述されていますが、これはSTM32CubeMX(以下CubeMX)のことです。また、STM32F4xxとSTM32CubeF4で記述されていますが、全てのSTM32デバイスとCubeMXに置換えて読めば使えます。

FatFsは、ユーザアプリケーションと下層HAL(Hardware Abstraction Layer)の間で機能するミドルウェアで、主目的は、開発するアプリケーションが読書きするデータと、物理ストレージファイルの割付(領域管理)です。パソコンなどでは、本来WindowsなどのOSが行う機能を代行するのがFatFsと考えれば良いでしょう。また、FatFs自体はMCUハードウェアには依存しないので、本稿STマイクロエレクトロニクス以外のマイコンでも使えます。

FatFs Middleware module architecture (Source:UM1721)
FatFs Middleware module architecture (Source:UM1721)

もっと知りたい方は、UM1721の2章までに詳しく記述されています。本投稿は、FatFsを使うサンプルソフトが目的ですので読み進めると、3.3のサンプルソースが見つかります。

FatFsサンプルソフト

FatFs Sample Software (Source:UM1721)
FatFs Sample Software (Source:UM1721)

懇切丁寧なサンプルソフトとは言えませんが、必要最低限で記述しているのでしょう。一見、組込みソフトの基本形と違うと思われるかもしれませんが、初期設定処理はCubeMXが自動生成し、別の場所にソースコードを出力するため(おそらく)省略しています。また、ファイルアクセスは低速なので、繰返し回数を1で処理すると考えれば、このサンプルソフトも基本形に則っています。

サンプルソフトから、FatFsを使うAPI(Application Programming Interface)が5種、FatFsとLow Level Disk I/O Driversをリンクする2種のAPIを使えば、SDカードへの読書きができることが解ります。
※書込み:f_write()を、f_read()に置換えれば読込みができます。

FatFsサンプルソフトで使用するAPI
用途 API
FatFsとアプリケーション間

f_mount()

f_open()

f_close()

f_read()

f_write()

FatFsとLow Level Disk I/O Driversリンク間

FATFS_LinkDriver()

FATFS_UnLinkDriver()

FatFsサンプルソフトAPI動作テスト

このサンプルソフトを、第3回で使用したレファレンスプロジェクトへ挿入し、各APIの動作を確認します。

FatFs Sample API Test Source
レファレンスプロジェクトへ挿入したFatFsサンプルソフト。

結果は、FatFsとアプリケーション間5種全てのAPIで正常動作が確認できました。つまり、レファレンスプロジェクトでは、このサンプルソフトを使いSDカードへの読書きができます。その結果、SDカードへwtext[] = “text to write logical disk”のデータを、ファイル名STM32.txtとして保存できました。

FatFs Write Test to SD Card
FatFsサンプルソフトを使い、SDカードへ書込んだファイルSTM32.txtと書込みデータ。

レファレンスプロジェクトは、Low Level Disk I/O Driversリンク側のAPI相当を、エキスパートが自作しているのでコメントアウトしています。

STM32CubeMXでFatFs機能追加

第3回と同様、シンプルテンプレートをRenameし、機能追加用のSPI1FatFs_Sdプロジェクトを作成し、CubeMXでSPI1とFatFs機能を追加します。また、SdCard.cファイルを作成し、この中に前章で動作確認したサンプルソフトを挿入します(プロジェクトやファイル作成の詳細は、第3回を参照)。

FATFS and SPI1 Functions Add by STM32CubeMX
STM32CubeMXでFATFSとSPI1を追加。SPI1のピン割付は、実装シールド基板に合わせている。

Launcher()からサンプルソフトを起動し、1回のみ処理するように変更を加え、レファレンスプロジェクトと同様各APIのリターン値を確認しましたが、f_open()以降で正常動作しません。

初期設定処理を自動生成するCubeMXのFatFs設定に間違いが無ければ、SPI1FatFs_SdプロジェクトでもユーザデータをSDカードへ読書きできるハズです。UM1721には、FatFsの設定記述がないので、CubeMXのFatFsデフォルト設定にしましたが、お手上げです。

そこで、STM Communityを検索すると、例えばコチラのように現在のCubeMXのFatFsにはバグがあるようです。対策もCommunityにありますが、STMもバグ状況を把握していますのでCubeMXの改版を待つ方が良さそうです。

*  *  *

サンプルソフト自体は、レファレンスプロジェクトで動作確認済みです。CubeMXのFatFs初期設定生成に問題があることは間違いありません。つまり、組込みソフト基本形の初期設定以外の半分(50%)の処理をUM1721から獲得できたと言えます。

Tips: 動作サンプルソフトは、FatFsがMCUハードウェアに依存しないので、他社マイコンでも使えます。獲得した50%処理は、適用範囲が広いものです。

対策としては、STMによるCubeMX改版を待つこと、レファレンスプロジェクトからFatFs関連の初期設定を抜き出すこと、の2つあります。後者については、検討中です。

STM32マイコンへ深層学習実装、「走る」「歩く」動作判断

日刊工業新聞3月7日電子版掲載の日本で2桁成長を狙っているSTマイクロエレクトロニクス、このSTMが、STM32シリーズマイコンへディープニューラルネットワーク:DNN(深層学習)を実装し、マイコンの「走る」「歩く」状態を正確に判断するデモを展示しました。

STM32F7(Cortex-M7)搭載時計でユーザ動作を正確に判断(記事より)
STM32F7(Cortex-M7)搭載時計でユーザ動作を正確に判断(記事より)

マイコンDNN実装の3課題と解決ツール

記事によるとSTM32マイコンへDNNを実装する時の3つの課題、

  • マイコン実装のためのコードサイズ実現
  • ソフトウェア最適化
  • マイコンとクラウドの相互運用性

解決のため、STM32CubeMx.AI(現在αバージョンで2018年後半リリース予定)ツールを使うそうです。

このSTM32CubeMx.AIは、STM32CubeMXの機能拡張版だと思います。
現在のSTM32CubeMXも、全てのSTM32シリーズで共通に使えるAPIを自動生成します(STM32CubeMXのTipsはコチラの投稿も参照)。機種共通API生成とソフトウェア最適化は、既にSTM32CubeMXでも実現済みです。

従って、弊社STM32Fxテンプレートも、STM32CubeMXを使えばSTM32シリーズ全般にテンプレートが適用できるハズです(STM32F0とSTM32F1のみ実機検証済み。APIが共通なので機種差は、インクルードするヘッダーファイルなど数点のみ。他機種は未検証です念のため…)。

※STM32マイコンの開発環境は、弊社ブログのカテゴリで、“STM32マイコン”をクリックすると投稿がカテゴライズされ読みやすくなります。投稿ページの初めの方に開発環境構築方法などの投稿が集まっています。

STM32マイコン重点分野

電子版によるとSTM32マイコンは、自動車、産業用、スマートホームなどのIoT分野を重点にして市場拡大を狙うそうです。STM32マイコンに、上記クラウドAI技術が適用され、その開発環境の使い勝手も良いとなると、かなり期待ができます。