diff --git a/Peripheral/Inc/led.h b/Peripheral/Inc/led.h index 76494f7..17ef10a 100644 --- a/Peripheral/Inc/led.h +++ b/Peripheral/Inc/led.h @@ -14,4 +14,13 @@ void LED_Stop(uint8_t led); // duty in [0, 255] void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b); +/// @brief LED闪烁 +/// @param loop 循环次数 +/// @param interval 点亮间隔,单位毫秒 +/// @param time 点亮时间,单位毫秒 +/// @param r 通道R +/// @param g 通道G +/// @param b 通道B +void LED_StartNTimes(uint8_t loop, uint16_t interval, uint16_t time, uint8_t r, uint8_t g, uint8_t b); + #endif diff --git a/Peripheral/Src/led.c b/Peripheral/Src/led.c index cdf511d..4860bfc 100644 --- a/Peripheral/Src/led.c +++ b/Peripheral/Src/led.c @@ -1,34 +1,80 @@ #include "led.h" #include "tim.h" +#include "timer.h" #define LED_TIM (&htim3) #define LED_R_CHAN TIM_CHANNEL_4 #define LED_G_CHAN TIM_CHANNEL_3 #define LED_B_CHAN TIM_CHANNEL_2 +#define OFF 0 +#define ON 1 + +static uint8_t state; +static uint8_t loop_times; +static uint16_t light_time; +static uint16_t loop_interval; +static uint8_t led_r, led_g, led_b; + void LED_Start(uint8_t led) { - if (led & LED_R) - HAL_TIM_PWM_Start(LED_TIM, LED_R_CHAN); - if (led & LED_G) - HAL_TIM_PWM_Start(LED_TIM, LED_G_CHAN); - if (led & LED_B) - HAL_TIM_PWM_Start(LED_TIM, LED_B_CHAN); + if (led & LED_R) + HAL_TIM_PWM_Start(LED_TIM, LED_R_CHAN); + if (led & LED_G) + HAL_TIM_PWM_Start(LED_TIM, LED_G_CHAN); + if (led & LED_B) + HAL_TIM_PWM_Start(LED_TIM, LED_B_CHAN); } void LED_Stop(uint8_t led) { - if (led & LED_R) - HAL_TIM_PWM_Stop(LED_TIM, LED_R_CHAN); - if (led & LED_G) - HAL_TIM_PWM_Stop(LED_TIM, LED_G_CHAN); - if (led & LED_B) - HAL_TIM_PWM_Stop(LED_TIM, LED_B_CHAN); + if (led & LED_R) + HAL_TIM_PWM_Stop(LED_TIM, LED_R_CHAN); + if (led & LED_G) + HAL_TIM_PWM_Stop(LED_TIM, LED_G_CHAN); + if (led & LED_B) + HAL_TIM_PWM_Stop(LED_TIM, LED_B_CHAN); } void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b) { - __HAL_TIM_SetCompare(LED_TIM, LED_R_CHAN, r); - __HAL_TIM_SetCompare(LED_TIM, LED_G_CHAN, g); - __HAL_TIM_SetCompare(LED_TIM, LED_B_CHAN, b); + __HAL_TIM_SetCompare(LED_TIM, LED_R_CHAN, r); + __HAL_TIM_SetCompare(LED_TIM, LED_G_CHAN, g); + __HAL_TIM_SetCompare(LED_TIM, LED_B_CHAN, b); +} + +void LED_Callback(); + +void LED_StartNTimes(uint8_t loop, uint16_t interval, uint16_t time,uint8_t r, uint8_t g, uint8_t b) +{ + loop_times = loop; + loop_interval = interval; + light_time = time; + led_r = r; + led_g = g; + led_b = b; + state = ON; + LED_SetDuty(r, g, b); + LED_Start(LED_ALL); + TIMER_AddLoopEvent(EVENT_LED, LED_Callback, time); +} + +void LED_Callback() +{ + switch (state) + { + case ON: + state = OFF; + LED_SetDuty(0, 0, 0); + if (--loop_times) + TIMER_AddLoopEvent(EVENT_LED, LED_Callback, loop_interval); + else + TIMER_DelLoopEvent(EVENT_LED); + break; + case OFF: + state = ON; + LED_SetDuty(led_r, led_g, led_b); + TIMER_AddLoopEvent(EVENT_LED, LED_Callback, light_time); + break; + } }