2024-07-11 18:07:17 +08:00
|
|
|
#include "led.h"
|
2024-07-20 10:44:59 +08:00
|
|
|
|
2024-07-11 18:07:17 +08:00
|
|
|
#include "tim.h"
|
2024-07-19 22:48:49 +08:00
|
|
|
#include "timer.h"
|
2024-07-11 18:07:17 +08:00
|
|
|
|
|
|
|
#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
|
|
|
|
|
2024-07-19 22:48:49 +08:00
|
|
|
#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;
|
|
|
|
|
2024-07-11 18:07:17 +08:00
|
|
|
void LED_Start(uint8_t led)
|
|
|
|
{
|
2024-07-19 22:48:49 +08:00
|
|
|
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);
|
2024-07-11 18:07:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void LED_Stop(uint8_t led)
|
|
|
|
{
|
2024-07-19 22:48:49 +08:00
|
|
|
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);
|
2024-07-11 18:07:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b)
|
|
|
|
{
|
2024-07-19 22:48:49 +08:00
|
|
|
__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;
|
|
|
|
}
|
2024-07-11 18:07:17 +08:00
|
|
|
}
|