STM32 HAL库状态机实现按键多事件检测(无阻塞高效处理)

STM32实战项目-状态机函数应用 对状态机应用的整理 阅读详情

1. 状态机在STM32按键处理中的核心价值

在嵌入式系统开发中,按键处理看似简单,实则暗藏玄机。传统的按键检测方式往往采用阻塞式延时消抖,这种方式在简单场景下还能应付,但一旦需要检测单击、双击、长按等多重事件,就会变得异常复杂且低效。我在实际项目中就遇到过这样的情况:系统需要同时处理多个外设,按键响应却经常卡顿,用户体验大打折扣。

状态机的引入彻底改变了这一局面。它就像是一个智能交通指挥系统,能够根据按键的不同状态(按下、松开、等待等)进行精准调度,而不是傻傻地等待。使用状态机处理按键事件,最大的优势就是无阻塞和高效率。系统可以在等待按键事件的同时处理其他任务,大大提升了资源利用率。

HAL库作为ST官方推出的硬件抽象层,为我们提供了丰富的API接口,结合状态机设计,能够实现更加优雅的按键处理方案。这种组合特别适合对实时性要求较高的场景,比如智能家居中的面板控制、工业设备的人机交互等,都需要快速且准确的按键响应。

2. 硬件环境搭建与基础配置

2.1 定时器配置要点

要实现精准的按键事件检测,首先需要配置一个高精度的定时器。我通常选择基本定时器(如TIM6、TIM7)或者通用定时器,配置成1ms的中断周期。这个时间单位很重要,它直接决定了双击间隔、长按时间等参数的精度。

在实际配置时,需要根据系统时钟频率计算预分频器和周期值。比如在72MHz系统时钟下,要实现1ms中断,可以设置预分频器为7200-1,自动重载值为10-1。这样定时器每1ms产生一次中断,为我们的状态机提供准确的时间基准。

// 定时器初始化示例
TIM_HandleTypeDef htim6;
htim6.Instance = TIM6;
htim6.Init.Prescaler = 7200 - 1;      // 10kHz计数频率
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 10 - 1;           // 1ms中断
htim6.
按键状态机(实现单击,长按,双击)的模块分享 此文章为学习经验分享,帮助和我一样的小白理解按键的状态机,能够自己实现想要实现的功能。(附函数模块哦) 阅读详情

相关推荐

【STM32】状态机(State Machine)

本文介绍了状态机(State Machine)的概念及其在嵌入式开发等领域的应用。状态机是一种通过状态、事件、动作和转移来描述系统行为的抽象模型,适用于按键识别、通信协议、UI界面等场景。文章详细讲解了状态机的基本组成元素(状态、事件、动作、转移),分类(有限状态机、Mealy/Moore状态机等),并提供了按键识别的状态图示和C语言实现模板(含状态定义、事件处理、状态转移表等)。最后强调了状态机调试方法和在复杂流程管理中的优势,适合嵌入式开发者学习参考。

猫猫的小茶馆 1801

嵌入式按键状态机设计:无阻塞消抖与多事件处理

按键检测是嵌入式人机交互的基础技术,其本质是数字信号在机械弹跳、电气噪声与用户操作意图之间的时序建模问题。核心原理在于通过状态划分实现时间与事件的解耦,避免阻塞延时带来的实时性劣化。基于HAL_GetTick()的非阻塞计时机制保障了高精度毫秒级响应,而状态迁移驱动的回调架构支撑短按、长按、双击及连发等复杂交互逻辑。该方案广泛应用于STM32、ESP32等MCU平台的工业HMI、智能家电与IoT终端,在资源受限场景下显著提升系统鲁棒性与可维护性。本文聚焦按键状态机的工程落地,涵盖状态定义、中断协同、多键组合

weixin_42173218的博客 233

STM32按键状态机设计:五态模型与无阻塞实现

按键消抖与多态识别是嵌入式人机交互的基础技术,其本质是将不确定的物理电平跳变转化为确定的状态跃迁。基于状态机原理,通过IDLE、DEBOUNCE、PRESSED、LONG_PRESS、VERY_LONG五态建模,结合毫秒级时间戳差值计算与SysTick非阻塞调度,可实现高鲁棒性、低资源占用的按键响应。该方案天然支持短按/长按/超长按语义分层,满足工业级实时性(<10ms响应)、低功耗唤醒及FreeRTOS裸机双环境部署需求,是STM32等Cortex-M平台按键驱动的工程实践标准范式。

weixin_42173218的博客 223

嵌入式按键状态机设计:高可靠消抖与无阻塞处理

按键消抖是嵌入式人机交互的基础技术,其本质是应对机械触点弹跳引发的电平不稳定问题。传统轮询+延时方案因阻塞CPU、时序失控和状态断裂而难以满足实时性与可靠性要求。基于有限状态机(FSM)的按键处理,通过精准建模空闲、消抖、按下、释放四阶段状态演化,结合SysTick毫秒滴答与GPIO外部中断驱动,实现非阻塞、可扩展、易验证的软件架构。该方法天然支持短按、长按、双击等复合操作,广泛应用于STM32等资源受限MCU的工业控制、医疗设备及IoT终端中,是嵌入式软件工程化落地的关键实践。

weixin_42173218的博客 277

别再只会delay消抖了!用STM32 HAL库实现按键长短按的三种实用方法(附源码)

本文深入解析STM32 HAL库实现按键长短按检测的三种高效方案,包括状态机、定时器扫描和EXTI+RTOS组合方法。通过对比传统延时法的缺陷,展示如何提升实时性和功能扩展性,附带可直接移植的源码,助力开发者优化嵌入式系统的按键处理性能。

weixin_30296405的博客 201

嵌入式按键状态机设计:告别轮询延时,实现高可靠检测

按键检测是嵌入式系统中最基础却极易出错的外设交互场景,其本质是时间敏感型事件的状态建模问题。传统轮询+HAL_Delay方案因阻塞执行、时间精度漂移和状态耦合,难以满足实时性与可维护性要求。基于有限状态机(FSM)的设计范式,将按键生命周期解耦为IDLE、DEBOUNCE、PRESSED等明确状态,通过绝对时间戳驱动迁移,实现无阻塞、幂等、可重入的检测逻辑。该方法显著提升抗干扰能力与多按键扩展性,广泛适用于STM32裸机及FreeRTOS环境,并支撑医疗设备、工业HMI等对可靠性要求严苛的落地场景。

weixin_42173218的博客 294

STM32非阻塞按键状态机设计与实现

按键消抖与长按检测是嵌入式人机交互的基础技术概念,其本质是将机械开关的不确定时序转化为可预测的状态转移过程。基于有限状态机(FSM)原理,通过SysTick定时器实现毫秒级精准计时,结合GPIO外部中断触发事件驱动机制,可彻底规避软件延时导致的实时性缺陷。该方案具备高可靠性、低资源占用和强可扩展性,广泛适用于STM32等Cortex-M系列MCU的裸机或FreeRTOS环境。典型应用场景包括工业HMI短按/长按功能切换、组合键识别及滑动操作建模,是嵌入式工程师必须掌握的核心底层能力。

weixin_42173218的博客 163

STM32单片机状态机设计与实现

本文还有配套的精品资源,点击获取 简介:STM32单片机是嵌入式系统的核心,状态机设计模式适用于此环境下以简化任务处理。通过C/C++语言实现,以事件驱动型状态机提高效率和响应性,涵盖状态定义、结构体、事件枚举、状态转移、初始化、中断处理等多个关键点。 1. STM32单片机概述 1.1 STM32单片机的简介 STM32单片机是由意法半导体(STMi...

weixin_35797963的博客 4508

STM32按键状态机:单击/双击/长按无误判工业级实现

按键识别是嵌入式人机交互的基础能力,其本质是基于电平变化与时间约束的状态判断问题。原理上需融合硬件消抖、边沿检测、毫秒级定时和有限状态机(FSM)建模,以解决抖动干扰、时序漂移与多事件冲突等核心挑战。该技术显著提升操作可靠性与响应一致性,具备低耦合、可配置、免阻塞等工程优势,广泛应用于工业HMI、医疗设备及智能家电等人因要求严苛的场景。本文详解基于STM32平台的纯C语言状态机实现,覆盖抗抖动设计、多按键并行处理及HAL层抽象适配等关键实践。

weixin_29194817的博客 101

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 301

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1344

CPU核心、die和package的区别:从硬件小白到高手的进阶指南

本文深入浅出地解析了CPU核心、Die与Package的核心概念与区别,是硬件爱好者从入门到精通的实用指南。文章从硅晶圆制造讲起,阐述了物理核心与逻辑线程(如超线程技术)的工作原理,并详细介绍了封装(Package)的作用与多Die模块化设计。最后,结合实际应用场景,提供了选购、性能解读与优化调优的实用建议。

pz89012345的博客 202

避坑指南:ros2_control在Gazebo中的常见配置错误及解决方案

本文系统梳理了在Gazebo仿真环境中配置ros2_control框架时最常见的错误,并提供了详细的解决方案。重点解析了YAML配置文件的结构陷阱、URDF/XACRO中关键标签的正确写法、Launch文件的启动顺序管理,并分享了实用的调试命令与故障排查思路,帮助开发者高效避坑,实现流畅的关节运动控制。

q5r6s7的博客 971

Openclaw接入大模型API,操作本地windows文件

本文介绍了在WSL2环境下配置OpenClaw使用阿里百炼API的方法。主要内容包括:1)确认WSL2安装完成;2)配置阿里百炼API(需注意Qwen3-Max-Thinking为收费模型);3)提供正确的JSON配置格式示例,强调apiKey必须填写真实值;4)说明配置错误需修改Linux配置文件;5)建议通过询问模型信息验证连接成功。后续将介绍如何切换免费API及本地文件访问功能。

qq_27246521的博客 989

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

手把手教你学simulink(43.2)--光伏发电场景示例:基于Simulink开发一个光伏发电系统仿真模型:采用神经网络控制策略进行优化

需求分析光伏发电系统(Photovoltaic System, PV)是将太阳能转换为电能的重要手段,广泛应用于分布式发电、并网发电和离网供电等领域。随着光伏技术的发展,如何提高光伏发电系统的效率和稳定性成为研究的重点。传统的控制策略(如PID控制器)虽然简单易实现,但在复杂工况下(如光照强度变化、温度波动等)难以达到最优性能。因此,引入先进的控制策略,如神经网络控制(Neural Network Control, NNC),可以显著提升系统的响应速度和鲁棒性。

MHD0815的博客 438

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: Keil5编码问题解析:彻底解决error: #8 missing closing quote报错
下一篇: 1-远程升级篇(自建物联网平台)-STM32通过EC800实现HTTP/HTTPS安全OTA升级与外部Flash备份策略
tech5
博客等级 码龄17年 53粉丝 1363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值