EXTICRレジスタの謎
以前作ったEXTI関連の設定プログラムをポートBで利用しようとした所、意図しないレジスタへのアクセスでうまく設定できなかった為、再度整理しなおしたものになります。
なおいつもの事ですが、STM32G0xシリーズの話になります。
他シリーズにはそもそもこのレジスタが無いこともあるみたいですね。
EXTICRの構成
アドレスオフセットにもある通り、EXTICRレジスタは4つあります。
デバッガ上での表記はEXTICR1~4で、EXTI_TypeDefのメンバとしてはEXTICR[0~3]となっています。
結論から書きますと以下のようなピン割り当てになります。
EXTICRとピンの関係
ピン番号0~3
EXTICR1にアクセス。
ピン0は最下位の8ビット。ピン3は最上位の8ビット
ピン番号4~7
EXTICR2にアクセス。
ピン番号8~11
EXTICR3にアクセス
ピン番号12~15
EXTICR4にアクセス
ピン4以降のビット範囲については省略しましたが、すべて同じです。
(m = 4 * (x - 1))という式が与えられていますが、正直よくわかりません。
ピン番号0~3の時の動きを見ていきます。
ピン0のとき、EXTImの8ビットにアクセスします。
ポートBであればここに0x01を書き込みます。
ピン1のとき、EXTIm+1の8ビットにアクセスします。
ピン2であればEXTIm+2、ピン3であればEXTIm+3…といった形です。
mの意図が掴めていない状態ですので、不正確な表現になっているかもしれませんがビットのアクセス範囲は伝わるのではと思います。
実際に試した結果
STM32CubeIDEの自動生成コードでのSFRの値を確認しました。
使用マイコンはSTM32G031F6P6。PB1とPB3を割り込みに設定し生成されたMX_GPIO_Initでのレジスタの変化を見ました。
使用マイコンはSTM32G031F6P6。PB1とPB3を割り込みに設定し生成されたMX_GPIO_Initでのレジスタの変化を見ました。
さきほどの例で言えばPB1はEXTICR1のEXTIm+1、つまり8~15ビットの範囲にアクセス。
PB3はEXTICR1のEXTIm+3、24~31ビットの範囲にアクセスしているはずです。
EXTICRにアクセスするLL関数のLL_EXTI_SetEXTISourceの実行後の結果を確認したところ、想定通りのアクセスになっていることがわかりました。
レジスタアクセス用の関数
ピン番号は4つ刻みでEXTICRxレジスタに割り振られています。
この事からピン番号/4でEXTICRxがわかります。
この事からピン番号/4でEXTICRxがわかります。
同様にピン番号を4つ刻みにしてEXTImもわかります。
これは8ビットずつ割り振られているので(ピン番号%4)*8で適切なビット範囲にアクセスできます。
portとpinは共に別に定義している列挙型です。
portはポートAを0、ポートBを1…の定義。
pinはPin0が0、Pin1が1…の定義になっています。
このEXTIRクラスでの設定後のSFR値もさきほどのLL_EXTI_SetEXTISourceと同じ結果になったことを確認しました。
(製作中のプログラムでそのまま試してしまったので余計な処理もありますがご容赦を)
まとめ
なんとなくわかった気で実装すると後で大変になるという教訓を得ました;;



0 件のコメント:
コメントを投稿