void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, STM32!");
}
TIM_HandleTypeDef htim2;
uint8_t mode = 0; // 0=呼吸灯 1=无级调光
uint16_t pwm = 0;
uint8_t dir = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
void Key(void);
void Breath(void);
void Dim(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
while (1)
{
Key();
if(mode == 0) Breath();
else Dim();
}
}
// 单按键:单击切换模式,长按调亮度
void Key(void)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0)
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0)
{
uint32_t t = HAL_GetTick();
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0)
{
if(HAL_GetTick()-t > 300 && mode==1)
{
pwm += 30;
if(pwm>999) pwm=0;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
HAL_Delay(60);
}
}
if(HAL_GetTick()-t < 300)
{
mode = !mode;
if(mode==1) pwm=500;
}
}
}
}
// 呼吸灯
void Breath(void)
{
if(dir==0)
{
pwm += 5;
if(pwm>=999) dir=1;
}
else
{
pwm -=5;
if(pwm<=0) dir=0;
}
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
HAL_Delay(10);
}
// 无级调光保持亮度
void Dim(void)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
}
// TIM2 PWM 初始化
static void MX_TIM2_Init(void)
{
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999;
HAL_TIM_PWM_Init(&htim2);
TIM_OC_InitTypeDef s = {0};
s.OCMode = TIM_OCMODE_PWM1;
s.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim2, &s, TIM_CHANNEL_1);
}
// GPIO初始化
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA0 PWM输出
GPIO_InitTypeDef gpio = {0};
gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &gpio);
// PA1 按键输入
gpio.Pin = GPIO_PIN_1;
gpio.Mode = GPIO_MODE_INPUT;
gpio.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &gpio);
}
// 时钟
void SystemClock_Config(void)
{
RCC_OscInitTypeDef o = {0};
RCC_ClkInitTypeDef c = {0};
o.OscillatorType = RCC_OSCILLATORTYPE_HSE;
o.HSEState = RCC_HSE_ON;
o.PLL.PLLState = RCC_PLL_ON;
o.PLL.PLLSource = RCC_PLLSOURCE_HSE;
HAL_RCC_OscConfig(&o);
c.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
c.AHBCLKDivider = RCC_SYSCLK_DIV1;
c.APB1CLKDivider = RCC_HCLK_DIV2;
c.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&c, FLASH_LATENCY_1);
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}
Loading
st-nucleo-l031k6
st-nucleo-l031k6