2021年7月29日木曜日

STM32CubeIDE Nucleo-G431KBの実行速度を測定 GPIO

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

※Master Clock Outputを有効化するとPG10よりクロック信号が出力されます。

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 件のコメント:

コメントを投稿