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; }