[STM32H7] 定时器与按键结合

[复制链接]
851|10
 楼主| t60yz 发表于 2024-12-9 23:14 | 显示全部楼层 |阅读模式
定时器触发 LED 周期闪烁。
按键中断改变闪烁频率。
代码实现:
c
复制代码
volatile uint32_t blink_delay = 500; // LED 闪烁延时

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if (GPIO_Pin == GPIO_PIN_0) { // 按键中断
        blink_delay = (blink_delay == 500) ? 200 : 500; // 切换延时
    }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM2) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换 LED 状态
    }
}

// 主循环中动态调整定时器周期
while (1) {
    __HAL_TIM_SET_AUTORELOAD(&htim2, blink_delay); // 动态更新定时周期
}

公羊子丹 发表于 2025-1-24 09:38 | 显示全部楼层
这个实现看起来很棒!按键中断用来切换闪烁频率,挺简单而且高效的。
周半梅 发表于 2025-1-24 09:39 | 显示全部楼层
动态更新定时器周期的方式很巧妙,能让LED频率响应快速变化。
帛灿灿 发表于 2025-1-24 09:40 | 显示全部楼层
记得在按键中断处理函数里加个防抖,否则按键可能会触发多次变化。
童雨竹 发表于 2025-1-24 09:42 | 显示全部楼层
不过注意定时器的延迟和频率切换之间的平衡,避免太频繁的切换导致闪烁效果不稳定。
万图 发表于 2025-1-24 09:43 | 显示全部楼层
这个方法对于实时应用来说很合适,定时器定期触发任务,按键中断动态调整频率,效率高。
Wordsworth 发表于 2025-1-24 09:44 | 显示全部楼层
使用__HAL_TIM_SET_AUTORELOAD来动态调整定时器周期挺聪明的!可以根据需求快速改变LED闪烁的速度。
Bblythe 发表于 2025-1-24 09:46 | 显示全部楼层
你可以考虑加入一些调试输出,看看在按键触发时blink_delay是否正常切换。
Pulitzer 发表于 2025-1-24 09:47 | 显示全部楼层
按键的触发条件很直观,只要按键按下就能切换LED闪烁频率,使用起来非常方便。
Uriah 发表于 2025-1-24 09:48 | 显示全部楼层
动态调整定时器周期是实现类似功能的好方法,不过要注意不会影响其他定时器的工作。
Clyde011 发表于 2025-1-24 09:49 | 显示全部楼层
如果需要更多控制,可以给按键增加多级频率选择,让用户有更多调节选项。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

1191

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部