网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 操作系统 > 嵌入式 >

MultiButton移植记录

时间:2025-12-07 12:30

人气:

作者:admin

标签:

导读:使用记录 使用PA0引脚,电路图如下,使用GPIO内部下拉。 实际测试,很稳定,没有误触发,单击、双击、长按很稳定。 移植记录 复制multi_button.c和multi_button.h到工程中,实现GPIO的初始化...

使用PA0引脚,电路图如下,使用GPIO内部下拉。
image

实际测试,很稳定,没有误触发,单击、双击、长按很稳定。
image

  1. 复制multi_button.c和multi_button.h到工程中,实现GPIO的初始化、读取。
void key_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /*Configure GPIO pin : KEY_WK_UP_Pin */
    GPIO_InitStruct.Pin = KEY_WK_UP_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(KEY_WK_UP_GPIO_Port, &GPIO_InitStruct);
}
/// multi_button 移植接口
uint8_t read_button_gpio(uint8_t button_id)
{
    switch (button_id)
    {
        case 1:
            return HAL_GPIO_ReadPin(KEY_WK_UP_GPIO_Port, KEY_WK_UP_Pin);
            break;
        default:
            return 0;
    }
}
  1. 实现定时器回调,button_ticks()函数需要5ms调用一次,自己实现定时器中断,5ms中断一次。或者使用软件定时器。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM6)
	{
		button_ticks();
	}
}

调整下面参数,可以调整短按、长按的时间间隔

// Configuration constants - can be modified according to your needs
#define TICKS_INTERVAL          5    // ms - timer interrupt interval
#define DEBOUNCE_TICKS          3    // MAX 7 (0 ~ 7) - debounce filter depth
#define SHORT_TICKS             (300 / TICKS_INTERVAL)   // short press threshold
#define LONG_TICKS              (1000 / TICKS_INTERVAL)  // long press threshold
#define PRESS_REPEAT_MAX_NUM    15   // maximum repeat counter value
  1. 使用MultiButton
void key_wkup_single_click_handle(Button *btn)
{
	static uint32_t cnt = 1;
	printf("key_wkup: Single Click,cnt = %d\n",cnt);
	cnt++;
}
void key_wkup_double_click_handle(Button *btn)
{
	static uint32_t cnt = 1;
	printf("key_wkup: Double Click,cnt = %d\n",cnt);
	cnt++;	
}
void key_wkup_long_press_handle(Button *btn)
{
	printf("key_wkup: long press\n");
}

int main(void)
{
    //初始化按键,active_level:0:低电平有效,1:高电平有效
	button_init(&key_wkup,read_button_gpio,1,1);
	//注册单击事件回调
	button_attach(&key_wkup,BTN_SINGLE_CLICK,key_wkup_single_click_handle);
	//注册双击事件回调
	button_attach(&key_wkup,BTN_DOUBLE_CLICK,key_wkup_double_click_handle);
	//注册长按事件回调
	button_attach(&key_wkup,BTN_LONG_PRESS_START,key_wkup_long_press_handle);
	//启动按键处理
	button_start(&key_wkup);
    while(1)
    {
        ///process other things
    }

    
}

轮询方式
裸机下的思路:
假如有四个按键,先注册好4个按键的各个回调函数,比如每个按键的单击、双击、长按等,然后在回调函数中,入队,也就是每个按键的状态入队,最后在轮询中查询队列是否为非空,如果非空,就表示有按键的事件,否则就表示没有按键事件。
需要写一个环形队列(FIFO)
RTOS下的思路:
和裸机思路一样,不过使用RTOS自带的队列,更方便的使用了。

参考资料:
开源链接: GitHub仓库

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信