STM32/タクトスイッチの状態を取得する

追加回路

PB1 にタクトスイッチを接続します。STM32マイコンはプルアップ抵抗の設定ができるので、抵抗は接続しません。

Circuit

STM32CubeMXでの設定

タクトスイッチの状態を取得するサンプルを取得します。タクトスイッチが押される毎にLEDの点滅・消灯の切り替えを行うサンプルを作ります。前回のタイマ割り込みによるLEDを点滅させるEclipseプロジェクトをベースに作ってみます。

まずはSTMCubeMXを起動し、前回使用したプロジェクトを読み込みます。
マイコンの PB1 をクリックし、 GPIO_Input を選択します。

Chip

Configuration タブから System >> GPIO をクリックします。

Configuration

PB1 をクリックし、 GPIO Pull-up/Pull-down のプルダウンメニューから Pull-up を選択します。

PB1

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を使用したデジタル値の入出力とタイマ割り込みができるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください