STM32F103C8T6使用SPI接口驱动WS2812b灯条

发布者:HarmonyJoy最新更新时间:2024-08-13 来源: cnblogs关键字:STM32F103C8T6  SPI接口  驱动 手机看文章 扫描二维码
随时随地手机看文章

之前一篇文章写了使用IO控制WS2812b操作原理,但是由于IO的输出比较慢,所以现在改用了硬件SPI控制WS2812b灯条
把SPI的mosi线接到ws2812b的数据线,SPI的速率可达十几Mbit/s,如此高的传输速率,我们可以使用一个(uint8_t)类型的数据代表一个码1或者码0;
也就是说,本来控制一个灯珠的数据由3个Byte(24位)变成了24Byte,每个bit转换成一个Byte;
具体看时钟如何配置的。
SPI配置:

在上一篇文章可以看到控制一个码的周期在1.25us±300ns之间,现在把时钟配成9Mbit/s,这个的话每个码的周期大概就在889ns,和LED的周期略有误差;
从规格书上可以看到码1和码0的占空比是大致分配一下1个byte的8个bit;
我这里分配的是
码1:0xF8;
码0:0xE0;

可以根据自己的具体情况取修改码0和码1的分配,下面是驱动ws2812b的代码

ws2812b.h

#ifndef __WS2812B_H__

#define __WS2812B_H__


#include


//            编码 0 : 11100000

#define CODE_0 0xE0

//            编码 1 : 11111000

#define CODE_1 0xF8

/*ws2812b灯珠数量*/

#define WS2812B_AMOUNT 8


typedef struct

{

uint8_t R;

uint8_t G;

uint8_t B;

} tWs2812bCache_TypeDef;


extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];


void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b);

void WS2812B_Task(void);


#endif

ws2812b.c


#include 'ws2812b.h'

#include 'spi.h'


//灯条显存SPI数据缓存

uint8_t gWs2812bDat_SPI[WS2812B_AMOUNT * 24] = {0};

//灯条显存

tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT] = {

//R    G      B

0X0F, 0X0F, 0X0F, //0

0X0F, 0X0F, 0X0F, //1

0X0F, 0X0F, 0X0F, //2

0X0F, 0X0F, 0X0F, //3

0X0F, 0X0F, 0X0F, //4

0X0F, 0X0F, 0X0F, //5

0X0F, 0X0F, 0X0F, //6

0X0F, 0X0F, 0X0F, //7

};

void WS2812b_Set(uint16_t Ws2b812b_NUM, uint8_t r,uint8_t g,uint8_t b)

{

uint8_t *pR = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 8];

uint8_t *pG = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24];

uint8_t *pB = &gWs2812bDat_SPI[(Ws2b812b_NUM) * 24 + 16];

for(uint8_t i = 0; i <  8; i++) {

if(g & 0x80) {

*pG = CODE_1;

}           

else {           

*pG = CODE_0;

}           

if(r & 0x80) {           

*pR = CODE_1;

}           

else {           

*pR = CODE_0;

}           

if(b & 0x80) {           

*pB = CODE_1;

}           

else {           

*pB = CODE_0;

}

r <<= 1;

g <<= 1;

b <<= 1;

pR++;

pG++;

pB++;

}

}

void WS2812B_Task(void)

{

uint8_t dat = 0;

//将gWs2812bDat数据解析成SPI数据

for(uint8_t iLED = 0; iLED < WS2812B_AMOUNT; iLED++)

{

WS2812b_Set(iLED, gWs2812bDat[iLED].R, gWs2812bDat[iLED].G, gWs2812bDat[iLED].B);

}

//总线输出数据

HAL_SPI_Transmit(&hspi1, gWs2812bDat_SPI, sizeof(gWs2812bDat_SPI), 100);

//使总线输出低电平

HAL_SPI_Transmit(&hspi1, &dat, 1, 100);

//帧信号:一个大于50us的低电平

HAL_Delay(1);

}

直接在main()里面调用WS2812B_Task()就可以驱动灯条,另外直接修改数组gWs2812bDat就可改变灯条的颜色。


关键字:STM32F103C8T6  SPI接口  驱动 引用地址:STM32F103C8T6使用SPI接口驱动WS2812b灯条

上一篇:STM32CubeMX+w25qxx
下一篇:STM32+LWIP+FTP客户端下载文件

推荐阅读最新更新时间:2026-03-23 10:48

STM32F103C8T6使用SPI接口驱动WS2812b
之前一篇 文章 写了使用IO控制WS2812b操作原理,但是由于IO的输出比较慢,所以现在改用了硬件SPI控制WS2812b灯条 把SPI的mosi线接到ws2812b的数据线,SPI的速率可达十几Mbit/s,如此高的传输速率,我们可以使用一个(uint8_t)类型的数据代表一个码1或者码0; 也就是说,本来控制一个灯珠的数据由3个Byte(24位)变成了24Byte,每个bit转换成一个Byte; 具体看时钟如何配置的。 SPI配置: 在上一篇文章可以看到控制一个码的周期在1.25us±300ns之间,现在把时钟配成9Mbit/s,这个的话每个码的周期大概就在889ns,和LED的周期略有误差; 从规格书上可以看到码1和码0
[单片机]
<font color='red'>STM32F103C8T6</font>使用<font color='red'>SPI接口</font><font color='red'>驱动</font><font color='red'>WS2812b</font><font color='red'>灯</font><font color='red'>条</font>
STM32F103C8T6驱动WS2812b
几天小朋友到别人家玩,看上了人家的金鱼,人家就给了她一条小金鱼,有了小金鱼,怕它没氧气挂掉,买了一个氧气泵,没有东西喂它也不行,又买了一包鱼料,又因为它太孤单了,又买了几条小金鱼给它做伴,几条小金鱼老是在水桶里不怎么好看,又去买了个鱼缸,有了鱼缸太单调了,也不太好看,想了想加点灯光,后来找出吃灰多年的老灯条——WS2812b。 这个灯条以前使用新唐的N76E0003单片机驱动过,这款单片机是51内核的,之前驱动也没什么问题,今天使用stm32f103c8tc6来驱动,有了新的发现,首先来说一下ws2812b的驱动原理,直接上图好了。 驱动它很简单,驱动一个灯的话,给它发24位数据就行了。 新发现是:stm32f103是72M
[单片机]
<font color='red'>STM32F103C8T6</font><font color='red'>驱动</font><font color='red'>WS2812b</font><font color='red'>灯</font><font color='red'>条</font>
带有SPI接口的车用高压侧栅极驱动器为电池系统保驾护航
带有SPI接口的车用双通道高压侧栅极驱动器EiceDRIVER™ 2ED4820-EM为可靠的48V电池系统保驾护航 【2022 年 2 月 7日,德国慕尼黑讯】 48V电池系统可用于轻度混合动力电动汽车、卡车、电动多轮车和太阳能电池板电池组等多类不断增长的市场。 这些锂离子电池系统需要获得正负电压防护。此外,如果出现过流,此类电池必须能够在数微秒内,快速可靠地与负载断开。由于电池组可能并非专用于一辆车,因此,状态诊断和过流保护阈值配置非常重要。 为满足这些需求,英飞凌科技股份公司推出了EiceDRIVER™ 2ED4820-EM,这是一款带SPI接口的智能栅极驱动器。这款栅极驱动器可与英飞凌80/100V Opti
[电源管理]
带有<font color='red'>SPI接口</font>的车用高压侧栅极<font color='red'>驱动</font>器为电池系统保驾护航
基于STM32F103C8T6和L298N电机驱动模块调速实验NO.1
你们好啊,小伙伴们! 最近我有个困扰,想用STM32和L298N从新温习一下寻线小车车实验。 但是没想到12V电源带动小黄电机跑的实在是太快太快了(带吓唬~),快到寻线灯等都反应不过来就冲了赛道......我们得想办法把电机速度调下来才行! 功夫不负有心人。经过我半天的调试终于把他驯服了!(掌声!~) 方法:PWM控制+物理控制 这里肯定会有人问了:“阿婆~阿婆~你用的L298N不是用IN1、IN2(IN3、IN4相同)数字电平逻辑控制的吗?怎么输出PWM控制电机转速呢?” 实物图 引脚图 电机转动控制逻辑 注意事项: 接线 Tips:其实左右电机不用太认真的去接,因为可以写程序的时候反过来就行了,重接线多累啊。 谁
[单片机]
第10章-小车跑一跑-好家伙VCC STM32项目 电机驱动电路 STM32f103c8t6最小系统板
功能介绍放开头, 使用便捷无需愁 这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发。 V3.3.0-STM32智能小车 视频: https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。
[单片机]
第10章-小车跑一跑-好家伙VCC STM32项目 电机<font color='red'>驱动</font>电路 <font color='red'>STM32f103c8t6</font>最小系统板
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口,它允许CPU与TTL移位寄存器、A/D或D/A转换器、实时时钟(RTO)、存储器以及LCD和LED显示驱动器等外围接口器件以串行方式进行通讯。 SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单。串行A/D转换器具有电路简单、工作可靠的特点,而ARM芯片被设计用于手持设备以及普通的嵌人式应用的集成系统,将上述两种实用的芯片和SPI总线技术相结合以实现数据采集十分有效。 1 AD7888的功能与使用 AD7888是美国模拟器件公司推出的一款
[应用]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口,它允许CPU与TTL移位寄存器、A/D或D/A转换器、实时时钟(RTO)、存储器以及LCD和LED显示驱动器等外围接口器件以串行方式进行通讯。 SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单。串行A/D转换器具有电路简单、工作可靠的特点,而ARM芯片被设计用于手持设备以及普通的嵌人式应用的集成系统,将上述两种实用的芯片和SPI总线技术相结合以实现数据采集十分有效。 1 AD7888的功能与使用 AD7888是美国模拟器件公司推出的一款
[嵌入式]
串行显示驱动器PS7219及单片机的SPI接口设计
0 引 言 在单片机的应用系统中,为了便于人们观察和监视单片机的运行情况,常常需要用显示器显示运行的中间结果及状态等等。因此显示器往往是单片机系统必不可少的外部设备之一。常用的显示器有很多种,其中LED(发光二极管显示器)是应用较多的一种,它特别适用于强光和光线极弱的场合。   要使LED显示,必须提供段选码和位选码。传统的硬件译码显示接口广泛采用由中央处理器CPU(如:Intel 8031)扩展I/O口(如:8255),然后再使用逻辑门驱动芯片(如7407等)驱动相应的位码和段码。这种设计,芯片间连线十分复杂,系统工作可靠性不高,已越来越不适应单片机系统集成化、小型化的发展要求。特别是系统并行扩展I/O,其缺点十分明显:
[应用]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved