ws2812

需要开发的外设:ws2812

开发环境:MDK

开发板:stm32最小系统板

杜邦线无数

一、原理阐述

(一)这个ws2812有很多种,一个小灯、灯带,矩形像素屏等等。

这些都是DIN连接输入,DOUT连接输出,另外两个引脚是GNE和VCC

(二)数据传输原理:

第1个WS2812B灯珠接收到了第1个24bit的数据,做出响应(发光);

第N个WS2812B灯珠接收到了第N个24bit的数据,
再收到第二个24bit的数据后,直接转发给第二个WS2812B灯珠,由第二个WS2812B灯珠做出响应;依次类推。

每次给一个灯一个24位的数据,顺序是GRB-green red bule

(三)数据编码

编码时序是低高电平占位大小来区分的,分别是高比低比例位    1/2-->0 code

2/1-->1 code

 (四)定时器配置

根据WS2812的最大传输速率800kbps,设置定时器不分频和计数周期为89+1,这样下来波形的频率为  72M /(89+1) = 800K  ,并且一个波形的周期为  1 / 800 = 1.25us

我用的最大是72M,不同板子不同配置,自行选择。

二、代码展示

main.h

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "ws2812b.h"
uint8_t rgb0[][3] = {0,0,0};
uint8_t rgb1[212][3] = {{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},{100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},{200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{10,10,0},{20,20,0},{30,30,0},{40,40,0},{50,50,0},{60,60,0},{70,70,0},{80,80,0},{90,90,0},{100,100,0},{110,110,0},{120,120,0},{130,130,0},{140,140,0},{150,150,0},{160,160,0},{170,170,0},{180,180,0},{190,190,0},{200,200,0},{210,210,0},{220,220,0},{230,230,0},{240,240,0},{250,250,0},{10,0,10},{20,0,20},{30,0,30},{40,0,40},{50,0,50},{60,0,60},{70,0,70},{80,0,80},{90,0,90},{100,0,100},{110,0,110},{120,0,120},{130,0,130},{140,0,140},{150,0,150},{160,0,160},{170,0,170},{180,0,180},{190,0,190},{200,0,200},{210,0,210},{220,0,220},{230,0,230},{240,0,240},{250,0,250},{0,10,10},{0,20,20},{0,30,30},{0,40,40},{0,50,50},{0,60,60},{0,70,70},{0,80,80},{0,90,90},{0,100,100},{0,110,110},{0,120,120},{0,130,130},{0,140,140},{0,150,150},{0,160,160},{0,170,170},{0,180,180},{0,190,190},{0,200,200},{0,210,210},{0,220,220},{0,230,230},{0,240,240},{0,250,250},{10,10,10},{30,30,30},{90,90,90},{140,140,140},{200,200,200},{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},{100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},{200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{10,10,0},{20,20,0},{30,30,0},{40,40,0},{50,50,0},{60,60,0},{70,70,0},{80,80,0},{90,90,0},{100,100,0},{110,110,0},{120,120,0},{130,130,0},{140,140,0},{150,150,0},{160,160,0},{170,170,0},{180,180,0},{190,190,0},{200,200,0},{210,210,0},{220,220,0},{230,230,0},{240,240,0},{250,250,0},{10,0,10},{20,0,20},{30,0,30},{40,0,40},{50,0,50},{60,0,60},{70,0,70},{80,0,80},{90,0,90},{100,0,100},{110,0,110},{120,0,120},{130,0,130},{140,0,140},{150,0,150},{160,0,160},{170,0,170},{180,0,180},{190,0,190},{200,0,200},{210,0,210},{220,0,220},{230,0,230},{240,0,240},{250,0,250},{0,10,10},{0,20,20},{0,30,30},{0,40,40},{0,50,50},{0,60,60},{0,70,70},{0,80,80},{0,90,90},{0,100,100},{0,110,110},{0,120,120},{0,130,130},{0,140,140},{0,150,150},{0,160,160},{0,170,170},{0,180,180},{0,190,190},{0,200,200},{0,210,210},{0,220,220},{0,230,230},{0,240,240},{0,250,250},{10,10,10},{30,30,30},{90,90,90},{140,140,140},{200,200,200}};
uint8_t rgb2[109][3] = {{0,0,0},{0,5,0},{0,10,0},{0,15,0},{0,20,0},{0,25,0},{0,30,0},{0,35,0},{0,40,0},{0,45,0},{0,50,0},{0,55,0},{0,60,0},{0,65,0},{0,70,0},{0,75,0},{0,80,0},{0,85,0},{0,90,0},{0,95,0},{0,100,0},{0,105,0},{0,110,0},{0,115,0},{0,120,0},{0,125,0},{0,130,0},{0,135,0},{0,140,0},{0,145,0},{0,150,0},{0,155,0},{0,160,0},{0,165,0},{0,170,0},{0,175,0},{0,180,0},{0,185,0},{0,190,0},{0,195,0},{0,200,0},{0,205,0},{0,210,0},{0,215,0},{0,220,0},{0,225,0},{0,230,0},{0,235,0},{0,240,0},{0,245,0},{0,250,0},{0,255,0},{0,250,0},{0,245,0},{0,240,0},{0,235,0},{0,230,0},{0,225,0},{0,220,0},{0,215,0},{0,210,0},{0,205,0},{0,200,0},{0,195,0},{0,190,0},{0,185,0},{0,180,0},{0,175,0},{0,170,0},{0,165,0},{0,160,0},{0,155,0},{0,150,0},{0,145,0},{0,140,0},{0,135,0},{0,130,0},{0,125,0},{0,120,0},{0,115,0},{0,110,0},{0,105,0},{0,100,0},{0,95,0},{0,90,0},{0,85,0},{0,80,0},{0,75,0},{0,70,0},{0,65,0},{0,60,0},{0,55,0},{0,50,0},{0,45,0},{0,40,0},{0,35,0},{0,30,0},{0,25,0},{0,20,0},{0,15,0},{0,10,0},{0,5,0},{0,0,0}};
uint8_t rgb3[53][3] = {{0,0,0},{0,0,10},{0,0,20},{0,0,30},{0,0,40},{0,0,50},{0,0,60},{0,0,70},{0,0,80},{0,0,90},{0,0,100},{0,0,110},{0,0,120},{0,0,130},{0,0,140},{0,0,150},{0,0,160},{0,0,170},{0,0,180},{0,0,190},{0,0,200},{0,0,210},{0,0,220},{0,0,230},{0,0,240},{0,0,250},{0,0,255},{0,0,250},{0,0,240},{0,0,230},{0,0,220},{0,0,210},{0,0,200},{0,0,190},{0,0,180},{0,0,170},{0,0,160},{0,0,150},{0,0,140},{0,0,130},{0,0,120},{0,0,110},{0,0,100},{0,0,90},{0,0,80},{0,0,70},{0,0,60},{0,0,50},{0,0,40},{0,0,30},{0,0,20},{0,0,10},{0,0,0}};
uint8_t rgb5[200][3] = {{0,0,0},{100,0,0},{100,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,100,0},{0,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,100},{0,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{10,100,0},{10,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{10,0,100},{10,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,100},{0,10,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,10},{100,0,10},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,100},{0,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,100,0},{0,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,0},{100,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,100},{0,100,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,100},{100,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{90,0,100},{0,100,0}};uint8_t rgb4[53][3] = {{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},{100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},{200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{255,0,0},{250,0,0},{240,0,0},{230,0,0},{220,0,0},{210,0,0},{200,0,0},{190,0,0},{180,0,0},{170,0,0},{160,0,0},{150,0,0},{140,0,0},{130,0,0},{120,0,0},{110,0,0},{100,0,0},{90,0,0},{80,0,0},{70,0,0},{60,0,0},{50,0,0},{40,0,0},{30,0,0},{20,0,0},{10,0,0},{0,0,0}};//每个三位数,每一个位位一个不同颜色,数字大小表明亮度大小,最大256,通过将这个三个灯亮不同种类、大小程度进行调制不同量的颜色
u16 i,j;int main(void){ delay_init();         LED_Init();           Timer2_init();while(1){for(i=0;i<110;i++){WS2812_send(&rgb2[i],50,0);delay_ms(50);}for(i=0;i<77;i++){WS2812_send(&rgb5[i],50,0);delay_ms(50);}    for(i=0;i<212;i++){WS2812_send(&rgb1[i],50,1);delay_ms(50);} }}

每个三位数,每一个位位一个不同颜色,数字大小表明亮度大小,最大256,通过将这个三个灯亮不同种类、大小程度进行调制不同量的颜色

ws2812.c

#include "WS2812B.h"#define TIM2_CCR1_Address 0x40000034#define TIMING_ONE  50
#define TIMING_ZERO 25uint16_t LED_BYTE_Buffer[300];
void WS2812_send(uint8_t (*color)[3], uint16_t len,u8 flag)
{static unsigned char iie = 0;uint8_t i;uint16_t memaddr;uint16_t buffersize;buffersize = (len*24);memaddr = 0;             while (len){    for(i=0; i<8; i++) // G{LED_BYTE_Buffer[memaddr] = ((color[iie][1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;memaddr++;}for(i=0; i<8; i++) // r{LED_BYTE_Buffer[memaddr] = ((color[iie][0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;memaddr++;}for(i=0; i<8; i++) // B{LED_BYTE_Buffer[memaddr] = ((color[iie][2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;memaddr++;}if(flag==1){if(iie>=12)iie = 0;iie++;}len--;}

ws2812.h

#ifndef __WS2812B_H
#define __WS2812B_H#include "stm32f10x.h"
#include "delay.h"  void Timer2_init(void);
void WS2812_send(uint8_t (*color)[3], uint16_t len,u8 flag);#endif

BUG:

如果使用象素萍的话我们只能成功使用50个,然后使用单一装置和小灯带可以成功,这个目前没有解决。

完整工程代码:

(35条消息) 外设ws2812使用32驱动-单片机文档类资源-CSDN文库https://download.csdn.net/download/weixin_52451652/86399407?spm=1001.2014.3001.5503

(STM32笔记5)ws2812驱动开发相关推荐

  1. 【嵌入式Linux学习笔记】Linux驱动开发

    Linux系统构建完成后,就可以基于该环境方便地进行开发了,相关的开发流程与MCU类似,但是引入了设备树的概念,编写应用代码要相对复杂一点.但是省去了很多配置工作. 学习视频地址:[正点原子]STM3 ...

  2. rmmod无法卸载驱动_笔记:linux驱动开发(1、了解内核模块)

    文章目录 一个最简单的驱动模块 驱动编译的Makefile 相关命令 错误解决: 点击下方阅读原文可访问文中超链接 一个最简单的驱动模块 一个精简的驱动模块可以只有不到10行的内容,如下是一个简单的测 ...

  3. 《物联网 - 机智云开发笔记》第2章 设备驱动开发

    开发板:GoKit3开发板(STM32F103) 在上一章节,笔者带领大家已经将机智云平台玩起来,本节内容讲带领大家经进一步开发. 在开始讲解之前,有必要先了解的机智云的平台架构. 从上面的架构图可以 ...

  4. Linux 中的驱动开发的初学者体会

    Linux 中的驱动开发的初学者体会 很多年前,心里就存下这样一个愿望.就是把Linux 的驱动开发搞清楚. 但是一开始上上这样的开发难度天大了,对着一堆的寄存器发愁. 于是就从简单的STM8,PIC ...

  5. Linux学习笔记 驱动开发篇

    ARM Linux 驱动开发篇 本篇我们将会详细讲解 Linux 中的三大类驱动:字符设备驱动.块设备驱动和网络设备驱动. 字符设备最多,从最简单的点灯到 I2C.SPI.音频等都属于字符设备驱动的类 ...

  6. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  7. stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...

  8. 9、Windows驱动开发技术详解笔记(5) 基本语法回顾

    5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...

  9. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

最新文章

  1. 【NLP】PET——文本分类的又一种妙解
  2. 广告banner:手动滑动切换,自动切换,点击跳转,异步加载网络图片
  3. phpexcel导出大量数据合并单元格_php 数据导出到excel 2种带有合并单元格的导出...
  4. 【ArcGIS风暴】什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘
  5. 028-Dell服务器做Raid
  6. pythonlinux版本_Linux_Python版本控制
  7. 永远不要因为这个工作不好而辞职、、、、
  8. MD5算法的C++实现
  9. Springboot集成Quartz和RabbitMQ时设置为不自动运行
  10. redis mysql 视图_Redis 可以用来做数据库吗?
  11. 视频加密并上传至oss实现高并发访问
  12. 儿童摄影HTML实现
  13. Android 入门宝典 - inflate 生成视图 动态加载视图
  14. 停车场车牌识别摄像机,传统提成行业颠覆者
  15. MATLAB 将txt文本转化为tif图片格式
  16. PB 数据窗口数据导入Excel, 如果存在则追加,不存在则创建。
  17. OpenCV基础应用20例
  18. java cas logout无效_解释CAS Logout问题(转)
  19. oracle中那个日期怎么相减_oracle日期时间加减规则
  20. 基于vue-cli搭建的脚手架中的一些相关配置(转载)

热门文章

  1. 计算机基础-工控机、上位机、下位机、stm32、单片机
  2. 树莓派3b+,4b新手入门到手开箱第一次使用之十大步骤
  3. 计算机怎么改磁盘位置,如何修改磁盘0和磁盘1的硬盘位置
  4. 网页爬虫实战:全国电动汽车充电站数据
  5. C# Excel导出超出65536行报错
  6. 电脑怎么了--电脑通电电源风扇不转动
  7. 使用STM32CubeMX 快速生成 USB HID 工程 - STM32F107VCT6
  8. c语言的职业兴趣测试,职业生涯规划计算机
  9. mysql的存储过程,循环执行插入语句
  10. 苹果手机怎么在照片上添加文字_要给照片快速添加文字、图框、印章,用这款手机软件比较方便...