【STM32CubeMX】WS2812彩灯

news2024/10/6 0:29:54

前言

  有时间我就按照网上的时序推理了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.coloradmin.cn/o/612878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EBU6304 Software Engineering 知识点总结_5 项目管理_上

Software architecture 功能需求和软件架构关系紧密&#xff0c;非功能需求是软件架构的选择结果&#xff08;好的架构运行效率高之类的&#xff09;。可以以表格或图的形式&#xff0c;比如UML图。 设计难以更改。敏捷开发的早期阶段就是设计系统架构。 好处&#xff1a; …

MMDet3D——数据增强Pipline‘GlobalRotScaleTrans‘和‘RandomFlip3D‘的Pytorch逆变换实现

在点云的3D感知算法中&#xff0c;常用RandomFlip3D和GlobalRotScaleTrans的数据增强方式&#xff0c;这两个可以有效地增强模型的鲁棒性&#xff0c;提升模型的性能。 transforms[dict(typeRandomFlip3D,sync_2dFalse,flip_ratio_bev_horizontal0.5,flip_ratio_bev_vertical0.…

Qt问题:Qt槽函数是否支持内联?

Qt的信号和槽机制是基于Qt的元对象系统的&#xff0c;这个系统提供了一种在运行时获取对象信息的能力&#xff0c;如类名、信号和槽的数量和类型等。这个系统通过Qt的元对象编译器&#xff08;moc&#xff09;在编译时生成额外的代码来实现。 当一个信号被发射时&#xff0c;Q…

独立站电商优选的客服工具

遇到难题&#xff0c;寻找在线客服肯定是解决问题的首选途径了。但大多数独立站跨境电商网站的客服响应速度很难达到及时响应&#xff0c;一般普遍响应的时间从十几分钟到几小时、几十小时不等&#xff0c;甚至还有客服处于‘失联’状态。 去年黑五大促&#xff0c;Louella在某…

SpringCloud Alibaba Nacos学习

SpringCloud Alibaba Nacos 文章目录 SpringCloud Alibaba Nacos1 Nacos 是什么&#xff1f;2 服务提供者 service-provider-nacos 配置3 服务消费者&#xff1a;server-consumer-nacos 配置 1 Nacos 是什么&#xff1f; 一句话: Nacos 就是注册中心[替代 Eureka]配置中心[替代…

如何进行代码数据算法测试

在此数据科学和机器学习教程中&#xff0c;获取有关如何从头到尾创建和运行分类模型的动手示例。本教程涵盖以下步骤&#xff1a; 数据探索数据预处理拆分数据以进行训练和测试准备分类模型使用管道组装所有步骤训练模型对模型运行预测评估和可视化模型性能 建立 本教程包括…

解决 MacOS BigSur JD-GUI 打开失败的问题

前言JD-GUI是一款轻量级的 Java 反编译工具&#xff0c;对于一些没有源码的 Jar 包&#xff0c;直接拖进去就可以反编译源码&#xff0c;十分的方便。 在 MacOS 还是 Mojave 的时候&#xff0c;JD-GUI(下载地址)使用一切正常。 (apkTool下载地址 https://bitbucket.org/iBotP…

c++学习——运算符重载

运算符重载 **运算符重载的概念****加号运算符重载****减号运算符重载****左移运算符重载****右移运算符重载****赋值运算符重载****关系运算符重载****前置加加和后置加加** 运算符重载的概念 1.运算符重载&#xff0c;就是对已有的运算符重新进行定义&#xff0c;赋予其另一…

Spring Boot 框架整体启动流程详解

基于Spring Boot 版本&#xff1a;3.1 Java: 17 Spring Boot 的入口即为xxApplication类的main方法&#xff1a; SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.…

Android 13 wifi adb设置固定端口解决

Android 13 wifi adb设置固定端口解决 本文只管解决介绍不做代码层面具体分析。 文章目录 Android 13 wifi adb设置固定端口解决一、前言二、设置wifi 固定端口号三、打开 "无线调试"1、手动打开设置里面的开发者选项 里面的“无线调试”2、通过命令设置打开 "…

想面试Java后端,至少这些你都要会吧

跨越Java后端面试的最重要关卡&#xff0c;就是对技术知识的准备。但难点在于&#xff0c;后端技术栈的内容繁杂&#xff0c;你需要掌握一个广泛的领域。那么&#xff0c;为了保证你能够顺利面试Java后端岗位&#xff0c;下面分享我认为你必须要掌握的技术&#xff1a; 1. Jav…

【实验练习】基于SVM的实现鸢尾花(Iris)数据集分类 (Python实现)

题目 采用SVM方法实现鸢尾花(Iris)数据集分类 数据集 iris.name是关于数据集的属性说明&#xff1b; iris.data是实际的数据集&#xff0c;它包含三类数据&#xff0c;每类数据有50条数据。 要求 训练集&#xff1a;选取Iris数据集中80%的数据&#xff0c;即120个数据&…

小程序容器技术:数字门户的创新引擎

数字门户是指提供一站式访问和集成多个在线服务、信息和资源的网络平台。它通常是一个网站或应用程序&#xff0c;为用户提供广泛的功能和服务&#xff0c;如新闻、天气预报、电子邮件、在线购物、社交媒体、银行服务、电子支付、在线学习、政府服务等。数字门户的目标是通过集…

Laravel 招聘系统 - 求职者和雇主的解决方案

您是否正在寻找一个将求职者和雇主联系起来的解决方案&#xff1f;那就不要再找了&#xff01;我们隆重推出 Laravel 招聘板&#xff0c;这是一个使用 Laravel 9.x 框架构建的尖端招聘板脚本。凭借其简洁而优雅的设计&#xff0c;该脚本旨在创建一个用于广告职位空缺、寻找合适…

【Python小技巧】Python操控Chrome浏览器实现网页打开、切换、关闭(送独家Chrome操作打包类源码、Chrome浏览器Cookie在哪里?)

文章目录 前言一、什么时候需要用Python控制浏览器&#xff1f;二、下载Chrome浏览器驱动文件1. 安装Chrome浏览器并查看版本2. 下载浏览器驱动文件3. 解压到python编译器目录&#xff08;python.exe所在目录&#xff09; 三、Python控制Chrome浏览器&#xff08;附源代码&…

基于国产RK3588+多路H.265视频编解码 转码 3U VPX 方案

一、概述 3U VPX音视频转码模块是信迈科技推出的基于RK3588平台用于音视频的编解码、转码&#xff0c;本模块SDI视频、模拟音频输入&#xff0c;视频进行分辨率和帧率的变换&#xff0c;音频进行采样率和码率等的变换&#xff0c;网口输入的视频流进行解码或者转码&…

Linux——进程优先级环境变量

目录 1、进程优先级 1.1 基本概念 1.2 查看系统进程 1.3 PRI and NI 1.4 PRI vs NI 1.5 查看进程优先级的命令 1.6 其他概念 2、环境变量 2.1 基本概念 2.2 常见环境变量 2.3 查看环境变量方法 2.4 测试PATH 2.5 测试HOME 2.6 和环境变量相关的命令 2.7 环境变量…

Springboot配置文件中的明文密码漏洞

目录 一、背景 二、本地修复测试 1、maven中引入jasypt 2、编写加密解密工具类 3、修改配置文件&#xff0c;增加秘钥 4、秘钥放在启动项 三、生产实现 1、升级打包代码 2、生产yml修改明文密码处 3、修改启动命令 一、背景 最近接收到网安的系统安全…

c++类和对象【3】(static成员,友元内部类,匿名对象等)

文章目录 1.友元函数1.1友元函数1.2友元类 2内部类3.匿名对象4.拷贝对象的一些编译器优化5.static成员 1.友元函数 我们在类外面去访问类里的私有成员&#xff0c;就要突破类的访问限定因此就有了友元&#xff0c;它提供了一种突破封装的方式&#xff0c;但是友元会增加耦合度…

GPT时代,一定要收藏的结构化提问技巧

有一种被称为“SMART”的结构化提问方法&#xff0c;可以帮助你更好的组织和明确提出的问题。“SMART”是一个缩写&#xff0c;它代表了以下几个关键元素&#xff1a; S&#xff1a;Specific&#xff08;具体&#xff09; 确保问题具体明确&#xff0c;避免模糊或含糊不清的表…