STM32C0开发(1)----SPI 驱动WS2812灯珠

这篇具有很好参考价值的文章主要介绍了STM32C0开发(1)----SPI 驱动WS2812灯珠。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

本文介绍了如何使用STM32微控制器,结合STM32CubeMX配置工具和SPI通讯接口,来驱动和控制WS2812 LED灯带。这是一个集硬件连接、软件配置和编程开发于一体的综合性项目,目标是实现对LED灯带颜色和亮度的精确控制。

最近在弄ST的课程,需要样片的可以加群申请:615061293 。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

视频教学

https://www.bilibili.com/video/BV1X94y157W8/

STM32C0开发(1)----SPI 驱动WS2812灯珠

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

源码下载

https://download.csdn.net/download/qq_24312945/88489586

芯片级联方法

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

芯片在上电复位以后,接收DIN端打来的数据,接收够24bit后,DO端口开始转发数据,供下一个芯片提供输入数据。在转发之前,DO口一直拉低。此时灯珠将不接收新的数据,内置RGB芯片根据接收到的24bit数据后产生的不同占空比信号,展现不同亮度。如果DIN端输入信号为RESET信号,芯片将接收到的数据送显示,芯片将在该信号结束后重新接收新的数据,在接收完开始的24bit数据后,通过DO口转发数据,灯珠在没有接收到RESET码前,RGB亮度保持不变,当接收到80us以上低电平RESET码后,灯珠内部RGB芯片将根据刚才接收到的24bit数据后产生的不同占空比信号,展现不同亮度。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

数据传输

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi
24bit数据结构:

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

时序

时序波形图如下所示。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi
spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

SPI配置

将SPI的配置速度设为6M,数据宽度设为8位。
CPHA配置为第二边沿采样;在第一个跳变沿时,MOSI在空闲状态保持高电平,而在第二个跳变沿,它会保持上一次传输的最终电平。由于发送数据的最后一位总是低电平,这样配置可以避免WS2812误判。CPOL设置为高,确保SCK在空闲时保持高电平状态。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

系统采用单总线协议,通过总线上高低电平的时长来区分逻辑0和1。WS2811工作在800kHz频率下,将SPI设置为6.4MHz—即其工作频率的8倍—可以确保每个字节(8位)正好对应一个逻辑位。在这种设置下,‘11111000’(0xF8)代表逻辑1,‘11000000’(0xC0)代表逻辑0。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

逻辑0下发送的数据为11000000’(0xC0)。
逻辑0下高电平位320ns。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

逻辑0下低电平位1.01us。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

逻辑1下发送的数据为‘11111000’(0xF8)。
逻辑1下高电平位830ns。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi
逻辑1下低电平位500ns。
spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

这种精确的时序配置和电平控制对于确保WS2812灯带的正确驱动至关重要,可以通过上述配置来优化SPI接口的性能,确保与WS2812的高效通信。

CPHA配置

CPHA配置为第二边沿采样下数据传输结束如下所示。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi
CPHA配置为第二边沿采样下数据传输结束如下所示。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

由于RESET Code为低电平,且要大于80us,所以数据传输完毕必须为低电平。

spi ws2812驱动程序详解,stm32cube,单片机,STM32CUBEMX,stm32c0,ws2812,rgb555,spi

代码

在main.c中添加头文件。

/* USER CODE BEGIN Includes */
#include "ws2812.h"
#include <string.h>
/* USER CODE END Includes */

在main.c中添加函数申明和移位操作。

/* USER CODE BEGIN 0 */
extern tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT];

void move_Front()
{
	uint8_t i;
	uint8_t temp[3];
	temp[0] = gWs2812bDat[0].R;
	temp[1] = gWs2812bDat[0].G;
	temp[2] = gWs2812bDat[0].B;	
	for (i = 0; i < WS2812B_AMOUNT-1; i++)
	{
		gWs2812bDat[i].R = gWs2812bDat[i+1].R;
		gWs2812bDat[i].G = gWs2812bDat[i+1].G;
		gWs2812bDat[i].B = gWs2812bDat[i+1].B;
	}
		gWs2812bDat[7].R = temp[0];
		gWs2812bDat[7].G = temp[1];
		gWs2812bDat[7].B = temp[2];
}


/* USER CODE END 0 */

添加初始化显示。

  /* USER CODE BEGIN 2 */
	WS2812B_Task();
	HAL_Delay(1000);
  /* USER CODE END 2 */

添加流水灯。文章来源地址https://www.toymoban.com/news/detail-761182.html

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	WS2812B_Task();	
	move_Front();
	HAL_Delay(100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

ws2812.c

#include "ws2812.h"
#include "spi.h"

//灯条显存SPI数据缓存
uint8_t gWs2812bDat_SPI[WS2812B_AMOUNT * 24] = {0};	
//灯条显存
tWs2812bCache_TypeDef gWs2812bDat[WS2812B_AMOUNT] = {

//R    G      B
0XFF, 0X00, 0X00,	//0
0X00, 0XFF, 0X00,	//1
0X00, 0X00, 0XFF,	//2
0X00, 0XFF, 0XFF,	//3
0XFF, 0X00, 0XFF,	//4
0XFF, 0XFF, 0X00,	//5
0XFF, 0XFF, 0XFF,	//6
0X00, 0X00, 0X00,	//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),0XFFFF);
	//使总线输出低电平
	HAL_SPI_Transmit(&hspi1, &dat, 1,0XFFFF);
	//帧信号:一个大于50us的低电平
	HAL_Delay(1);	
}

ws2812.h

#ifndef __WS2812_H__
#define __WS2812_H__

#include <stdint.h>

//            编码 0 : 11000000
#define CODE_0		0xC0
//            编码 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

到了这里,关于STM32C0开发(1)----SPI 驱动WS2812灯珠的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LL库实现SPI MDA发送方式驱动WS2812

    1,首先打卡STM32CubeMX,配置一下工程,这里使用的芯片是STM32F030F4P6。   时钟 SPI外设  SPI DMA 下载接口,这个不配置待会下程序后第二次就不好下载调试了。  工程配置,没啥说的  选择生成所有文件  将驱动都改为LL库 然后直接点击 General Code 2,初始化dma:  这里卡了一会

    2024年02月12日
    浏览(19)
  • (STM32笔记5)ws2812驱动开发

    ws2812 需要开发的外设:ws2812 开发环境:MDK 开发板:stm32最小系统板 杜邦线无数 一、原理阐述 (一) 这个ws2812有很多种,一个小灯、灯带,矩形像素屏等等。 这些都是DIN连接输入,DOUT连接输出,另外两个引脚是GNE和VCC   (二) 数据传输原理: 第1个WS2812B灯珠接收到了第1个

    2024年01月19日
    浏览(20)
  • 【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片

    最近在埋头搞STM32 + 无刷直流电机控制,想实现用自己的STM32F407VGT6芯片板子,外加一块驱动板(目前选用到TI的DRV8302或者DRV8323驱动芯片),搞定电机驱动,最后实现比较好的控制效果。如果不是同一块芯片的同学也不用急着走,大体上都是可借鉴哒~ 本文主要实现使用SPI通信

    2024年02月08日
    浏览(27)
  • STM32驱动全彩LED灯模块WS2812

    WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示。 WS2811(未集成LED)的级联电路如下所示: WS2812(集成LED)的级联电路如下所示: STM32是3.3V供电芯片,输出Push-Pull模式只有3.3V,WS2812采用5V供电,输入Vi

    2024年01月17日
    浏览(16)
  • STM32+PWM+DMA驱动WS2812彩灯模块(附源码)

    WS2812是一颗数字LED灯珠,采用单总线通讯,每颗灯珠支持24bit的颜色控制,也即RGB888,信号线通过DIN输入,经过一颗灯珠之后,信号线上前24bit数据会被该灯珠锁存,之后将剩下的数据信号整形之后通过DOUT输出 C1为VDD的滤波电容,一般大小为100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年02月15日
    浏览(14)
  • STM32H5开发(6)----SPI驱动TFT-LCD屏

    在嵌入式领域,TFT-LCD屏是最常用的显示解决方案之一,因为它们提供了丰富的颜色和高分辨率的图像显示能力。STM32H5作为ST的高性能微控制器系列,具备了强大的处理能力和多种通信接口,非常适合于驱动TFT-LCD显示屏,该液晶屏st7796或者ILI9488驱动芯片,这两个屏幕都是兼容

    2024年02月05日
    浏览(20)
  • 电子模块|外控集成 LED 光源 WS2812模块---硬件介绍和stm32驱动

    WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色

    2024年02月10日
    浏览(20)
  • STM32+PWM+DMA驱动WS2812彩灯模块(评论点赞给源代码)

    WS2812是一颗数字LED灯珠,采用单总线通讯,每颗灯珠支持24bit的颜色控制,也即RGB888,信号线通过DIN输入,经过一颗灯珠之后,信号线上前24bit数据会被该灯珠锁存,之后将剩下的数据信号整形之后通过DOUT输出 C1为VDD的滤波电容,一般大小为100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年04月23日
    浏览(15)
  • STM32G0 定时器PWM DMA输出驱动WS2812配置 LL库

    优点:不消耗CPU资源 缺点:占用内存较大 定时器配置 定时器通道:TIM3 CH2 分频:0 重装值:79,芯片主频64Mhz,因此PWM输出频率:64Mhz/79 ≈ 800Khz,满足芯片要求。 auto-reload preload 要关闭 output compare preload 要打开 DMA配置 外设一定要选择TIM3_UP,不要选TIM_CHx 方向是内存到外设,

    2024年02月10日
    浏览(18)
  • STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)

    博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k的flash,4k的sram)来驱动,原文中写的是stm32f103c8t6,个人认为其实区别并不是很大,需要修改部分参数即可移植(cv战士申请出战)。 上图是我的一圈灯,一共8个,第一个LED的数

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包