STM32控制WS2812B灯

2020-08-03来源: 51hei关键字:STM32控制  WS2812B灯

单片机源程序如下:

#include "WS2812B.h"

/* Buffer that holds one complete DMA transmission

*

* Ensure that this buffer is big enough to hold

* all data bytes that need to be sent

*

* The buffer size can be calculated as follows:

* number of LEDs * 24 bytes + 42 bytes

*

* This leaves us with a maximum string length of

* (2^16 bytes per DMA stream - 42 bytes)/24 bytes per LED = 2728 LEDs

*/

//#define TIM3_CCR3_Address 0x4000043c         // physical memory address of Timer 3 CCR1 register

//#define TIM3_CCR1_Address 0x40000434        // physical memory address of Timer 3 CCR1 register

#define TIM2_CCR1_Address 0x40000034

        

#define TIMING_ONE  50

#define TIMING_ZERO 25

uint16_t LED_BYTE_Buffer[300];

//---------------------------------------------------------------//


void Timer2_init(void)

{

        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  DMA_InitTypeDef DMA_InitStructure;

        

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        /* GPIOA Configuration: TIM2 Channel 1 as alternate function push-pull */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

        

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        /* Compute the prescaler value */

        //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;

        /* Time base configuration */

        TIM_TimeBaseStructure.TIM_Period = 90-1; // 800kHz

        TIM_TimeBaseStructure.TIM_Prescaler = 0;

        TIM_TimeBaseStructure.TIM_ClockDivision = 0;

        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


        /* PWM1 Mode configuration: Channel1 */

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

        TIM_OCInitStructure.TIM_Pulse = 0;

        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

        TIM_OC1Init(TIM2, &TIM_OCInitStructure);

               

        /* configure DMA */

        /* DMA clock enable */

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        

        /* DMA1 Channel6 Config */

        DMA_DeInit(DMA1_Channel2);


        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM2_CCR1_Address;        // physical address of Timer 3 CCR1

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer;                // this is the buffer memory

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                // data shifted from memory to peripheral

        DMA_InitStructure.DMA_BufferSize = 42;

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                        // automatically increase buffer index

        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                        // stop DMA feed after buffer size is reached

        DMA_InitStructure.DMA_Priority = DMA_Priority_High;

        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        

        DMA_Init(DMA1_Channel2, &DMA_InitStructure);


                /* TIM3 CC1 DMA Request enable */

        TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);

}


/* This function sends data bytes out to a string of WS2812s

* The first argument is a pointer to the first RGB triplet to be sent

* The seconds argument is the number of LEDs in the chain

*

* This will result in the RGB triplet passed by argument 1 being sent to

* the LED that is the furthest away from the controller (the point where

* data is injected into the chain)

*/

void WS2812_send(uint8_t (*color)[3], uint16_t len)

{

        uint8_t i;

        uint16_t memaddr;

        uint16_t buffersize;

        buffersize = (len*24)+43;        // number of bytes needed is #LEDs * 24 bytes + 42 trailing bytes

        memaddr = 0;                                // reset buffer memory index


        while (len)

        {        

                                for(i=0; i<8; i++) // GREEN data

                        {

                                        LED_BYTE_Buffer[memaddr] = ((color[0][1]<

                                        memaddr++;

                        }

                        for(i=0; i<8; i++) // RED

                        {

                                        LED_BYTE_Buffer[memaddr] = ((color[0][0]<

                                        memaddr++;

                        }

                        for(i=0; i<8; i++) // BLUE

                        {

                                        LED_BYTE_Buffer[memaddr] = ((color[0][2]<

                                        memaddr++;

                        }

                        

                  len--;

        }

//===================================================================//        

//bug:最后一个周期波形不知道为什么全是高电平,故增加一个波形

          LED_BYTE_Buffer[memaddr] = ((color[0][2]<<8) & 0x0080) ? TIMING_ONE:TIMING_ZERO;

//===================================================================//        

          memaddr++;        

                while(memaddr < buffersize)

                {

                        LED_BYTE_Buffer[memaddr] = 0;

                        memaddr++;

                }


                DMA_SetCurrDataCounter(DMA1_Channel2, buffersize);         // load number of bytes to be transferred

                DMA_Cmd(DMA1_Channel2, ENABLE);                         // enable DMA channel 6

                TIM_Cmd(TIM2, ENABLE);                                                 // enable Timer 3

while(!DMA_GetFlagStatus(DMA1_FLAG_TC2)) ; // wait until transfe

[1] [2]
关键字:STM32控制  WS2812B灯 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505104.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:用STM32去读取CCS811气体传感器的数据
下一篇:Proteus8.8版本+ STM32F103驱动LCD1602显示程序+按键+ADC+串口

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PWM控制led渐变
PWM,中文释义:脉冲宽度调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!(在编程过程中的定时器重映像时涉及到)STM32 的PWM是TIMx_ARR寄存器确定频率(周期)、由TIMx_CCRx寄存器确定占空比的信号。PWM  模式脉冲
发表于 2020-09-11
STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
一.预备知识使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写“1”或者写“0”即可。但使用STM32控制IO口输入输出却远没有这么容易,经过一个下午的查阅文献及探索后,略微有了头绪。个人所使用的STM32F103VBT6有100个引脚,其中有五组GPIO(GPIOA…GPIOE),每组有16个GPIO端口(GPIOx_Pin0…GPIOx_Pin15)共80个,每个GPIO端口都有:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH);两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR);一个32位置位/复位寄存器(GPIOx_BSRR);一个16位复位寄存器(GPIOx
发表于 2020-08-31
<font color='red'>STM32</font>学习笔记——<font color='red'>控制</font>GPIO输出点亮LED灯(直接操作存储器)
STM32按键控制流水灯 转换|加速|减慢
单片机源程序如下:#include <stdio.h>#include "stm32f4xx.h"#include "led.h"#include "key.h"int main(void){           int pwm_cmd;        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);        NVIC_PriorityGroupConfig(NVIC
发表于 2020-08-13
<font color='red'>STM32</font>按键<font color='red'>控制</font>流水灯 转换|加速|减慢
proteus8.6仿真STM32按键控制LED灯程序
proteus8.6 按键控制LED灯闪烁情况单片机源程序如下:#include "led.h"#include "exti.h"#include "delay.h"int main(void){                                LED_Init();         //初始化与LED连接的硬件接口   
发表于 2020-08-13
proteus8.6仿真<font color='red'>STM32</font>按键<font color='red'>控制</font>LED灯程序
[零基础学习STM32]第四讲:UART通讯实验—控制LED
;    图4_1UART引脚图             图4_2UART转USB  本试验使用的芯片STM32F407IGT6,使用UART为UART_4,引脚位PA0和PA1,经过串口转USB芯片CH340转换后,可通过USB接口与计算机通讯。三、 实验原理  计算机安装 CH340 驱动后,可通过串口工具来接收串口发送的数据和向串口发送给数据。用串口工具打开iCore3对应的端口,波特率设为115200,发送相应的命令,便可以控制ARM LED的亮灭情况。串口命令如下表:表4_1: 串口控制命令
发表于 2020-08-12
[零基础学习<font color='red'>STM32</font>]第四讲:UART通讯实验—<font color='red'>控制</font>LED
STM32蜂鸣器pwm控制频率播放音乐
通过修改输出的pwm波的频率来达到不同的音频单片机源程序如下:#include "stm32f10x.h"#include "led.h"#include "delay.h"#include "sys.h"#include "timer.h"#define  proport          10000 //Tclk/(psc+1)=72000000/(7199+1)#define  L1       ((proport
发表于 2020-08-11
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved