IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32G0+SPI+DMA+WS2812(Hal库) -> 正文阅读

[嵌入式]STM32G0+SPI+DMA+WS2812(Hal库)

目录

前言

一、MT1673/WS2812B怎么用

二、STM32CUBEMX配置

1.配置单片机时钟

? ? ? ? ?2、配置下载口

? ? ? ? ?3、配置SPI

?三、代码

?????????1.调通一盏灯

?????????2.调通多盏灯



前言

????????最近在使用STM32G030F6单片机做一个小项目,用来控制一个RGB彩灯灯板,灯板的芯片是MT1673和WS2812b的控制逻辑是一模一样的,所使用的方式是SPI+DMA来控制,也可以使用PWM+DMA,看个人意愿,本文仅对SPI+DMA方式进行描述,使用的是CUBEMX,Hal库

一、MT1673/WS2812B怎么用

? ? ? 芯片手册里是这样描述的:

? ? 也就是说一个芯片可以接收24bit数据,然后将剩余的数据自动转发给下一个芯片,直到接收到80us以上的低电平reset码后,才会将数据送到引脚上,每8个bit为一种颜色,总共是R、G、B三种颜色;根据8个bit的数据便可以确定一种颜色的亮度,24bit确定三种颜色亮度,可以组合出很多? 颜色。

?那么看到这里肯定会有疑惑了,这24bit应该填写什么呢?先贴图:

?

? ? ? 这是什么意思?不要着急,我们慢慢分析。

? ? ? 首先,我们可以看出,有三种码型,分别是0、1、reset码,0:低电平时间长,高电平时间短;1:低电平时间短,高电平时间长;reset:全部是低电平。一个0码、1码要求的周期是1.2us左右,手册里要求精度很高(实际使用的时候发现,1us-2us都是可以的)。

? ? ? 分析完这三种码后,我们就可以清除的知道,这24个bit填的是0码或者1码,而reset码是把全部的数据填好,要让它显示的时候才发送的。

? ? ? 那么此时问题1来了:为什么要有?0码、1码?

? ? ? 0码和1码是为了控制每种颜色的亮度,8bit为一种颜色的数据,可以理解为1bit为1/8的PWM波占空比,0码占空比为低电平,1码为高电平,不过要按照高位在前,低位在后的顺序,1码必须从低位忘高位增加,否则无效,什么意思呢?

? ? ? 如果发送上图这种格式的码,表示红色会有50%的亮度

? ? ? ?如果发送上图这种格式,是无效的。

? ? ? ?紧接着问题二来了:该怎么发0码、1码?

? ? ? ?我们可以看到一个bit周期是1.2us左右,0码和1码各有不同的高低电平时间,这可难倒一些同学了,大概有几种思路:

1、采用延时函数delay进行GPIO高低电平翻转,这种方法是简单,但也费时间;

2、采用定时器进行GPIO高低电平翻转,这种方法如果受其他中断打断就会造成时序混乱;

3、采用PWM+DMA方式,PWM选择好频率,调整占空比即可,这种方法比较好,可以使用;

4、采用SPI+DMA方式,这种方式也很好,因为使用PWM比SPI多一些,所以想试试,就选择了SPI,单独使用SPI也可以,但是不如DMA方式,会过多占用CPU。

? ? ? ?STM32G030的SPI可以发送8bit或者16bit的数据,我们使用8bit模式,单片机时钟晶振配置最高频率64M,8分频后为8M,即发送1bit为1/8M的时间,8bit的时间=8*1/8M=1us,和要求时间差不多,本来以为不可以,因为手册要求精度太高,抱着试试看的心态,结果成功了。其他单片机只要频率配置差不多就可以。接下来看看怎么配置CUBEMX.

二、STM32CUBEMX配置

1.配置单片机时钟

? ? ? 打开STM32CUBEMX后,选择好芯片,首先配置时钟:

?如上所示配置

2、配置下载口


?避免第二次下载不进单片机

3、配置SPI

? ? ? 这里我们选择主发模式

?SPI配置如图所示,接下来配置DMA

?按图中所指示的进行配置,配置完后,生成工程即可

? ? ? 填好名字,选好路径,工具

只需要生成必要文件即可?

?三、代码

1.调通一盏灯

打开工程,首先找到主函数,需要注意,一定要先进行DMA初始化,再进行SPI初始化,我生成的工程是先初始化SPI的,导致DMA卡死,怎么都调不通,对各种寄存器和标志位进行操作都没用,后来调整顺序发现可以了。

添加测试数组以及发送函数,使用逻辑分析仪观察波形,首先我们用普通的SPI测试函数发送:

?可以看到,一共发送了24个数据,频率为1MHz,那么一个数据就是1us的周期,0码的高电平时间是0.25us,1码高电平时间是0.75us,接下来测试DMA发送;

?可以看到也是成功发送,好了那么到这里基本的控制逻辑就可以跑通了,那么接下来就是怎么去控制的问题,手册上讲的是,当发送完所有数据后,给持续80us以上的低电平,则会使得数据送至管脚

?因此,我们只需要在发送完数据后再加80us以上的数据即可,这里我采用100us,也就是定义发送reset码数据的数组大小为100,使用SPI方式发送,数据为0。

这样便可以成功点亮一个灯,而亮度也可以调节,不过要注意高低位的问题,其实这里可以写成一个数组,后100个我们填0即可。?

2.调通多盏灯

当点亮一盏灯后,相信你一定想要调通多盏灯,那么首先要做的就是写好接口函数,首先定义我们需要的宏和颜色结构体,定义0、1码的码型,颜色结构体。

然后编写一些接口函数,比如发送函数,设置颜色函数等等

这里,Red,Green,Blue三个参数根据要的亮度写0X00-0XFF即可或者0-255,注意高低位的问题就可以

还可以写一个发送函数?,这样做的好处就是,我们只需要对数组进行设置后,在最后调用发送函数即可,而不需要每次都在设置数组后调用hal库提供的API。

到这里已经差不多了,接下来可以根据自己的想法进行各种样式的灯控制。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:45:46  更:2022-02-22 20:47:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:48:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码