2020年12月8日火曜日

STM32で廉価4chオシロを作ろう (7) EXTI割り込みの勘所

STM32で4chオシロを作ろう!

今回は、STM32の外部pin割り込み(EXTI)をどうやって動かすのかを書きます.わりと簡単でした.

EXTIは最大何本まで使えるのか?
STM32F205の割り込み回路の制約により、14本がmaxです.

どのGPIOをEXTI pinとして使えるのか?
GPIOx0、GPIOx1、GPIOx2、GPIOx5、GPIOx6、GPIOx7、GPIOx8、GPIOx9、
GPIOx10、GPIOx11、GPIOx12、GPIOx13、GPIOx14、GPIOx15
以上で14本です.
xには、GPIOAやGPIOBのような、ABC....があてはまります.
数字は、EXTIの番号です.EXTI3とEXTI4が欠番になっています.

注意: GPIOA0 と GPIOB0 のように、x違いだが同一ナンバーはダメです.
なぜなら、例えばEXTI0の割り込みセレクタ回路がこのようになっているからです.PA0とPB0は排他的です.EXTI1~EXTI15も同様な回路になっています.

STM32CubeMXの設定
PB12をEXTI12に結び付けるのはこのようにします.PB12にスイッチを付けてON/OFFすると割り込みがかかるようにしたいわけです.
↓GPIOの設定で、割り込みを受付けるエッジを設定し、お好みに応じてPull-upを設定します.
↓EXTIをEnableにします.割り込み優先度はここでは3にしましたがお好みでどうぞ.
↓IRQ codeを生成させます.

こんな設定でcode生成させます.

source codeの勘所
HALライブラリの作法に則ります.
EXTIのHALライブラリによると、ユーザー定義で
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
という関数を作ってその中でよしなにやれ、となっています.
どうしてそうなっているのかの説明は割愛しますが、この関数がEXTI割り込みで呼ばれます.GPIO_PinにはEXTI番号が入っていますので、処理routineをGPIO_Pinで分岐させます.

こんなtest codeで動作確認できました.例えばPB12に付けたスイッチを押すと、USB COMに"12"が出力されます.したがって、TerminalアプリでCOM portをモニタすると、スイッチが押されたら12と表示されます.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    switch(GPIO_Pin) {
case GPIO_PIN_0:  CDC_Transmit_FS("0 ",2); break;
case GPIO_PIN_1:  CDC_Transmit_FS("1 ",2); break;
case GPIO_PIN_2:  CDC_Transmit_FS("2 ",2); break;
case GPIO_PIN_3:  CDC_Transmit_FS("3 ",2); break;
case GPIO_PIN_4:  CDC_Transmit_FS("4 ",2); break;
case GPIO_PIN_5:  CDC_Transmit_FS("5 ",2); break;
case GPIO_PIN_6:  CDC_Transmit_FS("6 ",2); break;
case GPIO_PIN_7:  CDC_Transmit_FS("7 ",2); break;
case GPIO_PIN_8:  CDC_Transmit_FS("8 ",2); break;
case GPIO_PIN_9:  CDC_Transmit_FS("9 ",2); break;
case GPIO_PIN_10: CDC_Transmit_FS("10 ",3); break;
case GPIO_PIN_11: CDC_Transmit_FS("11 ",3); break;
case GPIO_PIN_12: CDC_Transmit_FS("12 ",3); break;
case GPIO_PIN_13: CDC_Transmit_FS("13 ",3); break;
case GPIO_PIN_14: CDC_Transmit_FS("14 ",3); break;
case GPIO_PIN_15: CDC_Transmit_FS("15 ",3); break;
default: ;
    }
}

なお、ここでのGPIO_PIN_xはビットマスクですので、GPIO_PIN_5=5だと思ってるとハマります.

今宵は此処までにしとうございます.

#スイッチがチャタるので、TIMで不感時間を200mSぐらい設けると回避できます

かしこ

0 件のコメント:

コメントを投稿