Quadcopter/User/bsp/led_pwm.c
2025-10-03 14:32:06 +08:00

85 lines
3.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Includes ----------------------------------------------------------------- */
#include "led_pwm.h"
#include "main.h"
#include "tim.h"
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
typedef struct {
TIM_HandleTypeDef* htim; // 定时器句柄
uint32_t channel; // 定时器通道
uint8_t bsp_led_s_flag; //LED状态
} BSP_LED_Config_t;
/* Private variables -------------------------------------------------------- */
BSP_LED_Config_t bsp_led_channel_config[] = {
[BSP_PWM_LED_R] = { &htim5, TIM_CHANNEL_3 ,2}, // xxx 对应 TIMx 通道x
[BSP_PWM_LED_G] = { &htim5, TIM_CHANNEL_2 ,2},
[BSP_PWM_LED_B] = { &htim5, TIM_CHANNEL_1 ,2},
};
/* Private function -------------------------------------------------------- */
int8_t BSP_LED_Start(BSP_LED_Channel_t ch) {
if(HAL_TIM_PWM_Start(bsp_led_channel_config[ch].htim, bsp_led_channel_config[ch].channel)!=HAL_OK){
return BSP_ERR;
}else return BSP_OK;
}
/**
* @brief 失能LED PWM通道
* @param ch 自定义LED通道
* @return 成功BSP_OK 错误BSP_ERR
*/
int8_t BSP_LED_Stop(BSP_LED_Channel_t ch){
if(HAL_TIM_PWM_Stop(bsp_led_channel_config[ch].htim, bsp_led_channel_config[ch].channel)!=HAL_OK){
return BSP_ERR;
}else return BSP_OK;
}
/* Exported functions ------------------------------------------------------- */
/**
* @brief 设置LED PWM通道
* @param ch 自定义LED通道
* @param s LED状态
* @param duty_cycle 占空比
* @return 成功BSP_OK 错误BSP_ERR
*/
int8_t BSP_LED_Set(BSP_LED_Channel_t ch, BSP_LED_Status_t s, float duty_cycle) {
if (duty_cycle < 0.0f || duty_cycle > 1.0f) return BSP_ERR;
switch (s) {
case BSP_LED_ON:
if (bsp_led_channel_config[ch].bsp_led_s_flag != 1) {
BSP_LED_Start(ch);
bsp_led_channel_config[ch].bsp_led_s_flag = 1;
}
break;
case BSP_LED_OFF:
if (bsp_led_channel_config[ch].bsp_led_s_flag != 2) {
BSP_LED_Stop(ch);
bsp_led_channel_config[ch].bsp_led_s_flag = 2;
}
break;
case BSP_LED_TOGGLE:
if (bsp_led_channel_config[ch].bsp_led_s_flag == 1) {
BSP_LED_Stop(ch);
bsp_led_channel_config[ch].bsp_led_s_flag = 2;
} else if (bsp_led_channel_config[ch].bsp_led_s_flag == 2) {
BSP_LED_Start(ch);
bsp_led_channel_config[ch].bsp_led_s_flag = 1;
} else {
return BSP_ERR;
}
break;
default:
return BSP_ERR;
}
if(bsp_led_channel_config[ch].bsp_led_s_flag==1)
{
uint16_t pulse = duty_cycle * bsp_led_channel_config[ch].htim->Instance->ARR;
__HAL_TIM_SET_COMPARE(bsp_led_channel_config[ch].htim, bsp_led_channel_config[ch].channel, pulse);
return BSP_OK;
}
return BSP_OK;
}