STM32F103 TIM电容按键检测
STM32F103C8T6最小系统开发板使用HAL固件库,TIM电容按键检测控制LED灯亮灭
在本篇文章中,我们将介绍如何在STM32F103C8T6最小系统开发板上使用HAL固件库,通过TIM定时器进行电容按键检测,并控制PC13引脚连接的LED灯的亮灭。按键的触摸将会直接影响LED的开关。
1. 硬件设计
1.1 STM32F103C8T6最小系统开发板
STM32F103C8T6最小系统开发板是基于STM32F103C8T6芯片的开发板,具备多种常用外设,如GPIO、ADC、SPI、I2C、USART等。我们将利用该开发板的TIM定时器和GPIO功能来完成电容按键的检测与LED控制。
1.2 电容按键电路
电容按键一般由一个金属板、电容和一根电缆组成。通过使用定时器输入捕获功能,可以测量电容按键的电容变化,检测是否发生触摸事件。为简单起见,本篇教程假设电容按键已正确连接到定时器输入引脚(例如TIM2通道1)。
1.3 LED灯电路
PC13引脚通常用于STM32F103C8T6开发板上的LED灯控制。我们将使用该引脚来控制LED的点亮和熄灭。
2. TIM电容按键检测原理
TIM定时器可以配置为输入捕获模式,在检测到引脚电平变化时,能够记录下捕获的时间戳。通过分析捕获值的变化,可以判断电容按键是否被触摸。
在此例中,我们使用TIM2通道1作为输入捕获通道,检测电容按键的触摸。当按键被触摸时,电容值变化,TIM2会捕获到变化并触发中断。
3. 软件设计
3.1 配置GPIO
首先,配置PC13引脚为输出模式,用于控制LED灯。然后,通过初始化TIM定时器,设置为输入捕获模式,用于检测按键的触摸。
3.2 初始化TIM2输入捕获
我们通过TIM2的输入捕获模式读取电容按键的状态。通过设置定时器预分频器和计数周期,可以根据实际需求调整按键响应的速度。
3.3 中断处理
当TIM2捕获到一个时间戳后,我们判断电容按键的触摸情况。如果触摸事件发生,我们控制PC13引脚的LED灯亮起,否则熄灭LED。
4. 详细操作步骤及示例代码
4.1 系统初始化与时钟配置
void SystemClock_Config(void)
{
// 系统时钟配置代码(根据具体需要设置)
}
4.2 GPIO初始化代码
void GPIO_Init(void)
{
__HAL_RCC_GPIOC_CLK_ENABLE(); // 启用GPIOC时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置PC13引脚为输出,用于控制LED */
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); // 初始化PC13
}
4.3 TIM2初始化代码
void TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用TIM2时钟
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 设置预分频器
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFF; // 设置计数周期
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_IC_Init(&htim2); // 初始化TIM2输入捕获
/* 配置输入捕获通道 */
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0x0F;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);
}
4.4 启动TIM2输入捕获
void TIM2_IC_Start(void)
{
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 启动输入捕获并启用中断
}
4.5 TIM2中断处理程序
void TIM2_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC1) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_CC1); // 清除中断标志
uint32_t capture_value = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); // 读取捕获值
/* 按键触摸检测逻辑 */
if (capture_value > threshold_value) // 如果捕获值大于设定阈值,认为按键被触摸
{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // 点亮LED
}
else
{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // 熄灭LED
}
}
}
4.6 主程序
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
GPIO_Init(); // 初始化GPIO
TIM2_Init(); // 初始化TIM2
TIM2_IC_Start(); // 启动TIM2输入捕获
while (1)
{
// 主循环
}
}
4.7 编译并下载程序

- 连接 STLink-V2 到开发板。
- 使用 STM32CubeIDE 或 Keil 进行编译。
- 通过 STLink-V2 烧录程序。
5. 注意事项
threshold_value是用于判断电容按键是否被触摸的阈值。根据具体应用场景,可以通过实验来调整该值。- 在实际应用中,可以通过调节定时器的预分频器和计数周期,来适配不同的按键响应速度和时间精度。
- 根据具体需求,可能需要修改GPIO的配置以及TIM2的其他参数,如输入捕获通道、滤波等。
6. 总结
通过本篇文章的学习,我们掌握了如何使用STM32F103C8T6最小系统开发板的TIM定时器功能进行电容按键的检测,并基于此实现了LED的亮灭控制。这个方案简单且高效,适合在各种嵌入式项目中应用。

浙公网安备 33010602011771号