RMUL2025/User/bsp/c/led.c

62 lines
1.7 KiB
C
Raw Permalink Normal View History

2025-03-09 17:26:17 +08:00
/* Includes ----------------------------------------------------------------- */
#include "bsp\led.h"
#include <tim.h>
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */
static uint32_t led_stats;
/* Private function -------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
int8_t BSP_LED_Set(BSP_LED_Channel_t ch, BSP_LED_Status_t s, float duty_cycle) {
if (duty_cycle > 1.0f) return BSP_ERR;
uint32_t tim_ch;
uint16_t pulse = (uint16_t)(duty_cycle * (float)UINT16_MAX);
switch (ch) {
case BSP_LED_RED:
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_3, pulse);
tim_ch = TIM_CHANNEL_3;
break;
case BSP_LED_GRN:
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, pulse);
tim_ch = TIM_CHANNEL_2;
break;
case BSP_LED_BLU:
__HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_1, pulse);
tim_ch = TIM_CHANNEL_1;
break;
}
switch (s) {
case BSP_LED_ON:
HAL_TIM_PWM_Start(&htim5, tim_ch);
led_stats |= tim_ch;
break;
case BSP_LED_OFF:
HAL_TIM_PWM_Stop(&htim5, tim_ch);
led_stats &= ~tim_ch;
break;
case BSP_LED_TAGGLE:
if (led_stats & tim_ch) {
HAL_TIM_PWM_Stop(&htim5, tim_ch);
led_stats &= ~tim_ch;
} else {
HAL_TIM_PWM_Start(&htim5, tim_ch);
led_stats |= tim_ch;
}
break;
}
return BSP_OK;
}