【STM32】WS2812介绍、使用SPI+DMA发送数据
这篇要使用到SPI+DMA,需要了解的话,可以参考我另两篇博客
时钟:https://www.cnblogs.com/PureHeart/p/11330967.html
SPI+DMA通信:https://www.cnblogs.com/PureHeart/p/11218076.html
文章前半会先介绍WS2812通信方式,文章后半才是SPI+DMA
WS2812,这LED内部已经整合了信号处理的芯片,以4pin的WS2812为例,它的引脚分别是:
VDD:电源,3.5V~5.3V
VSS:地
DIN:数据输入
DOUT:数据输出
相关参数如下图

接下来,才是最主要的,WS2812是如何通信?

它就像一块大蛋糕
把大蛋糕交给第1人,第1人吃了一口
然后把吃过的大蛋糕,交给第2人,第2人吃了一口
再然后把吃过的大蛋糕,交给第3人,第3人吃了一口....
数据也是如此,例如上图,以24bit为1组数据,相当于蛋糕的一口
D1(第一颗LED)收到3组数据(大蛋糕,3×24bit),自己截取一组数据(吃一口,24bit),剩下两组数据(2×24bit),交给D2
D2也截取一组,剩下最后一组,交给D3
D3也一定要截取,然后就没有数据能交给D4了(假设如图那样,只发了3组数据)
那什么时候,WS2812会认为你的数据是新的呢(新一轮的蛋糕)?
低电平时间 >= 50us,WS2812就会认为是新一轮的数据了
至于为什么是低电平,下面的图片,我会和24bit的内容一起介绍

24bit的数据里面,最高8位是控制绿色,中间8位控制红色,低8位控制蓝色
亮度为0~255,所以1111 1111就是最亮,0000 0000就是不亮
然后最最重要的地方来了
这里的1、0,上图说的很明白了
一定时间的高电平 + 一定时间的低电平 = WS2812承认的一位信号(高电平或低电平)
0 code(WS2812承认的低电平)就要求【T0H】和【T0L】的时间,当然 1 code(高电平)也是
所以!
假设以串口为例(用串口比喻,是因为我觉得大家应该都熟悉,当然,这里还没考虑WS2812需要很高波特率这个问题)
设置好串口初始化之类的,然后对照g7,g6,g5,...,b0,调用串口发送3个字节来点亮1个WS2812,这是不可能的!
如下图所示

既然此路不通,那应该如何解决呢?
我们应该进行压缩,如下图

是不是啊,只要我把一个字节的长度(以绿色波形为例),压缩到跟G7一样的长度(图片只压缩到G7~G3,弄的太小就看不清楚啦)
然后再改一下,不要发0x90,按照【T0H、T0L】【T1H、T1L】,就能控制了
所以,要能控制WS2812,我必须要发24个字节,这还只是一个LED要的数据而已
然后是压缩,有经验的人应该马上会想到,其实这就是时钟,设定好SPI的时钟,就能达到这样的效果
那么时钟应该要设置多少呢?
在STM32F4里面,SPI发送可以设置8位或是16位数据
以8位为例,8位的时间总和,不管是 0 code 还是 1 code ,都约等于1.25u
1.25u / 8,每一位等于0.15625u
公式:频率 = 周期的倒数
频率 = 1 / 0.15625u
频率 = 6.4M
SPI设置6.4M就可以了
当然,我上面用的是1.25u,也可以用1.1u,也可以用1.4u(因为有150n的允许误差)
反正不超过规定的值,就可以了。。。也许。。。?
主时钟设置为40M,SPI经过8分频,得到5M
因为我有一些其他外设要配合,才这么设置主时钟的
当然,我实测5M也是可以的。。。
1 / 5M = 0.2u
0.2u × 8 = 1.6u,已经超过规定的1.25u ± 150n 了!
不过可以用就好了。。。
代码,应该也没有什么好讲的了,还是把它贴上吧,另外我有用DMA(减少CPU负担)
下图main函数里while(1)里面的0805LED,只是普通的LED,和WS2812没关系,啊,另外,我用的是STM32F4的芯片
代码链接:https://pan.baidu.com/s/1S33m7tx9Tfg8e3WKphGuNQ
提取码:s82g


【STM32】WS2812介绍、使用SPI+DMA发送数据的更多相关文章
- 为何串口dma发送数据可能不完整
串口dma数据发送不完整, 1. 通过打印log说明数据合成,送给dma buff都是正常的. 2. 数据通过硬件串口直接配置,是正常的 3. 数据通过单片机dma转发后数据异常,通过检查发现 dma ...
- STM32使用DMA发送串口数据
1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- MM32F0140 UART1 DMA RX and TX 中断接收和发送数据
目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...
- STM32 SPI DMA 的使用
一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用 一.SPI信号线说明 通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚.该引脚在从模式下发送数据, ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...
- STM32输入捕获模式设置并用DMA接收数据
参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...
- STM32的PWM输入模式设置并用DMA接收数据
参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...
随机推荐
- Centos7 误删除bin/sbin之类的恢复
参考连接:https://blog.csdn.net/weixin_41843733/article/details/107468767 挂载对应版本的光盘进入急救模式,复制已经丢失的命令到/mnt/ ...
- 【数据结构&算法】05-线性表之数组
目录 前言 线性结构与非线性结构 数组 数组的两个限制 数组的随机访问特性 数组的操作 插入操作 删除操作 数组越界 容器 数组下标 前言 本笔记主要记录数组的一些基础特性及操作. 顺便解答下为什么大 ...
- idea断点调试
基本使用 1 show execution point (Alt+F10):跳转到断点所执行的地方,也就是说你在看代码的时候,点到其他地方,一点这个按钮,就到了程序执行到当前哪行的代码的地方. 2 s ...
- git diff 比较差异
说明 以下命令可以不指定 <filename>,表示对全部文件操作. 命令涉及和 Git本地仓库对比的,均可指定 commit 的版本. HEAD 最近一次 commit HEAD^ 上次 ...
- Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本
title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...
- Python基础(条件判断)
# age = 103 # if age < 90: # print('%s小于90' %age) # elif age > 90 and age < 95: # print('%s ...
- 来了!公开揭密团队成员开发鸿蒙 OpenHarmony 的完整过程(收获官方7000奖金和开发板等,1w字用心总结)
背景 随着 OpenHarmony 组件开发大赛结果公布,我们的团队成员被告知获得了二等奖,在开心之余也想将我们这段时间宝贵的开发经验写下来与大家分享,当我们看到参赛通知的时候已经是 9 月中旬的时候 ...
- element ui tree回显 setCheckedNodes,setCheckedKeys,setChecked等函数报undefined问题
在写项目的时候,需要用到tree组件进行回显来进行权限控制: 在回显过程中使用回显函数会报报undefined, 这时只需要给该函数包裹一层nextTick方法就行了, 在回显过程中我们有可能使用半选 ...
- CF187D BRT Contract
考虑如果哪次经过了红灯则显然已经和出发的时间没关系了. 然后我们需要做的是怎么样找到最近的一个是红灯的点. 然后实际下是我们做一个前缀和:\(L_i = \sum d_i\) 然后求\(\min (L ...
- 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...