HAL库pwm呼吸灯
时间: 2025-02-01 21:12:20 浏览: 40
### 使用HAL库实现PWM控制呼吸灯
#### 初始化配置
为了使STM32通过PWM输出来模拟LED的渐亮渐暗(即所谓的“呼吸灯”效果),需要先初始化定时器以及相应的PWM通道。这通常涉及到设置定时器的工作模式、预分频系数、自动重装载值等参数。
```c
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8000 - 1; // 设置预分频值,假设系统时钟为80MHz,则此频率约为10kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自动重载值决定占空比范围
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始脉冲宽度设为零
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
}
```
上述代码完成了对`TIM2`定时器及其PWM功能的具体配置[^1]。
#### 开启PWM输出并调整亮度
一旦完成硬件资源的初始化工作之后,在主循环里可以通过改变PWM波形的占空比来动态调节LED发光强度:
```c
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and Systick. */
HAL_Init();
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // GPIO初始化
MX_TIM2_Init(); // 定时器初始化
uint16_t dutyCycle = 0;
int direction = 1;
while (1)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);
if ((dutyCycle >= 1000 && direction > 0) || (dutyCycle <= 0 && direction < 0))
{
direction *= -1;
}
dutyCycle += direction * 5; // 调整步长大小可影响变化速度
HAL_Delay(20); // 控制刷新速率
}
}
```
这段程序展示了如何利用软件延时函数配合变量更新的方式逐步增加或减少PWM信号的高电平持续时间,从而达到让连接到指定GPIO引脚上的LED呈现出缓慢变亮再慢慢熄灭的效果[^2]。
阅读全文
相关推荐


















