STM32G0xのLPUART利用法

STM32G0xデバイスは、従来からあるSTM32F0/F1デバイス通信機能USARTに、LPUART(Low Power UART)が新たに加わりました。本稿は、このSTM32G0xのLPUART利用法を解説します。

LPUARTとUSART

オンライントレーニング資料:STM32G0 – USARTのP26にLPUARTとUSARTの機能差分があります。

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

USART1/2からIrDA:赤外線とLIN:車載通信機能を除いたサブセット版がLPUARTで、USART3/4より8バイトFIFO付きで高機能です。データシート:DS12232 Rev 2から抜粋した各消費電流が下記です。

LPUARTとUSART消費電流(出典:STM32G071xデータシートRev2)
LPUARTとUSART消費電流(出典:STM32G071xデータシートRev2)

LPUARTは、USART1/2とUSART3/4の中間、USART2.5/3.5が名前として適当かもしれません。API名を考慮し、USART1/2よりもLow Powerという特徴のLPUARTにしたのでしょう。

LPUARTサンプルプロジェクトは1個

前稿STM32G0xのADC利用法STM32G0xのADC利用法で示したように、LPUARTの実践的使い方習得には、AN5110記載のLPUARTサンプルプロジェクト理解が近道です。

しかし、現状の「LPUART」サンプルプロジェクトは、Examples_LLにあるLPUART_WakeUpFromStopの1個のみ、しかも、STM32CubeMXで生成できません(STM32G0x v1.1.0、STM32CubeMX v5.1.0)。
※HAL APIを使うExampleにも、LPUARTサンプルプロジェクトは現状なしです。
※4月末リリースSTM32G0x v1.2.0、STM32CubeMX v5.2.0でも状況は同じです。

一方、STM32CubeMXで生成できるLL API利用「USART」サンプルプロジェクトは多数あります。サンプルプロジェクト流用や活用で自分のソフトウェアを開発する場合、このような需要と供給のミスマッチは良くあります。

このミスマッチ対処方法を以下に示します。

供給USARTサンプルプロジェクトから需要LPUARTプロジェクト作成

初めに示したように、LPUARTはUSART1のサブセット版です。PCとのVirtual COMポート利用なら機能差はありません。従って、以下の手順でUSARTサンプルプロジェクからLPUARTプロジェクトを作成します。

USARTサンプルプロジェクからLPUART プロジェクト作成手順
USARTサンプルプロジェクからLPUART プロジェクト作成手順。簡単な変換作業で新プロジェクト作成ができる。

STM32CubeMXのLow-Layer API利用法 (1)で示したAPIユーザマニュアル:UM2319を見ると、ユーザソースコードAPIのUSART部分をLPUARTに変更すれば、API変換ができることも解ります。

この手順の良いところは、2と3が、簡単にできることです。

STM32CubeMXで生成できるサンプルプロジェクさえあれば、2と3は簡単で、しかもミスなくできます。つまり、サンプルプロジェク活用・流用がより簡単・正確にできます。筆者が、AN5110記載サンプルプロジェクトの中で、STM32CubeMX生成アイコン付きにこだわる理由がこれです。

1. USART_Comminication_Tx_Initサンプルプロジェクト動作確認

STM32CubeMXでUSART_Comminication_Tx_InitをSW4STM32用に生成します。評価ボードCN10#21とJP6のRX、CN10#33とJP6のTXを配線します。起動後USER BOTTONを押すとHyper Terminal(Tera Term)にメッセージが出力されLD4が点灯します。

※STM32CubeMXのSW4STM32用の使い方は、前稿ADC利用法のADC_SingleConversion_TriggerSW_InitのSW4STM32へのインポートの章を参照ください。

USART_Comminication_Tx_Initサンプルプロジェクト動作確認ができました。

USART_Comminication_Tx_Initサンプルプロジェクト実行結果
USART_Comminication_Tx_Initサンプルプロジェクト実行結果

2. STM32CubeMXでUSARTをLPUARTへ変更しコード生成

STM32CubeMXのPinout viewで、USART1をMode: Disable、LPUARTをMode: Asynchronous、115200bps/8Bits Word Lengthに設定します。LPUART1はProject Manager>Advanced SettingsでデフォルトのHALからLLへ変更します。GENERATE CODEでコード生成します。

STM32CubeMXでUSART1をLPUARTへ変更しコード生成
STM32CubeMXでUSART1をLPUARTへ変更しコード生成

3. SW4STM32でユーザコードをUSART APIからLPUART APIへ変更

生成されたSW4STM32の/* USER CODE BEGIN … */~/* USER CODE END … */の間のユーザコードは、コード再生成してもそのまま上書きされます。

従って、ソースコードで旧USART APIが残っているのは、この上書きユーザコード部分だけです。これ以外は、STM32CubeMXがコード生成時にLPUART APIへ変更済みです。

USART_Comminication_Tx_Initの場合は、下図赤線部分などです。これを青線のLPUART APIへ変更します。SW4STM32のFind/Replace機能を使うと、変更がミスなく簡単にできます。

ユーザコードのUSART API(赤線)からLPUART API(青線)へ変更
ユーザコードのUSART API(赤線)からLPUART API(青線)へ変更

4. LPUART変更後のプロジェクト動作確認

USARTからLPUARTへ変更したので、評価ボードCN10#16とJP6のRX、CN10#18とJP6のTXを配線します。起動後USER BOTTONを押すとHyper Terminal(Tera Term)にメッセージが出力されLD4が点灯します。LPUART変更プロジェクトの動作確認が出来ました。
※出力メッセージは、“LPUART project creation …”に変更しました。

作成したLPUARTプロジェクト実行結果
作成したLPUARTプロジェクト実行結果

手順1~4で作成したLPUARTプロジェクトから、LPUARTは、USARTと同じ使い方ができ、40%低電力(Table 33の数値比較)なサブセット版であることが解りました。

STM32G0xデバイスの新通信機能としてLPUARTを積極的に活用したいと思います。

※本章は、LPUARTの細かな使い方は、ソースコードを読めば解るという前提で説明しています。ソースコードの具体的な読み方は、前稿:STM32G0xのADC利用法のmain.cソースコードの読み方の章などを参考にしてください。

STM32G0xの実践的LPUART利用法まとめ

実践的に周辺回路利用法を習得するには、サンプルプロジェクト理解が近道です。

現状のSTM32G0x v1.1.0、STM32CubeMX v5.1.0は、LPUART習得に使えるサンプルプロジェクはLPUART_WakeUpFromStop の1個のみで、STM32CubeMXを使って生成はできません。
※4月末リリースSTM32G0x v1.2.0、STM32CubeMX v5.2.0でも状況は同じです。

一方、現状でもSTM32CubeMXで生成できるUSARTサンプルプロジェクトは多数あるので、これらを利用し、求めるLPUARTプロジェクトを作成する簡単でミスの少ない手順を示しました。

作成したLPUARTプロジェクトから、LPUARTは、USART1/2と同じ使い方で40%低消費電力な新通信機能であることが解りました。

訂正のお知らせ:STM32CubeMX 5.1.0でSTM32G0 1.1.0公式サンプルプロジェクト生成可能

前投稿で2019年3月末時点ではSTM32G0 V1.1.0の公式サンプルプロジェクト内の付属STM32CubeMX全プロジェクトファイルが未完成と書きましたが、一部改善されました。
つまり、公式サンプルプロジェクトExamples_LLがSTM32CubeMXで生成可能になりました。

お詫びして😔、訂正いたします。

STM32CubeMXは、起動毎に更新チェックやインストール済みのMCUパッケージを自動更新します。STM32G0 1.1.0のままプロジェクトファイルからの生成が可能に変わりましたので、STM32CubeMX本体が更新されたと思うのですが、版数はVersion 5.1.0のままで変わりません(何回か起動を繰返すと正常化するのかもしれません😅、同じ症状の方はお試しを…)。

なんにせよ、STM32G0x専用テンプレートで使うSTM32CubeMXのLL(Low-Layer) API開発には朗報に変わりありません。めでたしめでたしです。

朗報:STM32G0公式サンプルプロジェクトがSTM32CubeMXで生成可能

STマイクロエレクトロニクス(以下STM)の新MCU:STM32G0xシリーズだからこそできた快挙です。AN5110 – Rev 3 – February 2019で、STM32G0公式サンプルプロジェクトが、付属STM32CubeMXプロジェクトファイル(拡張子.ioc)で生成できるようになりました(Table 1のMXアイコン部分)。

AN5110のTable 1
AN5110掲載のTable 1(一部抜粋)

従来サンプルプロジェクトとSTM32G0サンプルプロジェクト比較

例えば、従来のSTM32F0公式サンプルプロジェクトは、エキスパート自作のもの(多分、むかしの標準ペリフェラルライブラリ利用)でした。STM32ソフトウェア開発は、今はSTM32CubeMXコード生成出力へユーザコードを追加する方式です。

従って、従来サンプルソースコードを利用するには、エキスパート作成の必要部分を解読後カットし、STM32CubeMXで生成した自分のソースコードへペーストして流用してきました。

AN5110は、この公式サンプルプロジェクトが、付属STM32CubeMXで直接生成できることを示しています。サンプルプロジェクト流用・活用が、これまで以上に簡単・便利になります。従来のソースコードカット&ペーストから、付属STM32CubeMX変更と生成コードへユーザコードを追加すれば済むからです。

STM32ソフトウェア開発の最重要ツール:STM32CubeMX活用に即した方法がAN5110と言えます。

2019年3月末時点では付属STM32CubeMXプロジェクトファイル未完成

重要なのは、ここからです。

3月末時点では、公式サンプルプロジェクト内のSTM32CubeMXプロジェクトファイルが未完成です。例えば、Table 1一番上のNucleo-G071RBのADC_AnalogWatchdogプロジェクト付属STM32CubeMXプロジェクトファイルを開いた様子が下図です。

ADC_AnalogWatchdogの.ico
図1 ADC_AnalogWatchdogサンプルプロジェクト付属STM32CubeMXプロジェクトファイルの.iocを開いた様子

このままコード生成してもADC_AnalogWatchdogサンプルプロジェクトはできません😴。

ADC_AnalogWatchdogプロジェクトだけではなく、全ての公式サンプルプロジェクトで同様です。

つまり、現時点では、残念ながら公式サンプルプロジェクト内の付属STM32CubeMXプロジェクトファイルは未完成です。公式サンプルプロジェクトの素:STM32G0 1.1.0改版を待たねば、AN5110は実現しません。
前投稿で書いたようにSTM32G0 1.1.0(2019/02/26)は、STMに買収されたAtollic TrueSTUDIOへも未対応でした(図1にTrueSTUDIOフォルダが無いことからも判る)。

新しいMCU発売にはありがちですが、開発に一番重要なツール完成には、開発元ベンダーであっても年単位の時間が必要です(AN5110 Revision historyより)。

STM32CubeMXを使って公式サンプルプロジェクトを生成するAN5110の方向性は、正しいと思います。
新MCU:STM32G0シリーズSTM32G0だけでなく、他の既存MCU:STM32F0/F1シリーズSTM32F0/F1などもこの方向の対応を期待します。

まとめ

以上のように、STM32G0x専用テンプレート開発環境は整いつつありますが、少し待ってから、具体的には、STM32CubeMXへインストールするSTM32G0xシリーズMCUパッケージ、STM32G0 V1.1.0改版を待ってから先へ進めた方が良さそうです。

この改版までの待ち時間は、STM32G0x専用テンプレート開発で使うLL(Low-Layer)APIの習得に充てます。