R128点灯指南加强篇—LEDC点三色流水灯(WS2812)

r128-devkit 拥有4颗 ws2812led,本文将详细叙述如何点亮他们。
1
ledc模块
简介
ledc 硬件方框图如上图所示,cpu 通过 apb 总线操作 ledc 寄存器来控制 ledc;当 cpu配置好 ledc 的相关寄存器之后,通过 cpu 或 dma 将 r、g、b 数据从 dram 搬到 ledc fifo 中,启动 ledc 之后就可以通过 pin 脚向外部的 led 发送数据了。
led 典型电路如图所示,其中 di 表示控制数据输入脚,do 表示控制数据输出脚。di 端接收从控制器传过来的数据,每个 led 内部的数据锁存器会存储 24bit 数据,剩余的数据经过内部整形处理电路整形放大后通过 do 端口开始转发输出给下一个级联的 led。因此,每经过一个led,数据减少 24bit。
注意,如果在单次直接设置第 n 个 led 的亮度和色彩的时候,前面 n-1 个 led 的亮度数据会在第 n 个 led 的数据前发送,不过这些数据将会是原来 n-1 个 led 的亮度数据。
由于拥有独立的 ledc 模块,在 r128 平台上驱动 ws2812 类似的 rgb led 不需要使用 spi 模拟,也不需要使用 pwm 配置时序。直接使用这个模块即可。
2
ledc驱动
设置
运行 mrtos_menuconfig 进入配置面,前往下列地址找到 ledc devices。
drivers options  --->    soc related device drivers  --->            ledc devices --->                [*] enable ledc driver  
找到 ledc devices
勾选如下选项
3
ledc参数
配置
参考电路图可知,ledc 模块连接的是 r128 的 pa13 引脚。参考手册可知 mux 为 7。
前往以下目录并编辑 ledc 的引脚和mux
lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h#define ledc_pin    gpioa(13)#define ledc_pinmuxsel  7  
然后在以下目录编辑并配置ws2812的时序参数:
lichee/rtos/drivers/rtos-hal/hal/source/ledc/hal_ledc.cstruct ledc_config ledc_config = {    .led_count = 4,    .reset_ns = 84,    .t1h_ns = 1000,    .t1l_ns = 1000,    .t0h_ns = 580,    .t0l_ns = 1000,    .wait_time0_ns = 84,    .wait_time1_ns = 84,    .wait_data_time_ns = 600000,    .output_mode = grb,};  
4
编译测试
简介
编译后烧录开发板
可以用命令 hal_ledc 来测试
hal_ledc  
5
编译测试
点亮红色led
运行命令
hal_ledc 1 r 100  
即可点亮第一颗红色led
6
编译测试
点亮绿色led
运行命令
hal_ledc 2 g 100  
即可点亮第二颗绿色led
7
七彩流水灯
实现
前往项目文件夹编辑 main.c,这里我选择在 m33 核心上编写程序,所以选用的是:
lichee/rtos/projects/r128s2/module_m33/src/main.c  
如果是编写 c906 核心的程序,请修改
lichee/rtos/projects/r128s2/module_c906/src/main.c#include #include #include // 使用rgb 分量合成颜色值#define meragecolor(g, r, b) (((uint32_t)g << 16) | ((uint16_t)r << 8) | b)#define pixel_num 4// 生成颜色uint32_t ws281x_wheel(uint8_t wheelpos) {  wheelpos = 255 - wheelpos;  if (wheelpos 16);    g = (uint8_t) (rgb >> 8);    b = (uint8_t) (rgb);    cmax = r > g ? r : g;    if (b > cmax)        cmax = b;    cmin = r < g ? r : g;    if (b = b)        h = ((g - b) * 60.0f / cdes) + 0;    else if (cmax == r && g < b)        h = ((g - b) * 60.0f / cdes) + 360;    else if (cmax == g)        h = ((b - r) * 60.0f / cdes) + 120;    else        h = ((r - g) * 60.0f / cdes) + 240;    v *= k;    float f, p, q, t;    float rf, gf, bf;    int i = ((int) (h / 60) % 6);    f = (h / 60) - i;    p = v * (1 - s);    q = v * (1 - f * s);    t = v * (1 - (1 - f) * s);    switch (i) {    case 0:        rf = v;        gf = t;        bf = p;        break;    case 1:        rf = q;        gf = v;        bf = p;        break;    case 2:        rf = p;        gf = v;        bf = t;        break;    case 3:        rf = p;        gf = q;        bf = v;        break;    case 4:        rf = t;        gf = p;        bf = v;        break;    case 5:        rf = v;        gf = p;        bf = q;        break;    default:        break;    }    r = (uint8_t) (rf * 255.0);    g = (uint8_t) (gf * 255.0);    b = (uint8_t) (bf * 255.0);    return ((uint32_t) r << 16) | ((uint32_t) g << 8) | b;}// 延时函数static inline int msleep(int ms) {    vtaskdelay(ms / porttick_rate_ms); }// 测试 ledcint ledc_test_loop() {  int i = 0, j = 0, err;  int mode = 0;  uint8_t r = 0, g = 0, b = 0;  err = hal_ledc_init();  if (err) {    printf(ledc init error);    return -1;  }  while (1) {    for (j = 0; j < 256; j++) {      for (i = 0; i < pixel_num; i++) {        sunxi_set_led_brightness(            i + 1, ws281xlset(ws281x_wheel(((i * 256 / pixel_num) + j) & 255), 0.2));        msleep(1);      }      msleep(10);    }  }  return 1;}  
并且将测试函数加入到 cpu0_app_entry 中。
重新烧录即可实现七彩流水灯
本文内容均转载自
https://r128.docs.aw-ol.com/demo/ws2812/#_2


深圳大学城携手华为打造数字化一卡通
差分探头差分信号的常见测量方法
机器人服务产业备受关注,***机器人都已经提上日程
中国芯迎好消息,紫光展锐宣布拟在国内建设DRAM芯片工厂
钢水测温仪的特点_钢水测温仪的优点
R128点灯指南加强篇—LEDC点三色流水灯(WS2812)
新品华为mate10保时捷版曝光,售价过万,连iPhoneX都无力对抗
站群相关问题的解答
温湿度检测仪适用于城市地下管廊监测系统中吗?
交换机和Wi-Fi是无线网络坚强的后盾
赋能半导体智慧工厂 格创东智全面收购飞迅特大陆地区所有权
电磁继电器与固态继电器好坏判断与检测
华为轮值董事长徐直军:共促宽带消费再升级
凌科电气工业连接器在激光清障仪上的优势有哪些?
褶皱的新数学是如何形成的
iphone8正式发布!2500元之差,iphone8和iPhoneX你会选择谁?
美国在月球上建4G蜂窝网络,旨在为长居月球和探索火星做准备
5G时代下远程医疗将走向移动化和便捷化
OPPO Reno5 Pro+配置参数曝光
Mouser供货TI LDC1101 1.8V电感数字转换器