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専用テンプレートは、近日中に発売予定です。