X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
国产芯片交流
[MCU] 全志R128芯片 基础组件开发指南——RTOS 多媒体解码
aleksib
2023-10-10 14:10
楼主
# 驱动 WS2812 流水灯 | 本文案例代码 | 下载地址 | | ---------------------- | -------------------------------------- | | 驱动 WS2812 流水灯案例代码 | https://www.aw-ol.com/downloads?cat=24 | R128-DevKit 拥有4颗 WS2812 LED,本文将详细叙述如何点亮他们。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fa53c4e1e4694fb882ae7990d9b0357f.png#pic_center) ## LEDC 模块简介 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1ec7cbceb438498aa7014c70d93b3c28.png#pic_center) LEDC 硬件方框图如上图所示,CPU 通过 APB 总线操作 LEDC 寄存器来控制 LEDC;当 CPU配置好 LEDC 的相关寄存器之后,通过 CPU 或 DMA 将 R、G、B 数据从 DRAM 搬到 LEDC FIFO 中,启动 LEDC 之后就可以通过 PIN 脚向外部的 LED 发送数据了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f6c0b27883534ec5a8d3b4fc57a1e471.png#pic_center) LED 典型电路如图所示,其中 DI 表示控制数据输入脚,DO 表示控制数据输出脚。DI 端接收从控制器传过来的数据,每个 LED 内部的数据锁存器会存储 24bit 数据,剩余的数据经过内部整形处理电路整形放大后通过 DO 端口开始转发输出给下一个级联的 LED。因此,每经过一个LED,数据减少 24bit。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/77c565c00b1449a8adcff158a17d5d9e.png#pic_center) 注意,如果在单次直接设置第 n 个 LED 的亮度和色彩的时候,前面 n-1 个 LED 的亮度数据会在第 n 个 LED 的数据前发送,不过这些数据将会是原来 n-1 个 LED 的亮度数据。 由于拥有独立的 LEDC 模块,在 R128 平台上驱动 WS2812 类似的 RGB LED 不需要使用 SPI 模拟,也不需要使用 PWM 配置时序。直接使用这个模块即可。 ## 设置 LEDC 驱动 运行 `mrtos_menuconfig` 进入配置页面。前往下列地址找到 `LEDC Devices` ``` Drivers Options---> soc related device drivers---> LEDC devices ---> [*] enable ledc driver ``` 找到 LEDC Devices ![在这里插入图片描述](https://img-blog.csdnimg.cn/462fe3e922ed40dd92ef3fa178088a2b.png#pic_center) 勾选如下选项 ![在这里插入图片描述](https://img-blog.csdnimg.cn/159e04f7b78c40a7b7c913acba339927.png#pic_center) ## 配置 LEDC 参数 参考电路图可知,LEDC 模块连接的是 R128 的 `PA13` 引脚。参考手册可知 MUX 为 7 ![在这里插入图片描述](https://img-blog.csdnimg.cn/137f66c1bc4d421e9d831d53fe027a8e.png#pic_center) 前往 `lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h` 并编辑 LEDC 的引脚和MUX ```c #define LEDC_PIN GPIOA(13) #define LEDC_PINMUXSEL 7 ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc09ba7260b44df09e9f6c378a40d1b8.png#pic_center) 然后编辑 `lichee/rtos/drivers/rtos-hal/hal/source/ledc/hal_ledc.c` 配置 WS2812 的时序参数: ```c struct 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", }; ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/f9bb0914c6f34824b1f69740fc4c370d.png#pic_center) ## 编译测试 编译后烧录开发板 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a181e79d5964660b8c91e70fafa026b.png#pic_center) 可以用命令 `hal_ledc` 来测试 ``` hal_ledc
<亮度> ``` ### 点亮红色 LED 运行命令 ``` hal_ledc 1 R 100 ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/391b9e8329984c0a8a1e5f0b267ea391.png#pic_center) 即可点亮第一颗 LED ![在这里插入图片描述](https://img-blog.csdnimg.cn/971ef9cfafbf487d8899c6ca9bfbbce3.png#pic_center) ### 点亮绿色 LED 运行命令 ``` hal_ledc 2 G 100 ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/e3a454707c574dafb33ebdfbdc39677e.png#pic_center) 第二颗 LED 即可点亮绿色 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8c034d123fa446158e204ede4d6bdf91.png#pic_center) ## 实现七彩流水灯 前往项目文件夹编辑 `main.c`,这里我选择在 M33 核心上编写程序,所以选用的是`lichee/rtos/projects/r128s2/module_m33/src/main.c` ,如果是编写 C906 核心的程序,请修改 `lichee/rtos/projects/r128s2/module_c906/src/main.c` ```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 < 85) { return MERAGECOLOR(255 - wheelPos * 3, 0, wheelPos * 3); } if (wheelPos < 170) { wheelPos -= 85; return MERAGECOLOR(0, wheelPos * 3, 255 - wheelPos * 3); } wheelPos -= 170; return MERAGECOLOR(wheelPos * 3, 255 - wheelPos * 3, 0); } // 亮度设置 uint32_t WS281xLSet(uint32_t rgb, float k) { uint8_t r, g, b; float h, s, v; uint8_t cmax, cmin, cdes; r = (uint8_t) (rgb >> 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 < cmin) cmin = b; cdes = cmax - cmin; v = cmax / 255.0f; s = cmax == 0 ? 0 : cdes / (float) cmax; h = 0; if (cmax == r && g >= 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); } // 测试 LEDC int 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\n"); 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://img-blog.csdnimg.cn/f211441132a64b56865876bcd9b62774.png#pic_center) 重新烧录即可实现七彩流水灯 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dbee5cbfa1bb4115bc1d641551615564.png#pic_center) > 原贴链接:[https://bbs.aw-ol.com/topic/4368/](https://bbs.aw-ol.com/topic/4368/) > 资源获取、问题讨论可以到全志在线开发者社区进行:[https://www.aw-ol.com](https://www.aw-ol.com) >全志及开发者最新动态可以关注**全志在线微信公众号**
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
随便看看
刚参加工作那会是不是也每天很欢乐啊?
改善DC-DC动态特性的小妙招
51单片机
关于CMD里的OBJ及LIB问题
【贡献闲置】书和芯片
【迪文串口屏】核酸采样登记系统之四 查询数据并显示
DSP的存储空间分配
【GD32F307E-START】+串口通讯测试
汽车电池电压表电路采用了LED
没有原理图自己瞎搞的原件回路是不能用自动布线的嘛?
设备重启后更改的系统配置和文件丢失
心电应用指南
【SQL Server CE2.0】link错误
关于STM32定时器,无法关闭自动重载的问题
SPI通讯问题
有换过鼠标微动按键开关的吗
有没有讲PLC模块电路本身开发的书 请推荐一下
攒分,请无视
FPGA布线设计再添利器-全自动IO口SWAP
基于51单片机的pwm技术C语言实现原理
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复