STM32系列(HAL库)

您所在的位置:网站首页 stm32驱动程序下载 STM32系列(HAL库)

STM32系列(HAL库)

2023-09-08 17:23| 来源: 网络整理| 查看: 265

1.软件准备

(1)编程平台:Keil5

(2)CubeMX

2.硬件准备

(1)某宝买的RGB模块(4个灯珠级联)

(2)F1的板子,本例使用经典F103C8T6

(3)ST-link 下载器

(4)杜邦线若干

3.模块资料 (1)模块简介:

没什么比手册讲得更加清楚了,模块中文数据手册:ws2812b中文资料_数据手册_参数

(2)驱动原理:

         以上这是数据手册中提到的,WS2812驱动用的是单线归零码的通讯方式。不同占空比的方波代表1码或者0码,这里不同的占空比就是  0码或1码高电平时间 / 方波周期时间 。对于本次例程,我们就是改变PWM的占空比实现0码或1码的传输。

(3)PWM+DMA原理:

        关于DMA的详细解析,我推荐这篇文章:DMA原理,步骤超细详解,一文看懂DMA

        PWM+DMA可以实现数量和占空比可控的脉冲,具体实现原理是在开启DMA的情况下,定时器在每次计数满后,会自动将DMA传输过来的数据作为新一轮的比较数值。如果DMA传输的数据每次不同,那么每次的方波占空比就不一样的。在本例程中,我们将数据存放在一个数组,通过DMA传输数组的内容,根据数组中数据的个数和每个数据的大小,就能实现数量和占空比可控的PWM。

4.CubeMX配置 (1)芯片选择

 (2)配置RCC、SYS、时钟树

配置RCC

配置SYS

配置时钟树

(3)配置定时器TIM1

         在定时器配置中,我们根据WS2812的最大传输速率800kbps,设置定时器不分频和计数周期为89+1,这样下来波形的频率为  72M /(89+1) = 800K  ,并且一个波形的周期为  1 / 800 = 1.25us

(4)开启DMA

 (5)设置路径、生成代码工程 

5、Keil5代码 (1)创建RGB.c和RGB.h文件 (2)添加上述的RGB.c文件进工程

——————上述两步参考之前系列教学步骤,在此不再赘述(点击跳转)

(3)RGB.c和RGB.h代码

 RGB.h

#ifndef __RGB_H #define __RGB_H #include "main.h" #define Hight_Data ( 64 ) //1 码相对计数值 #define Low_Data ( 36 ) //0 码相对计数值 #define Reste_Data ( 80 ) //80 复位电平相对计数值 #define Led_Num ( 4 ) //WS2812灯个数 #define Led_Data_Len ( 24 ) //WS2812数据长度,单个需要24个字节 #define WS2812_Data_Len (Led_Num * Led_Data_Len) //ws2812级联后需要的数组长度 //uint16_t RGB_buffur[Reste_Data + WS2812_Data_Len] = { 0 }; //数据缓存数组 void WS2812_Display_1(uint32_t Color, uint16_t num); void WS2812_Display_2( uint8_t red, uint8_t green, uint8_t blue,uint16_t num); void WS2812_Number_4(uint32_t Color1,uint32_t Color2,uint32_t Color3,uint32_t Color4);//封装好的四个灯函数,只需要分别输入四个灯的颜色即可 #endif

 RGB.c

#include "RGB.h" #include "main.h" #include "tim.h" uint16_t RGB_buffur[Reste_Data + WS2812_Data_Len] = { 0 }; //数据缓存数组 void WS2812_Display_1(uint32_t Color, uint16_t num) { //指针偏移:需要跳过复位信号的N个0 uint16_t* p = (RGB_buffur + Reste_Data) + (num * Led_Data_Len); for (uint8_t i = 0; i < 8; ++i) p[i+8]= (((Color


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3