1、环境搭建
环境参考
链接是这个:https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=45813&highlight=Vs%2BCode
VSCode的安装教程在CSDN有很多,插件也跟着装好。
2、点亮小灯
第一步就是编译例程里的blink,点亮一下开发板
第二步,看原理图找引脚

第三步,改例程点亮验证一下
①任务实现代码
#define GPIO_LED_BLUE 3 //pwmch3
#define GPIO_LED_RED 14 //ch4
#define GPIO_LED_GREEN 17 //ch2
void blink_test(void *param)
{
uint8_t value = 1;
while (1)
{
// bl_gpio_enable_output(GPIO_LED_BLUE, 0, 1);
bl_gpio_enable_output(GPIO_LED_GREEN, 0, 0);
// bl_gpio_enable_output(GPIO_LED_RED, 0, 0);
printf("Turning the LED %s! \r\n", value == 1 ? "ON" : "OFF");
// bl_gpio_output_set(GPIO_LED_BLUE, value);
bl_gpio_output_set(GPIO_LED_GREEN, value);
// bl_gpio_output_set(GPIO_LED_RED, value);
value = !value;
vTaskDelay(1000);
}
}
②实现效果

这里有问题,不知道为什么蓝灯也会亮。↓

第四步,基于HSV模型实现彩虹灯,
色相(H):0-360°,控制颜色类型(红/绿/蓝等),
饱和度(S):0-100%,控制颜色纯度,
亮度(V):0-100%,控制明暗变化(呼吸效果核心参数)。
①HSV转化成RGB
typedef struct { float h, s, v; } HSV;//色相,饱和度,亮度
typedef struct { uint8_t r, g, b; } RGB;
// HSV转RGB函数
RGB hsv_to_rgb(HSV hsv)
{
float h = fmod(hsv.h, 360.0f);
if (h < 0) h += 360.0f;float s = hsv.s;
float v = hsv.v;
float c = v * s;
float x = c * (1 - fabs(fmod(h / 60.0f, 2) - 1));
float m = v - c;
float r, g, b;
if (h >= 0 && h < 60) { r = c; g = x; b = 0; }
else if (h >= 60 && h < 120) { r = x; g = c; b = 0; }
else if (h >= 120 && h < 180) { r = 0; g = c; b = x; }
else if (h >= 180 && h < 240) { r = 0; g = x; b = c; }
else if (h >= 240 && h < 300) { r = x; g = 0; b = c; }
else { r = c; g = 0; b = x; }
r = (r + m);
g = (g + m);
b = (b + m);
return (RGB){
.r = (uint8_t)fmin(fmax(r * 255, 0), 255),
.g = (uint8_t)fmin(fmax(g * 255, 0), 255),
.b = (uint8_t)fmin(fmax(b * 255, 0), 255)
};
}
②任务函数具体实现
void test3(void *param)
{
HSV hsv = {0, 1.0, 1.0};
float t = 0;
bl_pwm_init(3, 3, 50000);
bl_pwm_stop(3);
bl_pwm_init(4, 14, 50000);
bl_pwm_stop(4);
bl_pwm_init(2, 17, 50000);
bl_pwm_stop(2);
while(1) {
hsv.h = fmod(t * 20, 360);
hsv.v = 0.8 + 0.2 * sin(t * 0.5);
RGB rgb = hsv_to_rgb(hsv);
// 颜色校准,可有可无
const float red_gain = 1.0;
const float green_gain = 0.9;
const float blue_gain = 1.3;
//前面都是按照255算的颜色,调用函数的话占空比范围为0-100
bl_pwm_set_duty(3, rgb.b * blue_gain * 100 / 255);
bl_pwm_set_duty(4, rgb.r * red_gain * 100 / 255);
bl_pwm_set_duty(2, rgb.g * green_gain * 100 / 255);
bl_pwm_start(3);
bl_pwm_start(4);
bl_pwm_start(2);
t += 0.05;
vTaskDelay(pdMS_TO_TICKS(20));
}
}
③主函数
void main(void)
{
xTaskCreate(test3, "test3", 1024, NULL, 15, NULL);
}
④显示效果