普中stm32 呼吸灯 代码
时间: 2024-08-14 14:06:24 浏览: 39
STM32微控制器上的呼吸灯效果通常通过PWM(脉宽调制)技术来实现,这是一种模拟模拟灯泡亮度变化的方式。以下是一个简单的STM32F103C8T6 (如Blue Pill) 示例代码,使用TIM1定时器来控制LED的闪烁:
```c
#include "stm32f10x.h"
// 定义LED引脚
GPIO_TypeDef* GPIOB = GPIOB_BASE;
#define LED_PIN GPIO_Pin_15
// TIM1配置
TIM_HandleTypeDef TimHandle;
void Led_Init(void)
{
// LED初始化为推挽模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// TIM1初始化
TimHandle.Instance = TIM1;
TimHandle.Init.Prescaler = 8400 - 1; // 根据系统频率调整预分频值
TimHandle.Init.CounterMode = TIM_CountMode_Up;
TimHandle.Init.Period = 1000; // 设置周期(比如1s内的呼吸频率)
HAL_TIM_Base_Init(&TimHandle);
}
void Led_Breath(void)
{
uint16_t dutyCycle = 0;
bool toggle = true;
while (1)
{
if (toggle)
{
dutyCycle = (uint16_t)(TimHandle.Init.Period * ((float)80 / 100)); // 设置占空比
}
else
{
dutyCycle = (uint16_t)(TimHandle.Init.Period - dutyCycle);
}
HAL_TIM_PWM_SetCompare(&TimHandle, TIM_CHANNEL_1, dutyCycle); // 更新PWM值
HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
toggle = !toggle; // 切换灯的亮暗状态
HAL_Delay(100); // 等待一段时间
}
}
int main(void)
{
Led_Init();
Led_Breath();
while (1) {}
}
```
阅读全文