1、开发环境的搭建有很多论坛的朋友已经发过了,这里就不在赘述了。
2、过程贴就先实现第一个任务点亮RGB吧!不过简单的点亮并没有什么太大的意思,既然是RGB灯珠那就来个简单粗暴的渐变霓虹灯吧(没有加入成功视频,提示格式不支持

那就只展示代码和图片吧)

(每 2° 递增色相,形成 180 个彩虹过渡色,55hz的频率)
#include "mxc_device.h"
#include "mxc_delay.h"
#include "gpio.h"
#include "board.h"
#include <stdint.h>
#include <stddef.h>
static const mxc_gpio_cfg_t rgb_red_pin = {
MXC_GPIO2, MXC_GPIO_PIN_0, MXC_GPIO_FUNC_OUT,
MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};
static const mxc_gpio_cfg_t rgb_green_pin = {
MXC_GPIO2, MXC_GPIO_PIN_1, MXC_GPIO_FUNC_OUT,
MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};
static const mxc_gpio_cfg_t rgb_blue_pin = {
MXC_GPIO2, MXC_GPIO_PIN_2, MXC_GPIO_FUNC_OUT,
MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};
static void rgb_apply_pwm(uint8_t r, uint8_t g, uint8_t b, uint32_t duration_ms)
{
const uint32_t frame_us = 1000;
uint32_t cycles = duration_ms;
if (cycles == 0)
{
cycles = 1;
}
for (uint32_t c = 0; c < cycles; ++c)
{
uint32_t r_on = ((uint32_t)r * frame_us) / 255U;
uint32_t g_on = ((uint32_t)g * frame_us) / 255U;
uint32_t b_on = ((uint32_t)b * frame_us) / 255U;
if (r_on)
{
MXC_GPIO_OutClr(rgb_red_pin.port, rgb_red_pin.mask);
MXC_Delay(MXC_DELAY_USEC(r_on));
MXC_GPIO_OutSet(rgb_red_pin.port, rgb_red_pin.mask);
}
if (g_on)
{
MXC_GPIO_OutClr(rgb_green_pin.port, rgb_green_pin.mask);
MXC_Delay(MXC_DELAY_USEC(g_on));
MXC_GPIO_OutSet(rgb_green_pin.port, rgb_green_pin.mask);
}
if (b_on)
{
MXC_GPIO_OutClr(rgb_blue_pin.port, rgb_blue_pin.mask);
MXC_Delay(MXC_DELAY_USEC(b_on));
MXC_GPIO_OutSet(rgb_blue_pin.port, rgb_blue_pin.mask);
}
uint32_t used = r_on + g_on + b_on;
if (used < frame_us)
{
MXC_Delay(MXC_DELAY_USEC(frame_us - used));
}
}
}
static void hsv_to_rgb(uint16_t hue, uint8_t sat, uint8_t val,
uint8_t *r, uint8_t *g, uint8_t *b)
{
if (sat == 0U)
{
*r = *g = *b = val;
return;
}
hue %= 360U;
uint16_t region = hue / 60U;
uint16_t remainder = (hue % 60U) * 255U / 60U;
uint32_t p = ((uint32_t)val * (255U - sat)) / 255U;
uint32_t q = ((uint32_t)val * (255U - ((uint32_t)sat * remainder) / 255U)) / 255U;
uint32_t t = ((uint32_t)val * (255U - ((uint32_t)sat * (255U - remainder)) / 255U)) / 255U;
switch (region)
{
case 0:
*r = val;
*g = (uint8_t)t;
*b = (uint8_t)p;
break;
case 1:
*r = (uint8_t)q;
*g = val;
*b = (uint8_t)p;
break;
case 2:
*r = (uint8_t)p;
*g = val;
*b = (uint8_t)t;
break;
case 3:
*r = (uint8_t)p;
*g = (uint8_t)q;
*b = val;
break;
case 4:
*r = (uint8_t)t;
*g = (uint8_t)p;
*b = val;
break;
default:
*r = val;
*g = (uint8_t)p;
*b = (uint8_t)q;
break;
}
}
static void RGB_Init(void)
{
MXC_GPIO_Config(&rgb_red_pin);
MXC_GPIO_Config(&rgb_green_pin);
MXC_GPIO_Config(&rgb_blue_pin);
MXC_GPIO_OutSet(rgb_red_pin.port, rgb_red_pin.mask);
MXC_GPIO_OutSet(rgb_green_pin.port, rgb_green_pin.mask);
MXC_GPIO_OutSet(rgb_blue_pin.port, rgb_blue_pin.mask);
}
int main(void)
{
if (Board_Init() != E_NO_ERROR)
{
return -1;
}
RGB_Init();
uint16_t hue = 0;
while (1)
{
uint8_t r, g, b;
hsv_to_rgb(hue, 255U, 255U, &r, &g, &b);
rgb_apply_pwm(r, g, b, 18U); // 55hz
hue = (uint16_t)((hue + 2U) % 360U);
}
return 0;
}
我要赚赏金
