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。

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

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SPI(Serial Peripheral Interface)是一种串行外设接口,它允许主控制器与多个外设设备进行通信。SPI通信需要使用GPIO口进行数据传输,为了减轻CPU的负担,在一些支持DMA(Direct Memory Access)的系统中,可以通过SPI DMA来实现高效的数据传输。 SPI DMA是指使用DMA控制器来完成SPI数据传输的方式。DMA是一种直接内存访问技术,它可以在不依赖CPU的情况下,直接从内存中传输数据到外设或从外设中传输数据到内存。使用SPI DMA可以大大提高数据传输效率,减少CPU的干预。 HAL(Hardware Abstraction Layer)是硬件抽象层的意思,它是一种在嵌入式系统中广泛使用的软件开发模型。HAL可以屏蔽底层硬件的细节,提供统一的接口给上层应用程序使用。对于SPI DMA来说,HAL可以提供简洁的、高度可移植的编程接口,方便开发人员使用SPI DMA来进行数据传输。 在使用SPI DMA的过程中,首先需要配置SPIDMA控制器的寄存器,使得它们能够协同工作。然后,可以通过HAL提供的API调用相关函数来进行数据传输的配置和操作。通过配置DMA传输的方向、数据长度和起始地址等参数,可以实现从内存到外设或从外设到内存的数据传输。在数据传输完成后,通过相应的回调函数可以获取传输的状态和数据,以便进行后续的处理。 综上所述,SPI DMA HAL是指使用SPI DMA进行数据传输的硬件抽象层接口。通过SPI DMA HAL,开发人员可以方便地配置和操作SPI DMA,实现高效的数据传输。这不仅提高了数据传输的效率,还减轻了CPU的负担,适用于对数据传输要求严格的嵌入式应用场景。 ### 回答2: SPI(Serial Peripheral Interface,串行外设接口)是一种在微控制器和外部设备之间进行全双工通信的通信协议。DMA(Direct Memory Access,直接内存访问)是一种计算机数据传输方式,在外设和内存之间进行高速数据传输,无需CPU的干预。HAL(Hardware Abstraction Layer,硬件抽象层)是一种软件层次结构,将硬件操作接口抽象出来,使得应用程序可以方便地调用硬件功能而不需要关心底层细节。 SPI DMA HAL(SPI DMA硬件抽象层)是指在使用SPI通信,利用DMA进行高效的数据传输的硬件抽象层。一般情况下,使用SPI进行数据传输需要CPU的介入,在每次传输字节需要由CPU发出数据和接收数据,而使用DMA则可以将数据传输的过程交给DMA控制器完成,减轻了CPU的负担,提高了数据传输的效率。 SPI DMA HAL主要包括了对SPIDMA控制器的初始化配置、数据传输和中断处理等功能的封装。通过SPI DMA HAL,应用程序可以方便地调用相应的函数进行SPI数据的发送和接收操作,无需关心底层硬件细节,简化了驱动开发的难度和复杂度。 SPI DMA HAL也提供了对中断的处理,当数据传输完成,可以通过中断通知应用程序进行相关处理。这样,可以提高系统的实性和响应速度。 总之,SPI DMA HAL通过对SPIDMA的硬件抽象,使得开发者可以更方便地使用SPI进行高效的数据传输,减轻CPU负担,提高数据传输效率。 ### 回答3: SPI DMA HAL是一种在嵌入式系统中使用的通信协议。SPI表示串行外设接口(Serial Peripheral Interface),DMA表示直接内存访问(Direct Memory Access),HAL表示硬件抽象层(Hardware Abstraction Layer)。 SPI是一种串行通信协议,它允许微控制器与外部设备进行全双工的通信。通过SPI总线,微控制器可以将数据发送到外设,同也可以接收外设发送的数据SPI数据传输可以通过硬件实现,因此具有较高的速度和可靠性。 DMA是一种机制,它允许外设直接访问系统内存,而不需要通过微控制器的中断或程序来协调数据传输。DMA可在数据传输期间将控制权交给外设,从而减少微控制器的负载,提高系统的效率和性能。 HAL是一个软件层,它提供了一组通用型接口和功能,用于访问硬件设备。SPI DMA HAL就是针对SPIDMA这两种硬件的抽象层。它封装了底层的硬件细节,提供了简单易用的API,使得开发者可以更加方便地使用SPIDMA进行数据传输。 使用SPI DMA HAL,开发者无需关心底层的硬件细节和寄存器配置,只需要调用相应的API函数,就可以完成SPIDMA的配置和数据传输。这大大简化了开发流程,提高了开发效率。同SPI DMA HAL还提供了错误处理和中断处理等功能,使得开发者可以更加可靠地处理数据传输过程中的异常情况。 总而言之,SPI DMA HAL是一种方便易用的通信协议,通过提供统一的API和功能,使得开发者可以更加简单高效地使用SPIDMA进行数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值