基于STM32的精确按键时长测量系统
引言:为什么需要精确测量按键时间?
在嵌入式系统中,按键是最常见的人机交互方式之一。无论是简单的短按/长按识别,还是需要精确到微秒级的按键时长测量(如游戏手柄、工业控制器),都需要可靠的输入捕获技术。本文将深入探讨如何使用STM32的定时器输入捕获功能实现高精度按键时间测量系统。
一、系统架构与核心原理
1. 硬件连接
2. 工作原理
- •
下降沿检测:按键按下瞬间(电平从高到低)
- •
上升沿检测:按键释放瞬间(电平从低到高)
- •
时间计算:
总时间 = 溢出次数 × (ARR+1) + 最后计数值
-
使用定时器 2 通道 2 来捕获按键 2 按下时间,并通过串口打印。
-
计一个数的时间:1us,PSC=71,ARR=65535
3. 状态机设计
二、关键代码解析
1. 状态管理结构体
struct {uint8_t succeed_flag; // 完成捕获标志uint8_t rising_flag; // 上升沿标志uint8_t falling_flag; // 下降沿标志uint16_t timout_cnt; // 溢出计数器
} capture_status = {0};
2. 定时器初始化
void IC_Init(uint16_t arr, uint16_t psc)
{// 定时器基本配置ic_handle.Instance = TIM2;ic_handle.Init.Prescaler = psc; // 预分频ic_handle.Init.Period = arr; // 自动重装载值ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数HAL_TIM_IC_Init(&ic_handle);// 输入捕获通道配置TIM_IC_InitTypeDef ic_config = {0};ic_config.ICFilter = 0; // 无滤波ic_config.ICPolarity = TIM_ICPOLARITY_FALLING; // 初始捕获下降沿ic_config.ICPrescaler = TIM_ICPSC_DIV1; // 不分频ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI; // 直接输入HAL_TIM_IC_ConfigChannel(&ic_handle, &ic_config, TIM_CHANN