IO_control


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

IOポート操作

STM32のポートは機能が豊富!
プッシュプル出力に加えてオープンドレイン出力もできる(全ビットで!)。
オープンドレイン+外部プルアップにすればレベルシフト回路無しでレベルが異なるICと接続できる(5Vトレラント有り)。
プルアップ/プルダウンもビットごとに選択できる。


出力操作

出力ポートにする場合の設定(レジスタ直叩き)
//PA13,15を出力ポートにする
GPIOA->CRH = (((uint32_t)0x03) << 28 ) | (((uint32_t)0x03) << 20 ); //CNF[1:0] = 0b00 MODE[1:0]=0b11
同じことをCMSISライブラリを使ってやると
GPIO_InitTypeDef GPIO_InitStructure; //初期化用構造体
GPIO_InitStructure.GPIO_Pin = _BV(13) | _BV(15);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初期化実行
どちらが見やすいかはその人の感性に拠る

ポートの出力値を変更する
GPIOA->ODR = _BV(13); //PORTAのBIT13をHにする

入力操作

入力ポートの値に応じて処理を切り替える
if(GPIOC->IDR & _BV(13)){
	//入力が1のときの処理
}else{
	//入力が0のときの処理
}


サンプルプログラムZIP


以降メモ書き

アトミック書き換えができる!

STM32のIOポートはアトミックな操作でビットの値を変更できるからくりを備えている。
ポートセットレジスタ/ポートリセットレジスタが別途用意されており、これらレジスタのポートのビットに対応するビットを1にすると、値が1命令で書き換えられる。
AVRとかH8とか普通のマイコンではread-modify-writeが必要でアトミック操作ではできない。そのため割り込みを禁止する必要があったが、STM32では必要ない!

ハードウエアのたたき方

CMSISとかいうライブラリが準備されているが、Chan氏が指摘するとおり、使用するメリットは少ない。
H8とかAVRで直接レジスタをたたくことに慣れている人であれば、CMSISを使わずともハードウエアを使いこなせるはず。