stm32:stm32g4

stm32

stm32G4

stm32G4はメモリ容量などから製品カテゴリが2,3,4と分類される。
よく使用するstm32G491,stm32G4A1はカテゴリ4に分類される。

BOOT0ピンを使用しない(常にフラッシュメモリからの起動を想定)とき、CubeProgrammerからビットを書き換えておく必要がある。
nSWBOOT0 → チェックを外すとBOOT0ピンの状態ではなくnBOOT0ビットを見に行く。
nBOOT0 → チェックを入れるとnBOOT0=1となり、BOOT0=0なのでFlashから起動する。接頭辞にnがついてるため論理が反転することに注意

stm32G4デバイスの内蔵Flashメモリへの書き込み(プログラム)は1回72bit(64bit + 8bit ECC(エラーコード訂正))である。
どれだけ小さいデータでもダブルワード(2×32=64bit)でのみ書き込みが可能。バイトやハーフワード書き込みをしようとするとFlash_SRレジスタのSIZERRビットがセットされる
ダブルワード・アドレスに合っていないダブルワードの書き込みをしようとするとFlash_SRレジスタのPGAERRがセットされる。
以上から、stm32G4では最低64bitでデータを書き込む必要あり。書き込むために使用するデータも64bitにする、割当のアドレスも8byteアライメントするなどしておいたほうが良さそう。
実際に、stm32G4のHAL_FLASH_Program関数での書き込みデータの型がuint64_tである

stm32G4のHAL_FLASH_Programの引数について注意

  • FLASH_TYPEPROGRAM_DOUBLEWORD:標準プログラミング。普通に64bit書き込む際はこれを指定する
  • FLASH_TYPEPROGRAM_FAST:高速プログラミング、書き込み前にFlashの位置確認などを省略し、高速で書き込む。また64bitのデータを32個一気に書き込む。この32このダブルワードのデータをリファレンスマニュアルでは行(row)と表現している
  • FLASH_TYPEPROGRAM_FAST_AND_LAST:高速プログラミング、複数回高速プログラミングを行い、最後のみこれを指定する。

ADCをデュアルモードで使用する場合を想定する。
stm32G4は1&2, 3&4をそれぞれデュアルモードとして使用可能。ADC1or3がマスタとなり、2or4をスレーブADCとして動作する。
基本的な設定はCubeMXを使用する。
AN5346 STM32G4 ADC use tips and recommendations

ADC1,2を使用し、普段は特定のチャンネルをレギュラ変換し、別のチャンネルをタイマに同期してインジェクト変換を行うケースを想定する。ここで、レギュラ変換の値は変換後DMAで特定の変数に転送を行いたい。
CubeMXではADC1,2それぞれでDMAの設定をすることが可能。最初はそれぞれのDMAを設定したがうまく動作しなかった。おそらくデュアルモードであることが要因?
デュアルモードでは、ADC共通レジスタというものを活用するのが良さそう。
ADC1,2はそれぞれレギュラ変換を行い結果をDMAで転送する場合、マスタであるADC1にのみDMAの設定を行う。ここで、DMAの設定の際にDMAの転送元アドレスの参照二注意が必要。
ADCx_CDRというレジスタが存在する。ここの32bitレジスタの中には、上位16bit下位16bitにそれぞれマスタとスレーブADCの変換結果が保存される。
このため、DMAの転送元アドレスをADCのデータレジスタ(ADCx_DR)ではなくADCxデュアルモード用共通レギュラデータレジスタ(ADCx_CDR)を設定する。
今回はADC1,2のレギュラ変換のチャンネルがそれぞれ1つだけであったため1回の変換のたびにデータが転送されるが、チャンネルが複数の場合はデータの詰められ方に注意が必要と思われる。
また、それぞれのADCの変換するチャンネルの順番ごとにサンプリング時間を合わせるほうがいいかもしれない。もしかしたら、デュアルモニターモードの場合、サンプリング時間が長い方のADCの変換終了を検知してから次のチャンネルのサンプリングに入るかもしれないが憶測の域を出ないのでリファレンスマニュアルを参照する必要あり。
まぁ今回は上記のようにそれぞれ1チャンネルかつサンプリング時間も遅い方のチャンネルに合わせたので問題ないだろう。

  • stm32/stm32g4.txt
  • 最終更新: 2024/03/31
  • by yuqlid