STM32H7マイクロコントローラのGPIO入力管理

導入と事前準備

STM32CubeIDE環境下でのeasy_buttonライブラリを活用したGPIO入力制御を実装します。既存プロジェクトを継続使用します。新規プロジェクトの場合はSTM32H7系マイコン向けGPIO基本設定を事前に実装しておく必要があります。

easy_buttonライブラリの取得

公式リポジトリはGithubに存在します。アクセス問題が懸念される場合は代替ミラーサーバーGiteaを利用可能です。

プロジェクトへの統合

ダウンロードしたリポジトリから『ebtn』ディレクトリ以下の全ファイルを対象プロジェクトにコピーします。統合開発環境(MDK-ARM)にソースファイルを追加し、インクルードパスを適切に設定します。

実装手法

ebtn.cと同じ階層にebtn_callback.cおよびebtn_callback.hを作成し、コールバック関数群を配置します。

初期設定パラメータ

static const ebtn_time_config_t ebtn_time_config = EBTN_PARAMS_INIT(
  20,   // 押下時デバウンス(ms)
  20,   // 解放時デバウンス(ms)
  20,   // クリック最短時間(ms)
  300,  // クリック最長時間(ms)
  200,  // 連続クリック間隔上限(ms)
  500,  // 長押し状態通知間隔(ms)
  10    // 最大連続クリック数
);

スイッチ識別定義

typedef enum {
  EBTN_KEYID_SW1 = 0,
  EBTN_KEYID_COUNT
} ebtn_key_id_t;

static ebtn_btn_t button_list[] = {
  EBTN_CONFIG_MACRO(EBTN_KEYID_SW1, &ebtn_time_config)
};

GPIO状態取得関数

static uint8_t button_state_read(struct ebtn_btn* btn) {
  switch(btn->key_id) {
    case EBTN_KEYID_SW1:
      return (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET);
    default:
      return 0;
  }
}

イベントハンドラ

static void button_callback(struct ebtn_btn* btn, ebtn_evt_t event) {
  switch(event) {
    case EBTN_EVENT_CLICK:
      if((ebtn_get_click_count(btn) == 2) && (btn->key_id == EBTN_KEYID_SW1)) {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
      }
      break;
    case EBTN_EVENT_KEEPALIVE:
      if(btn->key_id == EBTN_KEYID_SW1) {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
      }
      break;
    default:
      break;
  }
}

同期処理機構

static uint32_t ebtn_sync_timer(void) {
  return HAL_GetTick();
}

void button_callback_init(void) {
  ebtn_init(button_list,
            EBTN_TOTAL_SIZE(button_list),
            NULL, 0,
            button_state_read,
            button_callback);
}

void button_process_handler(void) {
  ebtn_process(ebtn_sync_timer());
}

メイン処理実装例

#include "ebtn_callback.h"

int main(void) {
  // ハードウェア初期化
  button_callback_init();

  while (1) {
    button_process_handler();
    HAL_Delay(5);
  }
}

動作検証

実装後の動作特性は以下の通りです: - ダブルクリック: LEDトグル動作 - 長押し: 500ms間隔でのLEDトグル動作持続 GPIO_PIN_13は押下時にHIGHレベルとなるよう事前設定が必要です。

タグ: STM32H7 HAL GPIO easy_button 入力管理

9月10日 04:06 投稿