STM32按键时长精准捕获:从原理到代码实现

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值