STM32は従来のFシリーズ、Lシリーズの他、Gシリーズ、Hシリーズなどバリエーションが増えています。
STMicroの分類表によると、STM32G4はミックスド・シグナル・アプリケーションに最適化されSTM32F3の上位に位置するようです。基本スペックはCortex-M4/170MHzとなっており、Cortex-M4/180MHzのF4に匹敵します。
Nucleo32のNucleo-G431GBを購入したので実行速度を測定しました。手持ちのF303K8、F446RE、F767ZIを比較対象としました。
左から、F303K8、G431KB、F446RE、F767ZI。
STM32CubeIDEのバージョンは1.7.0です。
G431KBのBuild
Clockの設定
STM32CubeIDEでTarget BoardをNucleo-G431KBとして初期化すると、デフォルトではHSE(外部クロック)が無効化されています。
ボード上にクリスタル(X2)が実装されているようですが、ボード上のはんだブリッジで設定する必要があります。
※赤点線で囲ったあたりがはんだブリッジ
UM2397: STM32G4 Nucleo-32 board User Manualより
HSEを使う場合はSB9とSB10をブリッジします。またMXでクロックのソースを指定するとHSEが使えるようになります。
Pinout & Configuration
System Core
RCC
RCC Mode and Configuration
High SpeedClock(HSE): Crystal/Ceramic Resonator
HSEが有効化された状態
ただし、はんだブリッジのパターン自体はそれほどでもないのですが、周りに微小なSMD部品が配置されているので、はんだ付けに注意が必要です。また、170MHzの信号を測定する環境もないため、今回はHSEは試さずHSIを使うことにしました。HSIでもデフォルトで170MHz駆動することができます。
GPIO出力のの実行速度を測定
実行速度を測定する場合、測定する処理の前後でGPIOをHigh/Low出力して、オシロで間隔を測定することが多いので、手始めとして何も処理をせず単にGPIOをHigh/Lowさせた場合にかかる時間を測定しました。
MXの設定
Target BoardにNucleo G431KBを指定してデフォルトで初期化した後、MXでGPIOを設定します。
Pinout & Configuration
System Core
GPIO
Configuration
GPIO
PA12
GPIO mode: Output Push Pull
Maximum output speed: Very High
User Label: PIN_CHK1
PA12はArduinoのD2です。
Projectの設定
Project - properties
C/C++Build
Settings
Tool Settiongs
MCU GCC Compiler
Optimization
Optimization Level: Optimize for speed (-Ofast)
最適化レベルを速度優先にします。なお「-Ofast」を指定すれば、CofigurationがDebugでもReleaseでも実行速度に差は無いようです。
ソースコード(Core/Src/main.cに追加)
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(PIN_CHK1_GPIO_Port, PIN_CHK1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(PIN_CHK1_GPIO_Port, PIN_CHK1_Pin, GPIO_PIN_RESET); } /* USER CODE END 3 */
実行結果
ch1:PA12(D2)
F303K8のBuild
Pinoutの設定
GPIOの設定で、PA12(ArduinoのD2)をOutputに設定し、PIN_CHK1とラベル付けします。
Clockの設定
HSE→PLLを使って最大クロックの72MHzでBuildすると正常動作しませんでした。
Debuggerで追いかけると、SystemClock_Config()のHAL_RCC_OscConfig()内でエラーが発生し、ErrorHandler()に制御が移ってしまうようです。HSI→PLLを使うと64MHzまでしか設定できませんが、正常動作します。こちらで測定しました。
CH1:PA12(D2)
F446REのBuild
Pinoutの設定
GPIOの設定で、PA10(ArduinoのD2)をOutputに設定し、PIN_CHK1とラベル付けします。
Clockの設定
クロックはHSE→PLLで180MHzです。
実行結果
CH1:PA10(D2)
F767ZIのBuild
Pinoutの設定
GPIOの設定で、PF15(ArduinoのD2)をOutputに設定し、PIN_CHK1とラベル付けします。
Clockの設定
クロックはHSE→PLLで216MHzです。
実行時にエラーが発生するのでMXでETHを無効化します。
Connectiviy
ETH
Mode: Disable
実行結果
CH1:PF15(D2)
実行速度比較
機種名 | パルス幅(ns) | 周波数(MHz) | 周期(ns) |
---|---|---|---|
G431KB | 64 | 7.716 | 129.6 |
F303K8 | 312 | 1.522 | 657 |
F446RE | 55 | 7.825 | 127.8 |
F767ZI | 272 | 1.49 | 671 |
G431KBはF446REと同程度の速度でGPIOをHigh/Low出来るのがわかります。しかしF303K8が遅いの当然ですが、F767ZIが異常に遅い結果となりました。Clockが216MHzでコアがCortex-M7なのに何故なのでしょうか。
APB1 peripheral clocksが54MHzとなっているのが原因かと思いましたが、F446REもAPB1 peripheral clocksは45MHzです。
0 件のコメント:
コメントを投稿