stm32F3マイコンと同じ立ち位置の後継型
STM32G4 - SYSCFG システム・コンフィグレーション・コントローラ
STM32G4 - Flash 内蔵フラッシュメモリ
STM32G4 – A/Dコンバータ
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
:高速プログラミング、複数回高速プログラミングを行い、最後のみこれを指定する。
読み出し保護。レベルが3段階(0, 1, 2)あり、デフォルトは0
レベル0:制限なし
レベル1:読み出し保護
Flashメインメモリやバックアップレジスタ、CCMSRAMなどへのアクセスが制限される。アクセスするとバスエラーやハードフォールトが発生する。
デバッグ機能は有効なのでST-Linkなどを接続してのデバッグやオプションバイトの編集は可能。
レベル2:デバッグなし
レベル1が保証され、デバッグ機能が無効化される。ST-Linkとかのデバッガからもアクセスできなくなる。
レベル0,1の間は変更可能だけど、レベル2変更すると2度と戻せない。→レベル2は製品出荷時書き込み位にしか使わない?
少なくとも趣味で使ってるうちは触らない
Flashメモリの一部を読み出し、書き込みから保護する。CPUが命令ー度としてのアクセスは可能。DMA,デバッグCPUのデータ読み出しなどは不可能。
PCROPはダブルワード(64bit)単位で編集。追加のオプションビットでRDP保護レベル1から0に変更時、PCROP領域を消去するか設定可能。
PCROP領域の最初サイズは2ダブルワード(128bit)
ここも書き込み保護と同じように変に触らない方が良い。
CubeProgの画面を添付。「Value」のところに値を指定する。1ダブルワード毎に1増やす。
2の書き込み保護をページ単位(2kB)で定義可能。保護領域の開始~終了ページを指定する。
開始ページ>終了ページとすると書き込み保護無効となる。
CubeProgの画面を添付。「Value」のところに値を指定する。1ページ毎に1増やす。
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チャンネルかつサンプリング時間も遅い方のチャンネルに合わせたので問題ないだろう。