1. 按键时长测量的核心原理
大家好,今天我们来聊聊STM32如何精准测量按键按下的时长。这个功能在实际项目中特别实用,比如需要根据按键时间长短执行不同操作的场景,或者需要精确记录用户交互时间的应用。我会用最直白的方式,带你从原理到代码一步步实现。
简单来说,我们要测量的就是从按键按下(下降沿)到释放(上升沿)的时间间隔。STM32的定时器捕获功能简直就是为这种需求量身定做的。它能在电平变化时自动记录当前计时值,让我们能精确计算时间差。
这里有个关键点:STM32的定时器是16位的,最大计数值是65535(0xFFFF)。如果按键按下的时间很长,计数器会多次从0重新开始(我们称之为溢出)。所以最终时间需要结合溢出次数和最后一次的捕获值来计算:总时间 = 溢出次数 × 65536 + 最终捕获值。
我刚开始做这个功能时,以为直接读捕获值就行了,结果发现长按按键时时间完全不对。后来才明白溢出计数的重要性,这个坑希望大家能避开。
2. 硬件配置与定时器设置
先来看看硬件连接。通常我们会将一个物理按键连接到STM32的某个GPIO引脚,这个引脚需要支持定时器的输入捕获功能。以STM32F103系列为例,我常用TIM2的通道2(PA1引脚)来做这个实验。
在CubeMX中的配置其实挺简单的,但有几个关键参数要注意:
- 时钟源选择内部时钟
- 分频系数(PSC)根据你的时钟频率设置,比如如果系统时钟是72MHz,设置PSC=71,那么计数频率就是1MHz(每个计数代表1微秒)
- 自动重装载值(ARR)设置为65535(最大值)
- 捕获/比较通道选择输入捕获模式
- 极性选择:初始设置为下降沿捕获(因为按键通常是按下时产生下降沿)
我建议在NVIC设置中开启定时器更新中断和捕获中断,这样溢出和边沿触发都能及时处理。
// 定时器基础配置示例
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_IC_InitTypeDef sConfigIC = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 72MHz/(71+1)=1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
// 输入捕获配置
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOL


1599

被折叠的 条评论
为什么被折叠?



