MultiButton移植记录

news/2025/12/7 12:35:00/文章来源:https://www.cnblogs.com/newspace/p/19317919

使用记录

使用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仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hugging Face 论文页面功能指南

在飞速变化的研究世界中,紧跟最新进展至关重要。为帮助开发者与研究人员把握 人工智能 前沿动态,我们推出了 Daily Papers 页面。自上线以来,Daily Papers 已收录超过 1 万 篇由 AK 与社区研究者精选的高质量论文。…

北京上门回收老酒名酒茅台五粮液

您家里是否存放着一些陈年佳酿,或是亲友相赠却不知价值的名酒?它们或许静置于橱柜一角,或收藏于箱底,随着岁月流逝,其价值可能已悄然攀升。京城亚南酒业,立足北京多年,专注于老酒、名酒的专业上门回收服务,为您…

P5202 [USACO19JAN] Redistricting P

洛谷 首先我们设更赛牛为加一,荷斯坦牛为负一。 这样通过前缀和就可以得到这一组是否需要增加一。 设 \(dp_i\) 表示以 \(i\) 为末尾,最少的分区。 那么方程式就为: \[$ dp_i=dp_j+(pre_i-pre_j\le 0) $\]然而表达式…

详细介绍:数据结构5:二叉树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Excel 公式

Excel 公式 Excel 要将 A1 和 B1 的数据拼接成 (A1,B1), 格式,公式如下: ="("&A1&","&B1&")," 公式拆解说明公式片段 作用说明"(" 固定开头文本,生成左半…

P10602 [CEOI 2009] Harbingers

洛谷 我们可以考虑使用动态规划来解决。 在线性情况下,我们可以直接将状态设为 \(dp_i\) 表示走到 \(i\) 号点的时候的最小路程。 可以得到状态转移方程: \[$ dp_i=\min(dp_j+(l_i-l_j)\times v_i+s_i) $\]其中 \(l_…

2025 Newest Autel BMW G-Chassis IMMO Add Key (1-Year License) for IM508/IM608/IM1/IM2

Solving BMW IMMO Programming Headaches: The 2025 Autel Solution for G-Chassis Vehicles For European and American BMW owners and mechanics, the challenge of adding keys or programming IMMO systems can f…

Go 1.25 发布:性能、器具与生态的全面进化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P6173 [USACO16FEB] Circular Barn P

洛谷 由于环非常难处理,但是这个数据范围又很小,所以很容易想到枚举一个谷仓的位置,然后以这个地点为起始点使用动态规划。 为了使转移方便,我这里选择了逆时针处理这样计算这一段奶牛的路程。 我们定义 \(dp_{i,j…

为数字文明奠基:论通译院-价值星图-叙事舞台架构作为价值实践的元操作系统

论文标题:为数字文明奠基:论通译院-价值星图-叙事舞台架构作为价值实践的元操作系统 摘要: 在价值多元且快速流变的数字时代,传统旨在寻求或定义一套普适、永恒价值规则的AI伦理与治理范式面临根本性困境。本文提出…

实用指南:OSG多视口与多通道渲染核心技术解析

实用指南:OSG多视口与多通道渲染核心技术解析2025-12-07 12:19 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

P8313 [COCI 2021/2022 #4] Izbori

洛谷 首先观察部分分,对于前两组部分分,可以直接暴力枚举左右端点。 对于第三组部分分,从前缀和的角度去思考,然后可以发现假设一个数字为正数,一个数字为负数,开桶进行统计,只要两种人数不打平即可。 代码: #…

汽车智能座舱软件、技术、分类介绍

汽车智能座舱软件介绍 一、OSI模型1、(CANH = 3.5V)- (CANL = 1.5V)= 2V 低电压,逻辑零,显性信号 2、(CANH = 2.5V)- (CANL = 2.5V)= 0V 高电压,逻辑一,隐形信号二、技术架构三、关键技术汽车智能座舱软…

2025 最新智能制造服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威推荐榜单发布,引领智慧工厂建设新生态

随着工业4.0进程的加速,智能制造已成为推动制造业转型升级的核心引擎。市场对专业智能制造解决方案的需求日益增长,对服务商的技术实力、行业经验与全周期服务能力提出了更高要求。本榜单基于技术创新力、行业适配性…

『NAS』在群晖部署图表绘制工具-Draw.io

点赞 + 关注 + 收藏 = 学会了整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》Draw.io 是一款免费开源的在线图表绘制工具,支持创建流程图、思维导图、UML 图等多种图表,提供跨平台使用和多格式导出…

CF762E Radio stations

Codeforces 很明显是一道偏序问题,我们先列出满足条件的台之间的关系。 \[\min(r_i,r_j)\ge|x_i-x_j| \]\[|f_i-f_j|\le k \]这看起来好像是两条式子,但是不能直接使用二维偏序解决,因为其中含有取最小值操作,所以…

grep 常用功能

grep 常用功能 检索服务器文件的 panic // 查找文件中包含 panic 的行,并要同时显示上下各 20 行,-A 代表显示匹配行之后的指定行数,-B 代表显示匹配行之前的指定行数。 grep -A 20 -B 20 "panic" daemon…

2025 最新工业自动化服务商 / 厂家 TOP5 评测!科技赋能 + 全周期服务权威榜单发布,引领智慧工厂建设新生态

随着工业4.0时代的深入推进,工业自动化已成为制造企业实现高效、智能、绿色生产的核心驱动力。本榜单基于技术创新能力、行业服务深度、全周期解决方案能力三大维度(德尔智慧新增“资产健康管理”维度),结合行业实…

2025 最新智慧工厂建设服务商/厂家 TOP5 评测!科技赋能+全周期服务权威推荐榜单发布,引领智能制造新生态

随着工业4.0浪潮的深入推进,智慧工厂建设已成为制造企业实现转型升级、提升核心竞争力的关键路径。本榜单基于技术创新力、行业适配性、服务覆盖度及全生命周期管理能力四大维度,结合行业发展趋势与客户实际应用反馈…

why windows is worst

because apple is better. picograph can not see this graph, but poems are similar.