【STM32CubeMX】WS2812彩灯

news/2025/2/13 20:39:29/

前言

  有时间我就按照网上的时序推理了WS2812的传输时序。之前就推过时序了,但是当时时序好像没对,因为没用逻辑分析仪查看,就以为通过电片机的运行主频,在控制NOP,就能得到us级的延时控制,但是真实的情况是,调用调用函数,运行循环之类的对于us级来说也需要大量时间了,所以所推时序时,一定要用逻辑分析仪或示波器查看,时序电平的实际反转时间。

  本文要点:1.WS2812的时序基础。2.基于STM32HAL库函数,的引脚电平反转,与WS2812数据传输的代码实现。优点:代码可能简单易懂。缺点:单纯的引脚反转,时序达不到WS2812所指定的要求,但是在控制一盏灯时,只要放在主循环中确能跑出,指定颜色的代码。所以说发出来给大家参考参考。有时间在用DMA写一个看看。

环境

  • STM32F103C6T6系统板,72MHz主频
  • 基于STM32CubeMX生成的HAL库代码
  • keil5中,进行代码的编写修改

WS2812

  • 时序基础

    在这里插入图片描述

  • 数据结构

    在这里插入图片描述

代码实现

以下给出三个关键块的代码 WS2812S.H WS2812S.C main.c

下面中main.c中省略了,WS2812S数据引脚的初始化定义,还有WS2812S.H引脚的宏定义。大家可以自行调整配置。

  • WS2812S.H

    #include "main.h"
    #include <WS2812S.H>//超低时间总得要些东西来堵塞
    void WS2812S_Delay_300ns()
    {__NOP;__NOP;__NOP;__NOP;__NOP;
    }void WS2812S_Delay_800ns()
    {for(char i=1;i>0;i--){__NOP;__NOP;__NOP;__NOP;__NOP;}	
    }//0.1纳秒延时(没用了可忽视)
    void WS2812S_Delay_us(int Num)
    {for(;Num>0;Num--){for(char js=7;js>0;js--){__NOP();}}
    }
    //WS2812S高电平
    void WS2812S_H()
    {HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);WS2812S_Delay_800ns();HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);WS2812S_Delay_300ns();
    }
    //WS2812S低电平
    void WS2812S_L()
    {HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);WS2812S_Delay_300ns();	HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);WS2812S_Delay_800ns();
    }
    //WS2812S时序复位
    void WS2812S_R()
    {//HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);WS2812S_Delay_us(50);
    }//WS2812S写入字节
    void WS2812S_WR(uint8_t dat)
    {uint8_t i;for(i=0;i<8;i++){if(dat & (1 << (7-i))){WS2812S_H();}else{WS2812S_L();}}
    }
    //WS2812S点亮LED
    void WS2812S_WRLED(uint8_t green,uint8_t red,uint8_t blue)
    {HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);WS2812S_WR(green);WS2812S_WR(red);WS2812S_WR(blue);HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);WS2812S_R();
    }
    //十次的传输
    void WS2812S_WRLED10(uint8_t green,uint8_t red,uint8_t blue)
    {char i;for(i=0;i<10;i++){WS2812S_WRLED(green,red,blue);}
    }
    
  • WS2812S.C

    #ifndef __WS2812S_H__
    #define __WS2812S_H__void WS2812S_H(void);
    void WS2812S_L(void);
    void WS2812S_R(void);
    void WS2812S_WR(uint8_t dat);
    void WS2812S_Delay_us(int Num);
    void WS2812S_WRLED(uint8_t green,uint8_t red,uint8_t blue);
    void WS2812S_WRLED10(uint8_t green,uint8_t red,uint8_t blue);
    #endif
    
  • main.c

    //主函数中导人库后,调用配置即可
    WS2812S_WRLED10(0,0,255);	//WS2812S灯珠
    

时序问题

  1. main.c调用WS2812S.H函数中WS2812S的’0’码和’1’码的函数,就已经完全超过时序要求的了。组成高电平的部分没超,低电平的超了。因为调用的过程中不可避免的有循环,函数之类的调用,增加了时间。

    在这里插入图片描述

    //WS2812S高电平
    void WS2812S_H()
    {HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);//WS2812S_Delay_800ns();HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);//WS2812S_Delay_300ns();
    }
    //WS2812S低电平
    void WS2812S_L()
    {HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);//WS2812S_Delay_300ns();	HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);//WS2812S_Delay_800ns();
    }
    
  2. 但是我在主函数中,单纯的调用引脚电平反转,就貌似能组成可以用的时序电平时间。从一定程度上就能验证我上面的说法,调用的过程中不可避免的有循环,函数之类的调用,增加了时间。当然一般的模块都是要封装成模块,还有用循环来发送数据位的,所以说在主函数中直接调用肯定是行不通的。

    在这里插入图片描述

    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(WS2812S_GPIO_Port, WS2812S_Pin, GPIO_PIN_RESET);
    

http://www.ppmy.cn/news/229056.html

相关文章

牛客网语法刷题篇(C语言) — 输出格式化

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言—语法篇》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…

【微服务项目】Spring Cloud Alibaba 实战

Spring Cloud Alibaba 实战 一、目标 理解什么是微服务架构理解什么是springcloud及spring cloud alibaba和springcloud的关系掌握使用springcloud alibaba 实现微服务远程调用掌握使用springcloud alibaba 实现服务注册与发现掌握使用springcloud alibaba 实现基本的服务配置…

AAOS 音频动态路由

文章目录 基本概念车载音频配置文件外部的配置音频区的方式车载音频服务配置路由流程框架中获取可用输出设备配置例子测试方法相关问题 基本概念 Android 管理来自 Android 应用的声音&#xff0c;同时控制这些应用&#xff0c;并根据其声音类型将声音路由到 HAL 中的输出设备…

Domino邮件系统技术方案

一、 目的 构建企业内、外统一的电子邮件系统&#xff0c;邮件系统与办公系统集成&#xff0c;共享同一通讯录与组织架构。 二、 采用技术架构 1、 邮件服务器&#xff1a; 采用市场公认首选的IBM Domino作为邮件系统&#xff0c;是全球500强60%的企业选择使用的邮件系统平台…

罗伯特·蒙代尔教授

1956年 获美国麻省理工学院&#xff08;MIT&#xff09;经济学博士 1961年 任职于国际货币基金组织 1966~1971年 在斯坦福大学和约翰霍普金斯大学任教 1970年 任欧洲经济委员会货币委员会顾问 1971~1987年 任SantaColomba国际货币改革会议主席 1972~1973年 统…

巴贝奇计算机科学思想,计算机之父巴贝奇_图灵_计算机科学之父

麻省理工学院媒体实验室名誉教授&#xff0c;数学家&#xff0c;计算机科学家&#xff0c;人工智能领域先驱马文-明斯基(Marvin Minsky)&#xff0c;于1月24日因脑溢血在波士顿布莱根妇女医院去世&#xff0c;享年88岁。 明斯基出生于1927年&#xff0c;是一个土生土长的纽约人…

查尔斯·巴贝奇——计算机先驱者之父

巴贝奇最主要的思想贡献就是把自己所擅长的科学领域中所使用的概念引入到企业管理中来。也许是因为巴贝奇在科学领域中发明差分机以及分析机的原因&#xff0c;崇尚科学合理分工以及高效工作的理念使得巴贝奇认为在企业管理中也需要提倡更加精细的分配以及分工&#xff0c;从而…

赫伯特•亚历山大•西蒙(1916年6月15日--2001年2月9日 Herbert Alexander Simon )

美国科学家&#xff0c;他是20世纪科学界的一位奇特的通才&#xff0c;在众多的领域深刻地影响着我们这个世代。他学识渊博、兴趣广泛&#xff0c;研究工作涉及经济学、政治学、管理学、社会学、心理学、运筹学、计算机科学、认知科学、人工智能等广大领域,并做出了创造性贡献&…