全志R128芯片应用开发案例——驱动 WS2812 流水灯

驱动 WS2812 流水灯

本文案例代码下载地址
驱动 WS2812 流水灯案例代码https://www.aw-ol.com/downloads?cat=24

R128-DevKit 拥有4颗 WS2812 LED,本文将详细叙述如何点亮他们。

在这里插入图片描述

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 配置时序。直接使用这个模块即可。

设置 LEDC 驱动

运行 mrtos_menuconfig 进入配置页面。前往下列地址找到 LEDC Devices

Drivers Options  --->soc related device drivers  --->LEDC devices --->[*] enable ledc driver

找到 LEDC Devices

在这里插入图片描述

勾选如下选项

在这里插入图片描述

配置 LEDC 参数

参考电路图可知,LEDC 模块连接的是 R128 的 PA13 引脚。参考手册可知 MUX 为 7

在这里插入图片描述

前往 lichee/rtos/drivers/rtos-hal/hal/source/ledc/platform/ledc_sun20iw2.h 并编辑 LEDC 的引脚和MUX

#define LEDC_PIN	GPIOA(13)
#define LEDC_PINMUXSEL	7

在这里插入图片描述

然后编辑 lichee/rtos/drivers/rtos-hal/hal/source/ledc/hal_ledc.c 配置 WS2812 的时序参数:

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

在这里插入图片描述

编译测试

编译后烧录开发板

在这里插入图片描述

可以用命令 hal_ledc 来测试

hal_ledc <LED号> <R|G|B> <亮度>

点亮红色 LED

运行命令

hal_ledc 1 R 100

在这里插入图片描述

即可点亮第一颗 LED

在这里插入图片描述

点亮绿色 LED

运行命令

hal_ledc 2 G 100

在这里插入图片描述

第二颗 LED 即可点亮绿色

在这里插入图片描述

实现七彩流水灯

前往项目文件夹编辑 main.c,这里我选择在 M33 核心上编写程序,所以选用的是 lichee/rtos/projects/r128s2/module_m33/src/main.c ,如果是编写 C906 核心的程序,请修改 lichee/rtos/projects/r128s2/module_c906/src/main.c

#include <sunxi_hal_ledc.h>
#include <hal_cmd.h>
#include <hal_timer.h>// 使用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;elseh = ((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://bbs.aw-ol.com/topic/4368/
资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com
全志及开发者最新动态可以关注全志在线微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【智能家居项目】裸机版本——认识esp8266 | 网络子系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 如上图整个智能家居程序总体框架图&#xff0c;还剩下网络子系统没有实现&#xff0c;以及最终…

Idea JavaWeb项目,继承自HttpFilter的过滤器,启动Tomcat时部署工件出错

JDK版本&#xff1a;1.8 Tomcat版本&#xff1a;8.5 10-Oct-2023 13:55:17.586 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate conta…

2023年中国涂料助剂市场发展历程及趋势分析:中高端助剂市场规模将会迎来新的增长[图]

涂料助剂又称油漆辅料&#xff0c;系配制涂料的辅助材料&#xff0c;能改进涂料性能&#xff0c;促进涂膜形成。种类很多&#xff0c;包括催干剂、增韧剂、乳化剂、增稠剂、颜料分散剂、消泡剂、流平剂、抗结皮剂、消光剂、光稳定剂、防霉剂、抗静电剂等&#xff0c;其中用量最…

虹科分享 | 谷歌Vertex AI平台使用Redis搭建大语言模型

最近&#xff0c;谷歌宣布旗下Vertex人工智能平台最新支持了生成式人工智能&#xff0c;是什么支持语言模型实现与人类的语言交互呢&#xff1f;语言模型的大量知识储备从何而来呢&#xff1f; 一、语言模型构件 应用程序生成、理解和使用人类语言的能力正变得越来越重要&…

java日志框架详解-Log4j2

一、概述 Apache Log4j 2 &#xff08;Log4j – Apache Log4j 2&#xff09;是对Log4j的升级&#xff0c;它比其前身Log4j 1.x提供了重大改进&#xff0c;并参考了Logback中优秀的设计&#xff0c;同时修复了Logback架构中的一些问题。被誉为是目前最优秀的Java日志框架&#x…

Mac电脑版鼠标连点工具 RapidClick for Mac

RapidClick是一款简单实用的自动点击软件。它可以模拟鼠标点击操作&#xff0c;以便快速、连续地点击屏幕上的特定位置。该软件通常用于自动执行重复性的点击任务或加快某些操作的速度。 以下是RapidClick可能提供的一些主要功能和特点&#xff1a; 自动点击功能&#xff1a;R…

C++对string进行大小写转换的三种方法

C对string进行大小写转换的三种方法 方法一&#xff1a;下标 #include <iostream> #include <string> using namespace std;int main() {string s "ABCDEFG";for( int i 0; i < s.size(); i ){s[i] tolower(s[i]);}cout<<s<<endl;re…

LATR:3D Lane Detection from Monocular Images with Transformer

参考代码&#xff1a;LATR 动机与主要工作&#xff1a; 之前的3D车道线检测算法使用诸如IPM投影、3D anchor加NMS后处理等操作处理车道线检测&#xff0c;但这些操作或多或少会存在一些负面效应。IPM投影对深度估计和相机内外参数精度有要求&#xff0c;anchor的方式需要一些如…

SpringCloud学习笔记-Ribbon负载均衡

目录 1.负载均衡策略2.自定义负载均衡策略3.饥饿加载 SpringCloudRibbon的底层采用了一个拦截器&#xff0c;拦截了RestTemplate发出的请求&#xff0c;对地址做了修改。用一幅图来总结一下&#xff1a; 基本流程如下&#xff1a; 拦截我们的RestTemplate请求http://userserv…

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目&#xff1a;FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址&#xff1a;https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…

毛玻璃 has 选择器卡片悬停效果

效果展示 页面结构 从上述的效果展示可以看到&#xff0c;页面是由多个卡片组成&#xff0c;并且鼠标悬停在卡片上时&#xff0c;会旋转用户图片并且韩式对应的用户信息框。 CSS3 知识点 :has 属性的运用 实现页面整体结构 <div class"container"><div…

linux | linux扩大磁盘空间 | centos7.9 | 虚拟机

注意&#xff1a;可以完全参考下面这边博客&#xff08;我只是搬运工&#xff09; centos扩大磁盘空间 简单讲讲&#xff0c;为什么有点失落落的&#xff1f; 明明就是一个 很程序化的东西 可是网上一大推 天花乱坠 而且很多人都是半吊子水&#xff0c;甚至半吊子都没有 通过关…

Ubuntu16.04apt更新失败

先设置网络设置 换成nat、桥接&#xff0c;如果发现都不行&#xff0c;那么就继续下面操作 1.如果出现一开始就e&#xff0c;检查源&#xff0c;先换源 2.换完源成功之后&#xff0c;ping网络&#xff0c;如果ping不通就是网络问题 如果ping baidu.com ping不通但是ping 112…

[网鼎杯 2018]Comment git泄露 / 恢复 二次注入 bash_history文件查看

首先我们看到账号密码有提示了 我们bp爆破一下 我首先对数字爆破 因为全字符的话太多了 爆出来了哦 所以账号密码也出来了 zhangwei zhangwei666 没有什么用啊 扫一下吧 有git git泄露 那泄露看看 真有 <?php include "mysql.php"; session_start(); if(…

leetCode 53.最大子数组和 动态规划 + 优化空间复杂度

关于此题我的往期文章&#xff1a; leetCode 53.最大子数和 图解 贪心算法/动态规划优化_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/13349726853. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; >&…

NSA 和 CISA 揭示十大网络安全错误配置

美国国家安全局 (NSA) 和网络安全与基础设施安全局 (CISA) 在5日公布了其红蓝团队在大型组织网络中发现的十大最常见的网络安全错误配置。 通报还详细介绍了威胁行为者使用哪些策略、技术和程序 (TTP) 来成功利用这些错误配置来实现各种目标&#xff0c;包括获取访问权限、横向…

40V汽车级P沟道MOSFET SQ4401EY-T1_GE3 工作原理、特性参数、封装形式—节省PCB空间,更可靠

AEC-Q101车规认证是一种基于失效机制的分立半导体应用测试认证规范。它是为了确保在汽车领域使用的分立半导体器件能够在严苛的环境条件下正常运行和长期可靠性而制定的。AEC-Q101认证包括一系列的失效机制和应力测试&#xff0c;以验证器件在高温、湿度、振动等恶劣条件下的可…

设计模式 - 行为型模式:责任链模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、责任链模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、责任链模式 1.1.1、概述 为了避免请求发送者和多个请求处理者耦合在一起&#xff0c;就将所有请求处理者通过前一个对象记住下一个对象的引用的方…

uniapp apple 苹果登录 离线本地打包

官方文档 uni-app官网 文档写的不全&#xff0c;没有写离线打包流程 加lib 签名里带 sign in with apple hbuilder开关 代码 测试代码&#xff0c;获取app里所有的provider uni.getProvider({service: oauth,success: function (res) {console.log(res.provider)uni.showT…