按键控制呼吸灯,hal苦
时间: 2025-05-13 22:37:28 浏览: 12
### 使用STM32 HAL库实现按键控制LED呼吸灯功能
#### 初始化配置
为了实现按键控制LED的呼吸灯效果,首先需要初始化必要的硬件资源。这包括GPIO端口用于连接按键和LED,以及TIM定时器用于生成PWM信号。
```c
// 配置 GPIO 和 TIM 定时器
MX_GPIO_Init();
MX_TIM2_PWM_Init(); // 假设使用 TIM2 作为 PWM 输出
```
#### 主函数逻辑结构
主循环内应持续监测按键状态并据此调整LED亮度变化模式:
```c
int main(void){
/* Reset of all peripherals, Initializes the Flash interface and Systick. */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_PWM_Init();
uint8_t isBreathing = 0;
while (1){
if(HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET){ // 检测到按下
HAL_Delay(20); // 去抖动延迟
if(isBreathing == 0 && HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET){
Start_Breath_Light(&htim2);
isBreathing = 1;
while(HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET); // 等待释放
}else{
Stop_Breath_Light(&htim2);
isBreathing = 0;
while(HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET); // 等待释放
}
HAL_Delay(20); // 再次去抖动延迟
}
if(isBreathing){
Update_LED_Brightness(&htim2);
}
HAL_Delay(10);
}
}
```
#### 实现呼吸灯光效的具体方法
定义两个辅助函数`Start_Breath_Light()`与`Stop_Breath_Light()`,分别用来启动和停止呼吸光效;另外还需要一个更新当前LED亮度水平的方法 `Update_LED_Brightness()`:
```c
void Start_Breath_Light(TIM_HandleTypeDef *htim){
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, MIN_DUTY_CYCLE); // 设置初始占空比为最小值
}
void Stop_Breath_Light(TIM_HandleTypeDef *htim){
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, MAX_DUTY_CYCLE); // 将占空比回归最大值关闭呼吸效果
}
void Update_LED_Brightness(TIM_HandleTypeDef *htim){
static int dutyCycleDirection = 1; // 方向标志位,默认增亮方向
static uint16_t currentDutyCycle = MIN_DUTY_CYCLE;
if(dutyCycleDirection > 0){
++currentDutyCycle;
if(currentDutyCycle >= MAX_DUTY_CYCLE){
dutyCycleDirection *= -1; // 改变方向至减暗
}
} else {
--currentDutyCycle;
if(currentDutyCycle <= MIN_DUTY_CYCLE){
dutyCycleDirection *= -1; // 改变方向至增亮
}
}
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, currentDutyCycle);
}
```
上述代码实现了当检测到有效点击事件发生时切换LED的工作方式,在未激活状态下保持常量输出而在被激活之后则按照一定规律改变其发光强度模拟自然界的呼吸过程[^2][^4]。
阅读全文
相关推荐


















