STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法

news2024/10/1 23:36:01

一种高效的WS2812B控制算法——基于STM32G431CBU6的SPI+DMA

1.WS2812B介绍

ws2812b是一款集控制电路与发光电路于一体的智能外控LED光源,采用单线归0码协议,每个像素点的三基色颜色可实现256级亮度显示。速率能达到1024pixel × 30fps / s,故被广泛用于各种需要大量使用RGB灯的场合。

不同厂商生产的ws2812存在不同的时序要求,下图是一款最常见的ws2812b通信协议。由此可以看出,我们一个0码1码的周期在800ns~1400ns左右。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJAg06sd-1684475130170)(./assets/image-20230519115905699.png)]

如果使用GPIO直接控制该总线,不但时序不好保证(编译器优化不同、不同库的汇编编译结果不同),而且十分占用CPU资源。如果采用外设去模拟IO口的翻转,则可以极大的减少CPU的资源占用。目前常见的通用外设控制方案为IICSPIPWM等。考虑IIC可能使用得较多,故采用相对较少使用得SPI总线模拟该归0协议。若使用IIC模拟的思路相同。

2.SPI介绍

SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI01的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。

SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]

  • CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-msNpNf3K-1684475130171)(./assets/205973_fig_03.png)]

  • CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出
    在这里插入图片描述

由于需要控制某个电平持续一定时间,那么数据采样需要在时钟周期的结束,而不是开始,即CPHA = 1

3.设计思路

由于控制高低电平占比(ws2812 bit)的时间需要多个SPI bit,故SPI发送的长度肯定大于通信的内容,即用多个SPI bit去模拟一个ws2812 bit。常见的SPI传输是8bit,但也可配置为12、16等比特。但为了DMA搬运数据时方便对齐,故配置为8bit

SPI 8bit的数据长度下,我们采用2,4,8,12,16的SPI bit去模拟一个ws2812 bit。比如可以得出一下组合(实际上的ws2812时序并没有数据手册上那么严格,且不同厂家的配置不同):

  • 用4个SPI bit去模拟,则用SPI bit表示ws2812 bit0为:1000bit1可表示为1110。且一个SPI bit在250~420ns均可。
  • 用8个SPI bit去模拟,则用SPI bit表示ws2812 bit0为:1100 0000bit1可表示为1111 1100。且一个SPI bit在120~210ns均可。

当然不同比例的SPI bit可以调整出不同的SPI时间,具体根据SPI的配置时间。8个SPI bit能将时间调整得更精细,而4个SPI bit更省RAM。具体怎么配置还要和SPI的速度匹配。故我采用4个SPI bit模式。那么SPI的通信速率为 1 250 n s ≤ f r e q ≤ 1 420 n s \frac{1}{250ns}≤freq≤\frac{1}{420ns} 250ns1freq420ns1。即2.4Mbps~4Mbps。

4.实现

用4个SPI bit去模拟,则用SPI bit表示ws2812 bit0为:1000bit1可表示为1110。即LOW=0x08 HIGH=0x0E

首先将SPI调整发送模式数据长度大小端分频系数CPHA

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbqydMj4-1684475130172)(./assets/image-20230519121023359.png)]

然后配置GPIO,把发送脚配置为下拉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WPNgWMtC-1684475130172)(./assets/image-20230519121138265.png)]

最后配置DMA管脚方向位宽

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jr7f2hVU-1684475130173)(./assets/image-20230519121211447.png)]

代码:

#define  WSLEDNUM    8												// 定义灯的数量
uint8_t  wsFillMap[4] = {0x88, 0x8E, 0xE8, 0xEE};       			// 这是一个哈希表 00=0x88 01=0x8E 10=0xE8 11=0xEE
uint8_t  ws2812Buffer[WSLEDNUM*12+2] = {0};							// 数组缓冲区

void setOnePixRGB(uint8_t R, uint8_t G, uint8_t B, uint16_t index)
{
	uint8_t i;
	uint8_t *bufHead = ws2812Buffer + (12 * index);					// 通过bufHead确定该像素的首地址,减少后面计算
	
	for (i = 0; i < 4; ++i)											// 每次位移两位,通过哈希表来填充缓存区(当然你可以写一个4位的哈希表,就不用位移了)。并同时为GRB赋值,减少循环次数。
	{
			bufHead[0+i] = wsFillMap[(G >> (2 * i)) & 0x03];
			bufHead[4+i] = wsFillMap[(R >> (2 * i)) & 0x03];
			bufHead[8+i] = wsFillMap[(B >> (2 * i)) & 0x03];
	}
}

void flushWs2812(void)												// 刷新函数,多发两个低电平稳定电平(心里安慰,其实没用)
{
	HAL_SPI_Transmit_DMA(&hspi1, ws2812Buffer, WSLEDNUM*12+2);
}

这段代码实现了刷新一个灯的缓冲区,并通过哈希表减少运算量。最后通过DMA发送缓冲区数据即更新所有灯的状态。

注意,同时因为下拉的存在,所以不需要发送很多的0来发送RESET,但必须需保证两帧间隔大于文档中的RESET码时间。

5.总结与展望

实际上,这次买的ws2812b系列的灯,并不是该厂家的。通过调整系统主频发现可以稳定“超频”到5Mbps的SPI速率,由于STM32G431CBU6可以达到150M甚至170M,所以最终固定为:150MHz的主频,4.6875MbpsSPI

150M的主频下,执行setOnePixRGB()这个函数1000次仅用时800us,故在不考虑DMA效率下,连续设置250个灯的时间也小于RESET200us的时间,可以放心用,不用考虑双Buffer,更省RAM

最后,这段代码仅提供思路,哈希表可以更加优化,对长灯带的缓存区数据填充有更合适的方法。

6.参考文献

1.Piyu Dhaker. SPI接口简介[EB/OL]. 亚德诺半导体, 2017-06-19. [2023-05-19]. https://www.analog.com/cn/analog-dialogue/articles/introduction-to-spi-interface.html.

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

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

相关文章

什么是可信时间戳?可信时间戳电子取证有效吗?

电子数据具有脆弱性、易变性、隐蔽性、载体多样性等特点&#xff0c;容易被复制、删除、篡改且难以被发现。因此&#xff0c;电子数据在实际的司法认定过程中&#xff0c;很难准确鉴定其生成的时间以及内容的真实性、完整性。可信时间戳是一种公认的技术手段&#xff0c;可为电…

拉格朗日插值定理

拉格朗日插值法是一种函数逼近方法&#xff0c;通过已知的数据点构建一个多项式函数&#xff0c;该函数能够恰好经过这些数据点。它可以用于插值&#xff0c;即根据给定的离散数据点推断出未知函数在其它点上的取值。拉格朗日插值法的优点是计算简单&#xff0c;容易理解和实现…

从初级软件测试,到高级软件测试的必经之路

作为软件质量控制中的重要一环&#xff0c;软件测试工程师基本处于"双高"地位&#xff0c;即&#xff1a;地位高、待遇高&#xff0c;而随着软件测试行业等级越来越专业化&#xff0c;软件测试工程师也随即被分为不同的等级&#xff0c;即&#xff1a;初级测试工程师…

《SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection》论文阅读理解

《SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection》论文阅读理解 领域&#xff1a;用于医学图像的异常检测 论文地址&#xff1a;SQUID: Deep Feature In-Painting for Unsupervised Anomaly Detection 目录 《SQUID: Deep Feature In-Painting for Un…

5月19号软件资讯更新合集.....

ohUrlShortener 短链接系统 v2.0 发布 | 指定「打开方式」功能支持 距上一次更新版本差不多两个月&#xff0c;ohUrlShortener 短链接系统与昨天晚上正式发布 v2.0 版本 这个版本主要的变化&#xff1a; 启动性能优化&#xff1a;在短链接数量持续上升之后&#xff0c;启动系…

Halcon 算子 select_shape_std 和 select_shape_xld区别

文章目录 1 select_shape_std 算子介绍2 select_shape_xld算子介绍3 select_shape_std 和 select_shape_xld区别4 Halcon 算子的特征 Features 列表介绍1 select_shape_std 算子介绍 select_shape_std (Operator) Name select_shape_std — Select regions of a given shape.Si…

JavaWeb14 - 数据交换 - 01 - JSON

1. 概述 1.1 官方文档 Json 在线文档&#xff1a;https://www.w3school.com.cn/js/js_json_intro.asp 1.2 JSON 介绍 JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本数据交换格式【老师解读】 JSON 独立于语言 …

Cloud Studio 内核升级之专注体验

前言 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能使用。云端开发体验与本地几乎一样&#xff0c;上手门槛更低&#…

使用Python实现Rest API指南

在今天的数字化世界中&#xff0c;数据的获取、交换和使用已经成为几乎所有行业的核心部分。无论您正在为一个大型公司设计复杂的软件系统&#xff0c;还是只是为了个人项目尝试获得一些公开的数据&#xff0c;理解和利 用API——尤其是RESTful API——都是一项至关重要的技术。…

一道php反序列化题的pop链构造

题目地址为&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场 点击进入如下题 题目代码如下&#xff0c;其中像套娃一样&#xff0c;多次对魔术方法进行调用&#xff0c;挺烧脑。根据题目&#xff0c;显然目标是echo $flag <?php //flag is in flag.php erro…

Flask send_file函数导致的绝对路径遍历

平时接触到的 python 项目并不多&#xff0c;对 python 的代码审计更是没有接触&#xff0c;偶然朋友发来了一个漏洞 Flask send_file函数导致的绝对路径遍历 &#xff0c;感觉打开了新世界的大门&#xff0c;于是就以一个初学者的角度&#xff0c;进行复现分析一下。详情也可以…

算法:回溯算法套路总结

目录 1、回溯算法最初的模板 2、收获节点包括剪枝、去重等操作需要在模板上加上什么东西 2.1 收获的是否为叶子节点 2.1.1 收获的是叶子节点的数据 2.1.2 收获的节点不是叶子节点的数据 2.2 能否重复选取数据 2.2.1 不能重复选取数据 2.2.2 可以重复选取数据 2.3 剪枝…

Yolov8涨点技巧:BIFPN,加权双向特征金字塔网络,对小目标涨点显著

论文:https://arxiv.org/abs/1911.09070 🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新

[pgrx开发postgresql数据库扩展]7.返回序列的函数编写(3)多行表序列

前文再续&#xff0c;书接上一回。 上一回我们解析了如何通过pgrx编写srf&#xff0c;返回一个TableIterator&#xff0c;但是在具体应用的时候&#xff0c;我们还是针对一条记录返回了一行数据&#xff08;多个字段的一行&#xff0c;也还是一行&#xff09;&#xff0c;并没…

麒麟V10系统arm版安装g++时,发现的问题及解决方法

在麒麟V10系统&#xff0c;安装Qt时&#xff0c;发现没有g&#xff0c;打算安装一个 1. 用命令直接安装(需要连网) sudo apt-get install g 运行后出现报错&#xff1a;暂不能解析域名 若出现其他问题&#xff1a;https://www.5axxw.com/questions/simple/g7yvfq 2. 为解决报…

朝天椒USB Server登场!EastFax USB Server品牌重塑正式启动

EastFax USB Server是复园科技旗下的第三款toB技术服务产品&#xff0c;诞生于2019年&#xff0c;旨在帮助企业实现加密狗、Ukey、网银U盾等USB的远程调用&#xff0c;拔除卡在数字化转型齿轮里的“USB无法上云”的小石子。 EastFax USB Server的名称直接来自复园科技在十八年…

AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT

GAI&#xff1a;发展历史&#xff0c;核心技术&#xff0c;应用领域以及未来发展 摘要1、引言1.1、主要贡献1.2、组织结构 2、生成式AI的发展历史2.1、NLP领域的发展2.2、CV领域的发展2.3、CV与NLP的融合 3、AIGC的核心技术基础3.1、经典基础模型3.1.1、Transformer3.1.2、Pre-…

面试十分钟不到就被赶出来了,问的实在是太变态了...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…

8年开发经验,浅谈 API 管理

随着信息化飞速增长的还有各信息系统中的应用接口&#xff08;API&#xff09;&#xff0c;API作为信息系统内部及不同信息系统之间进行数据传输的渠道&#xff0c;其数量随着软件系统的不断庞大而呈指数型增长&#xff0c;如何管理这些API已经在业界变得越来越重要&#xff0c…

网络管理 - OSPF 动态路由协议

文章目录 1 概述1.1 五种报文1.2 运行原理1.3 区域概念1.4 状态1.5 身份 2 实验配置2.1 网络拓扑图2.2 配置命令 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-EOOBZo0uztmJLHOT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…