導入と事前準備
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レベルとなるよう事前設定が必要です。