WS2812驱动 STM32F103 SPI+DMA 无需降频 一个灯占用9Byte的RAM

对于WS2812不了解的朋友可以先看一下这些
​【STM32】WS2812介绍、使用SPI+DMA发送数据

WS2812的驱动我想到的主要有三种

  • 延时
  • SPI
  • UART
    三者区分:
  1. 延时,占用资源,需要用到ASM nop不然容易被优化,需要用示波器抓时间。
  2. UART 起始位低,结束位高,如果要强行实现也是可以但是实现起来过于复杂,不够优美。
  3. 没有片选的功能,会占用一整个硬件SPI,觉得较为优美。

在网上看了很多SPI例子都是使用 SPI的8bit数据来模拟WS2812的一个bit颜色的数据,但是由于STM32F103主频72M,要凑出来这个SPI的频率我看某些做法是进行降频,吾不喜,要么还有就是和协议时序差异挺大但是有些WS2812能运行,但是考虑到可能有些ws2812会不能兼容,吾不喜。

STM32F103 设主频72M,SPI分频数设置为32,则SPI的通信频率为2.25M,传输一位数据的时间约为444纳秒(ns)444ns 888ns 符合WS281X芯片的通信时序。

//  __
// |  |_|   0b110  high level
//  _
// | |__|   0b100  low level

这个方式和协议时序更加接近,占用RAM应该是笔者认为最小的了
一个灯24bit颜色,只需要24*3/8 = 9Byte的Buff。

写代码的时候需要注意一下大小端的问题,尽量保持大小端的兼容性

/*** @brief 设置某一个WS2812* * @param num * @param RGB */
void WS2812_OneSet( uint8_t num, uint32_t RGB )
{uint8_t i;uint32_t TempR = 0, TempG = 0, TempB = 0;//MSB Firstfor( i = 0; i < 8; ++i,RGB>>=1 ){(RGB & 0x00010000) != 0 ? (TempR |= (WS2812_HIG<<(i*3))) : (TempR |= (WS2812_LOW<<(i*3)));(RGB & 0x00000100) != 0 ? (TempG |= (WS2812_HIG<<(i*3))) : (TempG |= (WS2812_LOW<<(i*3)));(RGB & 0x00000001) != 0 ? (TempB |= (WS2812_HIG<<(i*3))) : (TempB |= (WS2812_LOW<<(i*3)));}for( i = 0; i < 3; ++i ){g_ws2812.Col[num].RGB.R[i] = TempR >> (16-8*i);g_ws2812.Col[num].RGB.G[i] = TempG >> (16-8*i);g_ws2812.Col[num].RGB.B[i] = TempB >> (16-8*i);}
}

这里有参考的代码,有积分的给点积分用吧,没积分的可以去Github下。
Github
CSDN下载

参考资料
stm32和ws2812B相对较好的方案。SPI和UART

WS2812驱动 SPI+DMA 无需降频 一个灯占用9Byte的RAM相关推荐

  1. linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!

    原标题:从点一个灯开始学写Linux字符设备驱动! [导读] 前一篇文章,介绍了如何将一个hello word模块编译进内核或者编译为动态加载内核模块,本篇来介绍一下如何利用Linux驱动模型来完成一 ...

  2. [HAL]STM32 SPI+DMA驱动WS2812

    该程序是纯手敲,非Cube生成!所有代码均注释. 源码在文章后面获取 WS2818 简介 Keyword: 单线通讯.归零码.Reset.RGB顺序 RGB一共有24bit位 ->相当于驱动一个 ...

  3. STM32 SPI+DMA驱动WS2812

    [举报再看养成习惯,噢 不对,点赞再看养成习惯.感谢支持] 开头不多叨叨,直接进入主题: WS2812的驱动原理: 首先明白高低电平的表示方法: 低电平(0 code): 0.35us的高电平+0.8 ...

  4. 【STM32】基于STM32CubeIDE SPI+DMA驱动WS2812

    [STM32]基于STM32CubeIDE SPI+DMA驱动WS2812 ✨申明:本文章仅发表在CSDN网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创!

  5. [SPI+DMA] 驱动WS2812B显示时钟

    [SPI+DMA] 驱动WS2812B显示时钟 实现原理 本人一个大学萌新,偶然间发现RGB时钟这神奇的玩意,就想试试.目前初步实现时钟显示,第一次写博客,只是为了记录自己的学习成果方便以后查看,大家 ...

  6. STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记

    关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + ...

  7. STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)

    STM32F103系列_OLED屏幕(SSD1306.SSD1315驱动)SPI驱动[DMA](高刷) 一.SSD1306和SSD1315 二.电路原理图(SPI接法) 三.STM32_SPI 四.S ...

  8. 基于STM32F411使用SPI+DMA驱动LCD

    先看效果 F411CE 硬件SPI+DMA驱动LCD 基于HAL库 其实HAL库我用不太习惯,一直也是用的标准库 但HAL库确实是好上手一些,就迅速创建一个新的template 这次就当尝试一下吧,因 ...

  9. 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD

    文章目录 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD 一.文章前言 二.SPI+DMA 配置 三.FreeRTOS 配置 四.代码编写 五.实验现象 小熊派 FreeRTOS+SP ...

最新文章

  1. linux i2c 设备 操作说明
  2. 【计算机IO系列零】应用软件部分
  3. 数据结构之链表创建一元多项式,求一元多项式之和
  4. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - C. 三羊献端
  5. React开发(185):ant design table控制居中和宽度
  6. C# 字符串逗号分隔存到List 数组(互相转换)
  7. ip冲突 scan windows_如何检测IP有冲突 - 卡饭网
  8. HTML5基本知识小测验
  9. 在队列同步器中,同步队列为什么是双向链表,而等待队列是单链表?
  10. 群晖NAS教程(十二)、利用Web Station安装Chevereto图床
  11. Ubuntu安装Spark
  12. 余世伟视频笔记----如何塑造管理者的性格魅力领袖根性之细心和胆识
  13. RocKey4加密狗复制软件及教程
  14. Hadoop实战第2版 - 电子书下载(高清版PDF格式+EPUB格式)
  15. 创建多媒体APP 之 音频播放:管理音频焦点
  16. Java 实现图片转换为ICO以及多种格式图片之间转换
  17. [OHIF-Viewers]医疗数字阅片-医学影像-REACT-React.createRef()-Refs and the DOM关于回调 refs 的说明...
  18. c语言printf使用方法,C/C++语言printf命令使用方法
  19. 《系统功能测试报告》
  20. vscode中jsx中没有html语法提示,不能自动补全的解决办法

热门文章

  1. 操作系统思维导图(处理机管理)
  2. webpack打包文件过大,如何解决
  3. C语言中数组名和指针的区别
  4. app测试中ios和Android的区别
  5. 《开局一条狗》用户隐私政策
  6. 用Photoshop脚本批量为照片增加拍摄时间水印
  7. 移动端超级实用工具Scrcpy操作分享 (上)
  8. vue中tab切换前端实现_使用vue实现tab操作
  9. RTX2060和gtx1080哪个好?
  10. iOS仿探探六宫格相册的实现,带添加和删除功能