stm32长按(长按时间大于1s)按键(PC13),LED1( PB0)以1s的周期闪烁,松开熄灭,默认为熄灭状态 , 使用定时器中断完成1s时间的控制的代码
时间: 2024-10-15 21:25:28 浏览: 28
在STM32F1系列单片机中,为了实现长按(按下并保持超过1秒)PC13(GPIOA的PA13)按键,并通过PB0(GPIOB的PB0)LED以1秒周期闪烁,在松开后LED关闭,可以使用Timer1的溢出中断配合GPIO的中断功能。以下是基本的步骤和代码示例:
首先,需要配置 Timer1 和 GPIOB 的相关寄存器:
```c
#include "stm32f1xx_hal.h"
// ... 其他头文件
void SystemClock_Config(void);
void MX_GPIO_Init(void);
static uint8_t key_state = KEY_STATE_IDLE;
static uint32_t last_press_time = 0; // 记录上一次按键按下时间
// ... 其他函数声明
void TIM1_IRQHandler(void); // Timer1中断处理函数
void EXTI0_IRQHandler(void); // EXTI线0中断处理函数 (对应PB0)
int main(void)
{
// ... 系统初始化和HAL库初始化
MX_GPIO_Init(); // 初始化GPIO
HAL_NVIC_EnableIRQ(TIM1_IRQn); // 开启Timer1中断
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启EXTI0中断
while (1)
{
if (EXTI_GetITStatus(GPIO_PIN_0) == SET) // 检查PB0是否有上升沿
{
if (key_state != KEY_STATE_DOWN)
{
key_state = KEY_STATE_DOWN;
last_press_time = HAL_GetTick();
}
}
if (key_state == KEY_STATE_DOWN && HAL_GetTick() - last_press_time > 1000) // 长按时检查是否超过1s
{
key_state = KEY_STATE_UP;
last_press_time = 0; // 更新为未按下
toggle_led(PB0); // LED闪烁
}
HAL_Delay(1); // 每1ms检查状态变化
}
}
// Timer1中断处理
void TIM1_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_UPDATE); // 清除标志
toggle_led(PB0); // LED闪烁
}
}
// EXTI0中断处理
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(GPIO_PIN_0) == RESET) // 松开时中断结束
{
EXTI_ClearITPendingBit(GPIO_PIN_0);
if (key_state == KEY_STATE_DOWN)
{
key_state = KEY_STATE_UP;
}
}
}
void toggle_led(uint8_t led_pin)
{
GPIO_ToggleBits(GPIOB, led_pin); // 切换LED的状态
}
```
在这个代码示例中,我们假设`toggle_led()`函数已经实现了GPIOB的PB0 LED的开关操作。注意,实际应用中需要根据具体的硬件连接调整中断线和IO口的配置。
阅读全文