85 lines
3.1 KiB
C
85 lines
3.1 KiB
C
/* 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;
|
||
}
|