#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); } 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); } 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); } 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; } }