STM32CubeIDE v1.0.1更新

STマイクロエレクトロニクス(以下STM)のSTM32マイコンマンスリー・アップデート2019年7月号P9に、STM32CubeIDEのv1.0.1更新が記載されています。

STM32CubeIDE v1.0.1更新内容

内蔵のコード生成ツールSTM32CubeMXがv5.2.0からv5.2.1に変更されたこと、バグ修正が主な更新内容です(RN0114(2019/07/11))。

STM32CubeIDE v1.0.1更新内容
STM32CubeIDE v1.0.1更新内容

最新のSTM32CubeMX v5.2.1により、STM32G0x LL APIを活かしたソフトウェア開発がSTM32CubeIDE v1.0.1でも可能となりました。つまり、弊社推薦のSTM32MCU開発環境:SW4STM32+STM32CubeMX v5.2.1+STM32G0 FW 1.2.0と同じ土俵に今回の更新でなった訳です。

関連投稿:続報STM32CubeIDE

ベースEclipse IDE状況

STM32CubeIDE v1.0.1のベースEclipse IDE は、ECLIPSE™ 2019-03 です。Eclipse最新版は、ECLIPSE™ 2019-06(2019/06/19)ですので、ベースに合わせてSTM32CubeIDEも更新されるでしょう。

Eclipse IDEは、昨年の2018年6月までは、Photon、Oxygen、Neonなどのリリース名が付いていましたが、6月以降は、ECLIPSE™リリース年-月に変更されました。3か月毎に更新され、次回は2019-09予定です。
※メジャー/マイナー更新かは、判りにくくなりました。

STM32CubeIDE v1.0.1使用所感

今回の更新で期待していた日本語対応に関しては、旧STM32CubeIDE v1.0.0からの改善は見られません。

例えば、SW4STM32プロジェクトをSTM32CubeIDEへインポートすると、日本語ソースコードコメントが文字化けします。Preferences>Text Editors>Colors and Fontsを変えても同様です。

付属エディタを使っての直接日本語入力は問題ありませんが、SW4STM32からのマイグレーションツールでの文字化け発生は、回避手段があるとは思いますが面倒です。Atollic社)TureSTUDIO最終版で見せた日本語メニュー実装などは、先の話になりそうです。

また、旧v1.0.0では正しく表示されていたInformation Centerページも、‘表示できません’となります。

RN0114の2.3 Known problems and limitations項目も多いので、あえて今すぐにSW4STM32に変えてSTM32CubeIDE v1.0.1を使う必要性は感じません。土俵(付属開発ツール版数)が同じになっただけです。

現行SW4STM32 → 新STM32CubeIDE切替えタイミング

コードサイズ制限無しのSTM32MCU無償IDEは、旧Atollic社)TrueSTUDIOは既にDiscontinue、AC6社)SW4STM32も新デバイスへの更新をしない可能性が高いと思います。新しいIDE:STM32CubeIDEへ切替えるタイミングが、そろそろ近づいてきました。

筆者としては、SW4STM32の更新状況を注視しつつ現行IDE使用を維持し、次回のSTM32CubeIDE更新タイミングで新IDEへ切替えるつもりです。

STM32G0動画と専用テンプレート

STマイクロエレクトロニクス(以下STM)の公式ブログで、STM32G0を理解できるPart.0~10の動画(英語版)を紹介しています。
各動画は、休憩時間に視聴するのに丁度良い6分から15分程度の長さです。

動画リスト

13:13     Pt. 0, Install Procedure

6:05       Pt. 1, Saving Content of the Flash of the STM32

13:47     Pt. 2, Blinky

13:09     Pt. 3, PWM

9:10       Pt. 4, External Interrupt

14:20     Pt. 5, Low Power (Pt. 1)

6:23       Pt. 6, Low Power (Pt. 2)

13:19     Pt. 7, Printf

13:27     Pt. 8, Low Layer Drivers

17:37     Pt. 9, DMA

15:14     Pt. 10, Flashing STM32

少し聞きにくい英語ですが、スライドを見るだけでも内容は解ると思います。

開発環境

動画のIDEは、KeilのSTM32G0/F0/L0専用無償版を使っています。既にSTM32CubeIDEやSW4STM32を利用中の方は、これらIDEとKeil専用版を同時インストールすると、STM32G0/F0/L0のみコンパイル可能となるトラブルが発生するらしいので注意してください。

IDE以外は、コード生成ツール:STM32CubeMX、評価ボード:Nucleo-G071RB、通信アプリ:Tera Termなどおなじみの環境での解説です。

STM32G0のSTM32F0/F1をカバーする広い守備範囲、Low Layer API開発メリットや重要性などが理解できると思います。残念なのは、STM32G0x全シリーズ搭載の最新ADC解説が無いことです。ADCに関しては弊社関連投稿を参照ください。

STM32G0x専用テンプレート

動画Part8紹介のLL APIを活用したSTM32G0x専用テンプレートを発売中です。

STM32G0xシリーズのプロトタイプ開発着手時に必要となるLPUARTやLED制御などの複数サンプルソフトがあらかじめ実装済みで、評価ボードADC入力変換値のTera Term出力も実装済みです。

STM32G0xシリーズ性能をフルに発揮したアプリケーション早期開発や、STM32G0習得に最適です。

ご購入、お待ちしております。

続報:STM32CubeIDE

2019年5月8日STマイクロエレクトロニクス(以下ST)公式ブログで無償STM32CubeIDEの続報が掲載されました。STM32マンスリー・アップデート2019年5月号のトップページにも掲載中です。

STM32CubeMXがビルドインされたST初のIDE:STM32CubeIDE内蔵ツール版数と、ライバルIDEに相当するSW4STM32とTrueSTUDIOの今後を予想します。

STM32CubeIDE内蔵ツール版数

STM32CubeIDEにビルドインされたツール版数が下記です。FWは、本ブログ対象STM32F0/F1/G0のみ掲載します。ビルドインSTM32CubeMXの使い勝手は、単独STM32CubeMXツールと同じです。

内蔵ツール 2019年5月16日版数
STM32CubeIDE 1.0.0
STM32CubeMX 5.2.0
STM32F1  FW 1.7.0
STM32F0  FW 1.10.0
STM32G0  FW 1.2.0

STM32CubeIDE起動時に各ツール更新がチェックされるので、起動に多少もたつきを感じます。MicrosoftのC2R:Click to Runに近い機能です。

STM32G0 FW 1.2.0インストールには、STM32CubeMX 5.2.0以上が必要な点は注意が必要です。単独でSTM32CubeMX 5.1.0使用中の方が、FW更新してもSTM32G0 FW 1.2.0の検出すらできません。先ず、STM32CubeMXを 5.2.0へ更新後、再更新チェックでSTM32G0 FW 1.2.0が使えます。

全てがビルドインされたSTM32CubeIDEなら、このような版数による最新版インストールトラブルが回避できるでしょう。

STM32CubeIDEのAdvanced Debug機能

STMCubeIDE you are able to(出典:How to use STM32CubeIDE動画)
STMCubeIDE you are able to(出典:How to use STM32CubeIDE動画)

How to use STM32CubeIDEから抜粋したSTM32CubeIDE新機能が上図です。Advanced DebugのLive Expressions viewやSWV real-time tracing viewは、デバッグがより楽しく容易になる機能だと思います。

STM32CubeIDEライバル、無償AC6)SW4STM32と旧Atollic)TrueSTUDIOの今後

気になるのは、STM32CubeIDEと同様のコードサイズ制限なし無償IDE、AC6社)SW4STM32と旧Atollic社)TrueSTUDIOの2つのIDEが、今後更新され続けるかです。

ブログ内に、SW4STM32とTrueSTUDIO各ユーザに向けた注意書きがあります(Before STM32CubeIDE, What SW4STM32 and TrueSTUDIO Users Must Know章)。ブログでは、どちらのIDEユーザに対しても新しいSTM32CubeIDEへの移行を促しているようです。有償のIARとKeilのIDEに対しては、これまで通りです。

TrueSTUDIOは、既にSTM32G0 FW 1.2.0未対応です(関連投稿:TrueSTUDIOとSTM32CubeMXインストール方法の手順4参照)。SW4STM32は、最新デバイスをフォロー中ですが、近い将来、TrueSTUDIOと同じ運命、つまり、ツール改版への遅れや最新MCUへ対応しない可能性があります。

2017年末にSTに買収されたAtollicのIDE開発力が、新しいST純正STM32CubeIDE開発へ使われたとすると、現行のTrueSTUDIOが最新STM32G0xデバイスに未対応なのも納得がいきます。いわゆるデスコン(Discontinue)の前兆です。

なお、既成SW4STM32プロジェクトやTrueSTUDIOプロジェクトに対しては、STM32CubeIDEマイグレーションツール(UM2579など)がSTM32CubeIDE初期画面に用意されています。既成プロジェクトは、そのままSTM32CubeIDEで開くことはできず、また、一旦マイグレーションすると、元のSW4STM32プロジェクトへは戻せません。

このため、UM2579では、既成プロジェクトをバックアップ後、マイグレーションすることを明記しています。

STM32CubeIDE初期画面のマイグレーションツール(出典:UM2579)
STM32CubeIDE初期画面のマイグレーションツール(出典:UM2579)

STM32CubeIDEの使い勝手は、SW4STM32に近く、しかもAdvanced Debug機能でデバッグも面白くなりそうです。現版STM32CubeIDE 1.0.0は日本語対応がイマイチです。この点が改良されればSW4STM32からのマイグレーションを検討する予定です。

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%低消費電力な新通信機能であることが解りました。

速報:STM32CubeIDE

STマイクロエレクトロニクス(以下STM)公式ブログで、中国で開かれたSTM32 SummitにおいてSW4STM32とTrueSTUDIO、STM32CubeMXを統合した新しい統合開発環境:STM32CubeIDEを発表しました。

STM公式ブログ:STM32CubeIDE Makes a Massive Appearance in China。STM32CubeIDEは、既にSTMサイトよりダウンロード可能です。

STM32CubeIDE(出典:STMサイト)
STM32CubeIDE(出典:STMサイト)

STM32CubeIDEの主な特徴

  • EclipseベースIDE
  • マルチOS対応(Windows、Linux、macOS)
  • SW4STM32とTrueSTUDIOプロジェクトのインポート機能

STM32CubeIDE

早速STM32CubeIDEをインストールしてみました。所感は、STMが買収したAtollic® のTrueSTUDIOというよりむしろ、SW4STM32へSTM32CubeMXをプラグインしたような画面です。

STM32CubeIDE画面
STM32CubeIDE画面。SW4STM32へSTM32CubeMXをプラグインした画面に近い。

STM32CubeIDE v1.0.0は、最新版STM32CubeMX v5.2.0とSTM32G0 FW v1.2.0/STM32F0 FW v1.10.0 /STM32F1 FW v1.7.0など開発に必要となるツールもパッケージとしてインストールできます。従来の個別インストールとツールアップデートが面倒だと感じる方には、朗報になるでしょう。

現在STM32G0x専用テンプレート開発は、SW4STM32で継続中です。しかし、販売時にはこのSW32CubeIDEでリリースする方が、SW4STM32からのマイグレーションガイドUM2579も付属済みですので良いかもしれません。

マイグレーション操作は簡単です。販売中のSTM32Fxテンプレートへもこのマイグレーションで対応できると思います。

STM32MCU開発環境の場合、IDE、STM32CubeMX、デバイス毎のFW、これら3つのバージョンがともに最新でないと、上手く動作しないことや不具合発生はありえます(例えば、STM32CubeMX v5.1.0では最新のSTM32G0 FW v1.2.0がインストールできないなど)。

STM32CubeIDEの出現で、バージョン管理が容易になれば良いと思います。以上、速報をお伝えしました。
動画がコチラで見られます。

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利用法 (2)

STM32G0x専用テンプレートで使うSTM32CubeMXのLL API利用法第2回は、LL APIとHAL APIの違いを説明します。
専用テンプレートはLL、汎用テンプレートはHALを使う理由がお判りになると思います。

LL(Low-Layer)とHAL(Hardware Abstraction Layer)相対比較

第1回で示したLL API関連資料一覧のUM2319の最初のページに、LLとHALの定義が示されています。

・LL:HALよりもハードウェアに近く、高速で軽量なエキスパート向けレイヤー
・HAL:ハードウェア抽象化で、STM32MCU間で最大限の移植性を保証するレイヤー

MCUハードウェアに依存するLLは、高速・軽量ですが移植性が低いので、LL APIを利用するソフトウェア(=アプリケーション)はそのMCU専用になります。一方、HALはMCU移植性が高いため、HAL API利用アプリケーションはSTM32MCU間で汎用的に使えます。

HALの方が現代的で少ないユーザ記述でアプリケーション開発ができ、さらに汎用なので開発労力が無駄にならない利点があります。しかし、HALが隠蔽している制御の分Flash(ROM)やRAM容量が必要で、LLに比べ低速です。モーター制御など高速処理が必要な部分にはLLの方が向いているかもしれません。

以前の投稿STM32CubeMXの使い方で示した、HAL APIとLL API相対比較表を再掲します。

HALとLL比較(出典:STM32 Embedded Software Overvire)
HALとLL比較(※説明のため着色しています。出典:STM32 Embedded Software Overvire)

専用テンプレートと汎用テンプレート

LL APIの利点は、ハードウェア性能を活かし少ない容量で高性能アプリケーション開発ができる点です。これは、小Flashで高性能なSTM32G0xデバイスに最適と言えるでしょう。

現状はSTM32G0xが「単独デバイス」でSTM32F0/F1両方のMCU性能をカバーしているので「専用テンプレートが最適」だと言えます。しかし、「STM32G0xシリーズに更に高性能なSTM32G1xデバイス」が発売されれば、移植性が高いHALでSTM32G0xソフトウェア開発を行う方が良くなる可能性はあります。

但しこの場合には、HAL API利用の販売中汎用STM32FxテンプレートをSTM32G0xデバイスへ適用すれば済みます。汎用性を示すこの適用例は、近く投稿する予定です。

特定ハードウェア性能を活かす専用アプリケーションが、少ないROM/RAM容量でも開発できるLL APIメリットを示すデバイス例としてSTM32G0xを選び、専用テンプレートを開発中です。

LL APIとHAL APIのアプリケーションサイズ実例比較

LL API利用時、容量がHAL APIに比べどの程度小さくなるかを実例で示します。

これも前の投稿STM32CubeMXの使い方で示したように、一般的にはLLの方がHAL比60~80%小さくなると言われます。

実例に評価ボードNucle-G071RBに処理は何もせず、64MHz動作のみをLL APIとHAL APIだけを変えてビルドした結果が下記です(SW4STM32 v2.8.1、STM32CubeMX v5.1.0、STM32G0 v1.1.0)。

  text data bss 使用容量 容量比(%)
LL API 3120 12 1564 4696 59
HAL API 9680 20 1708 11408 100

LL API利用の方が 59%小さく実現できることが判ります。

LL APIとHAL API混合利用時の注意点

AN5110には、LLとHAL両方を混在させた公式サンプルプロジェクトのExamples_MIXがNucleo-G071RBでも9例と少ないながら掲載されています。

LLとHAL混在利用の公式サンプルプロジェクト(出典:AN5110)
LLとHAL混在利用の公式サンプルプロジェクト(出典:AN5110)

LLとHALを混在利用時は、色々な注意点があります。UM2319の5章に詳細がありますが、一部抜粋します。

・同じ周辺回路をHALとLLで混在制御するのは避ける
・LLはHALがハンドルしているレジスタを上書きすることがあるので注意

また、UM2303の2章にLLとHALの示すアーキテクチャが示されています。

STM32CubeG0 Firmware Architecture(出典:UM2303)
STM32CubeG0 Firmware Architecture(※説明のため着色しています。出典:UM2303)

つまり、上層HALが下層LLを利用する場合がある訳です。LLは、HALがどのように周辺回路を制御しているかを知ることなく直接ハードウェアレジスタにアクセスします。混在時はレジスタ競合などの詳細な注意がAPI利用者側で必要です。

Nucleo-G071RB 利用時LLとHAL混在利用は、Examples_MIXの9例を除いては避けた方が良さそうです。
BSP(Board Support Package)も、同じ理由でSTM32G0x専用テンプレートには使いません。

※以上は、同一周辺回路でLLとHALを混在利用する場合の注意点です。
※では、周辺回路が異なれば混在は問題ないのでしょうか? 例えば、I2CはHAL、GPIOはLLの場合などです。この場合でも、HALがLLを利用することを考慮すると、アプリケーションレベルでの安全側評価では混在は避け、LLまたはHALに統一して利用する方が無難だと思います。

STM32CubeMXのLow-Layer API利用法 (2):LL APIとHAL APIの違いまとめ

STM32G0x専用テンプレートは、HAL APIとの混在利用は避け、LL APIのみで開発します。

従って、STM32G0xデバイス専用のアプリケーションとなります。
汎用テンプレートSTM32Fxテンプレートは、HAL APIを使っていますので、STM32MCUで汎用的に使えるアプリケーションです。
※このSTM32Fxテンプレート汎用性を示すため、STM32G0xデバイスへこの汎用テンプレートを適用した例を示す予定です。

LLとHAL混在アプリケーション開発は、レジスタアクセス競合などの詳細注意が、API利用アプリケーション側で必要です。
公式サンプルプロジェクトExamples_MIXで示されたやむを得ない場合を除いては、避けた方が無難です。

STM32のStep-by-Step Guide

STマイクロエレクトロニクス(以下STM)公式ブログのカテゴリ:TutorialsからSTM32開発環境を構築する方に最適な投稿を見つけたので、紹介と気になる点を示します。

Step-by-Step Guide

STM32 step-by-step learning program
STM32 step-by-step learning program

2018年10月8日が投稿日のこの記事は、STM32の開発環境(IDE)構築から評価ボード、UART接続、IoT評価ボードとスマホ接続などを5つのStepで示しています。内容は、前後半の2つに大別できます。

前半は、Step1(45分)で開発環境を構築し、Step2(30分)でSTM32CubeMXとHAL説明、Step3(34分)で評価ボード(NUCLEO-L476RG)とUART利用のPC通信を紹介するなど、内容は、弊社昨年のブログ投稿の最新版と言えます。

後半は、Step4(60分)でIoT評価ボードDiscovery kit IoT node (B-L475E-IOT01A)(DigiKeyにて¥6,370販売中)の使い方、Step5(30分)でAndroidスマホと同評価ボードをBLEで直結し、IoTシステムを構築しています。

IoT評価ボードは、Cortex-M4(915MHzまたは868MHz)を使い、Arduinoコネクタ、モーション、ジェスチャ、環境センサなどが実装済みなので、スマホで取得センサデータを視覚化できます。さらにAWS(アマゾン ウェブ サービス)経由でも接続できるので、本格的なIoTノード開発・評価にも使えそうです。AWSとの接続方法は、コチラの動画(11分12秒)に解説されています。
※動画閲覧にはログインが必要です。

関連投稿:Amazon、IoTマイコンへFreeRTOS提供

気になる点1:TrueSTUDIO

STMは、2017年12月に統合開発環境TrueSTUDIO開発元のAtollic社を買収しました。その結果、無償IDEのラインナップは従来と同じですが、開発会社の説明が変化しました。

関連投稿:2018マイコンベンダ最新ニュースのSTM章参照

STM32ソフトウェア開発スイート(要ログイン)のページで説明します。License typeでフィルタすると、無償版IDEラインナップが表示されます。SW4STM32欄のShow more…をクリックすると下段に“This product is supplied by a third party NOT affiliated to ST”の記述があります。これが気になる点です。

IDE License type Free検索結果
IDE License type Free検索結果。SW4STM32には、”not affiliated to ST”の記述がある。

この記述は、TrueSTUDIO欄には無く、代わりにProduct Imageに“ST acquires Atollic”と記載され、STとAtollicのロゴが表示されます。つまり、STMの無償IDEは、TrueSTUDIOが標準?の感じです。

TrueSTUDIOのProduct Image
TrueSTUDIOのProduct Imageは、STとAtollicのロゴが表示

従って、新たにSTM開発環境を構築される方は、TrueSTUDIOを選ぶと良いかもしれません。これを裏付けるのが、Step1紹介のIDEがTrueSTUDIOだということです。TrueSTUDIOがSW4STM32とほぼ同様に操作できるのは、コチラの動画(9分42秒)で解ります。

弊社2017年9月発売のSTM32FxテンプレートもSW4STM32を使っていますが、これもTrueSTUDIOに変えた方が良いかもしれません。但し、TrueSTUDIOには、SW4STM32プロジェクトをそのままインポートする機能が備わっていますので、二手間のOKクリックが増えますがしのげそうです(Step4のP8、Appendix Porting an AC6 example to TrueSTUDIO参照)。

Porting SW4STM32 project to TrueSTUDIO(出典:Step4)
Porting SW4STM32 project to TrueSTUDIO(出典:Step4)。OK2回クリックでSW4STM32プロジェクトをTrueSTUDIOへインポートできる。

IDEポーティングは、MCUベンダーが、古いIDEから新しいIDEへ替える時に良く使う方法で、NXP(Kinetis Design Studio→NXP Expresso)、ルネサス(Hew→CS+)などでもおなじみです。SW4STM32→TrueSTUDIOがあるのも、STMがTrueSTUDIOを推薦しつつある証と言えるでしょう。

気になる点2:Edge MCUとNode MCU

Step-by-Step Guide資料が前後半で使用MCUと評価ボードが2つに別れたように、前半のEdge MCUと後半のNode MCUの2つの機能に分かれてIoT MCUが発展する気がします。

  • Edge MCU:低消費電力でIoTデータ取得(アナログフロントエンド)機能を備えたMCU。従来のベアメタル開発の延長・発展形。
  • Node MCU:AWSなどIoTネットワーク出入口の無線、高度なセキュリティ機能を備えたMCU(Edge MCUを包含する場合あり、例:Discovery kit IoT node)。FreeRTOSなどのOS実装は必須で、従来MCUより高機能・高性能、1GHzにせまる高速動作。

※ベアメタル開発:OSなどを使わないMCU開発

Edge MCUとNode MCUの違いは、端的に言えば、ベアメタルソフトウェア開発かRTOSソフトウェア開発かです。MCUソフトウェア開発者も、ベアメタルとRTOSの2つに分かれるかもしれない、というのが第2の気になる点です。

Edge MCUだけではIoTに接続すらできません。Node MCUがIoT接続に必須になりつつある気がします。

STM32CubeMXの使い方Tips

STM32CubeMXは、STM32Fxマイコンのコード生成ツールとして良く出来ています。但し、現状1つ残念なことがあります。HAL:Hardware Abstraction Layerに加え、BSP:Board Support Packagesをドライバとして出力しないことです。そこで、現状のHALドライバのみ出力に対策を加えます。

STM32CubeMX
STM32CubeMX

STM32Fxファームウエア構成

STM32Fx Software Structure
STM32Fx Software Structure

STM32Fxファームウエア構成が上図緑線の個所です。STM32Fxマイコンサンプルソフトは、使用するファームウエアライブラリに応じて、Low Layer examples、Mixed HAL & Low Layer examples、HAL examplesの3種類あります。

各ファームウエアの差や、サンプルソフトの場所は、以前記事で解説しました。ここでは、STM32F0からSTM32F1へのポータビリティが最も高いHALライブラリ(=ドライバ)を使うサンプルソフト:HAL examplesに的を絞って解説します。

HAL Examples

このサンプルソフトの優れた点は、評価ボード実装済みの青SW(USER Blue)と緑LED(LD2)のみで全てのサンプルソフト動作を確認できることです。SW入力と、LED点滅間隔を変えることで、正常/NG/入力待ちなど様々なサンプルソフトの動作状態を表現します。

この青SWと緑LEDを制御するには、GPIO定義とHALライブラリを組合せた一種のサブルーティンがあると便利です。このサブルーティンが、BPS:Board Support Packagesです。例えば、下記などです。

BSP_LED_On()、BSP_LED_Off()、BPS_LED_Toggle()、BPS_PB_GetState()

BSP_が先頭に付いているので、一目で評価ボード実装済みの青SWや緑LEDを制御していることが判りますし、HALライブラリを使って表現するよりも、可読性もより高まります。BPSの中身は、HAL自身ですので、Drivers層のBSP、HALともに同じ黄緑色で表示しています。

HAL exampleは、これらBSPとHAL両方を使って記述されています。

STM32CubeMX

STM32CubeMXは、最初に使用する評価ボードを選択後、コード生成が行えます。

STM32CubeMX Board Selector
STM32CubeMX Board Selector

但し、生成コードに含まれるのは、HALドライバのみです。BSPは、HALサブルーティンですので、自作もできますが、評価ボードを選択するのですから、せめてHALのみか、それともHALとBSPの両方をドライバとして出力するかの選択ができるように改善してほしい、というのが私の希望(最初に言った現状の残念なこと)です。

もしHALとBPSドライバ両方がSTM32CubeMXで出力されると、多くのHAL Examplesを殆どそのまま流用できるメリットが生じます。HAL Examplesは、残念ながらエキスパートの人手で開発したソースですが、これを自動コード生成の出力へ、より簡単に流用できる訳です。

STM32CubeMX出力ファイルへのBSP追加方法

BSPドライバを自動出力しない現状のSTM32CubeMXで、上記希望をかなえる方法は、簡単です。

STM32CubeMX出力ファイルへのBSP追加
STM32CubeMX出力ファイルへのBSP追加

手動でBSPのstm32f0xx_nucleo.cとstm32f0xx_nucleo.hをSTM32CubeMX生成プロジェクトのSrcとIncフォルダへコピーし、main.cのL43へ、#include “stm32f0xx_nucleo.h”を追記すればOKです。
※stm32f0xx_nucleo.c/hは、\STM32Cube\Repository\STM32Cube_FW_F0_V1.8.0\Driversにあります。

たとえSTM32CubeMXで再コード生成しても、stm32f0xx_nucleo.c/hはそのままですし、追記した部分もそのまま転記されます。この方法で、HAL Examplesの流用性が向上します。

HAL Examplesを読むと、周辺回路の細かい設定内容が解ります。この設定をそのままSTM32CubeMXに用いれば、周辺回路の動作理解が進み、さらに自動コード生成ソースへ、Examplesソースをそのまま流用できるので、評価ボードでの動作確認も容易です。

まとめ

現状のSTM32CubeMXは、BSPドライバを出力しません。対策に、手動でBSPドライバを追加する方法を示しました。これによりエキスパートが開発したサンプルソフトを、より簡単に自動生成ソフトへ組込むことができます。

開発中の弊社STM32Fxテンプレートも、サンプルソフトを流用/活用が使いこなしのポイントです。そこで、このBPSを組込む方法をSTM32Fxテンプレートへも適用し、サンプルソフト流用性向上を図っています。

STM32F0ソフトをF1変更時のHAL利用効果

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へ変更が必要です。

HALライブラリインクルード:STM32F0(左)とSTM32F1(右)
HALライブラリインクルード:STM32F0(左)とSTM32F1(右)

(2)割込み:NVICプログラマーズモデル

Cortex-M0/M0+は、割込み最大数32、優先度レベル4、一方Cortex-M3は、割込み最大数240、優先度レベル8~256とコアで異なるモデルですので、割込み関連ヘッダファイルの変更が必要です。

NVICプログラマーズモデル:STM32F0(右)とSTM32F1(左)
NVICプログラマーズモデル:STM32F0(右)とSTM32F1(左)

※STM32Fxシンプルテンプレートは、SysTick割込み以外はポーリングを使っています。GPIO割込みは、未使用です。この箇所は、デモソフトのGPIO割込み利用部分が参考になるため、テンプレートにそのまま流用した結果、変更が必要になった箇所です。

テンプレートへGPIO割込み処理を追加し、更にARMコアを変更する場合には、このNVICプログラマーズモデルの違いで変更が必要になります。

*  *  *

HALライブラリを使った結果、上記2か所以外のユーザソース、ヘッダファイルは、STM32F0とF1のMCUで共通化できました。共通ソースコードの一部を示します。動作クロックが48MHzと64MHzと異なりますが、同じHAL API:HAL_UART_Transmit()によりUART2送受信(19200bps 8-Non-1)ができています。

HAL_UART_Transmit()によるUART2送信
HAL_UART_Transmit()によるUART2送信

Cortex-M3のSTM32F103RB(64MHz)動作STM32Fxシンプルテンプレートファイル構成が下記です。

Simplate Template for STM32F1 Project Explorer
Simplate Template for STM32F1 Project Explorer

弊社が追加したソースファイルやヘッダファイルは、Pascal形式でファイル名を付けますので、図示のように赤で色分けしなくても一目でSTM32CubeMX生成ファイルとの区別ができます。

STM32CubeMX生成ファイルのHALライブラリインクルード部分は、STM32CubeMXが当該HALライブラリ(stm32f1xx_hal.h)を、また割込みは、当該NVICプログラマーズデモルに応じたソースを「上書きで」生成しますので、コア載せ替えによる修正箇所は、弊社追加ソースファイルとヘッダファイルに限定できます。

この限定ファイル(1)と(2)の個所のみを変更すれば、STM32F0ソースコードをF1へそのまま使えます。HALライブラリ利用によるソース/ヘッダの共通化効果は、非常に高いと言えるでしょう。

弊社ソースファイル、ヘッダファイルの変更箇所は、#ifdefプリプロセッサを使って、コアによる差分箇所を1つへまとめることも可能です。リリース版では、これを採用したいと考えています。HALライブラリ利用により、ARMコアに依存しないSTM32Fxテンプレート構想(x=0 or 1)が実現します。