追加回路
PB1 にタクトスイッチを接続します。STM32マイコンはプルアップ抵抗の設定ができるので、抵抗は接続しません。
STM32CubeMXでの設定
タクトスイッチの状態を取得するサンプルを取得します。タクトスイッチが押される毎にLEDの点滅・消灯の切り替えを行うサンプルを作ります。前回のタイマ割り込みによるLEDを点滅させるEclipseプロジェクトをベースに作ってみます。
まずはSTMCubeMXを起動し、前回使用したプロジェクトを読み込みます。
マイコンの PB1 をクリックし、 GPIO_Input を選択します。
Configuration タブから System >> GPIO をクリックします。
PB1 をクリックし、 GPIO Pull-up/Pull-down のプルダウンメニューから Pull-up を選択します。
Project >> Generate Code にてコードを生成します。
Eclipseにてソース修正
main.c を更に修正します。挿入しているコードは以下の通り。
int main(void) { /* USER CODE BEGIN 1 */ GPIO_PinState state; uint8_t swOnCount = 0; /* USER CODE END 1 */ : /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); /* USER CODE END 2 */ : while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); if (state == GPIO_PIN_RESET) { if (swOnCount < 0xff) { swOnCount++; if (swOnCount == 4) { gSw ^= 0xff; swOnCount = 0xff; } } } else { swOnCount = 0; } HAL_Delay(50); } /* USER CODE END 3 */ } /* USER CODE BEGIN 4 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == htim2.Instance) { if (gSw == 0x00) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); } else { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); } } } /* USER CODE END 4 */
しょぼいコードですみません。
main() では50ms毎にタクトスイッチの状態を読み込みます。4回(つまり200ms)連続で押され続けていたらLEDを点滅←→消灯を切り替えます。これはチャタリング防止に加え、while()ループを止めたくなかったためにこのようにしています。
さて、ここまででGPIOを使用したデジタル値の入出力とタイマ割り込みができるようになりました。