STM32F427库函数配置DMA驱动TIM5 PWM驱动WS2812B单总线全彩RGB

系列文章传送门:
STM32F4多路PWM DMA控制千颗WS2812/SK6812配置过程全解析
STM32F405 多路DMA+PWM方式控制2000+WS2812灯优化buffer占用flash空间不足问题
借WS2812浅谈WS2812调试思想
正文:


关键初始化代码如下

定时器初始化

#include "gpio_ws2812.h"
#include "pwm.h"
/*************************
函数名:WS2812_Init
函数功能:WS2812的PWM配置
函数输入:无
函数返回值: 无
描述:配置的引脚 PH10-12 PI0
*************************/
void WS2812_TIM_Init(void)
{GPIO_InitTypeDef          gpio;TIM_TimeBaseInitTypeDef   tim;TIM_OCInitTypeDef         oc;gpio.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 ; //CH1,2,3gpio.GPIO_Mode = GPIO_Mode_AF;gpio.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOH,&gpio);gpio.GPIO_Pin = GPIO_Pin_0; //CH4gpio.GPIO_Mode = GPIO_Mode_AF;gpio.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOI,&gpio);GPIO_PinAFConfig(GPIOH,GPIO_PinSource10,GPIO_AF_TIM5);//定时器5 通道1GPIO_PinAFConfig(GPIOH,GPIO_PinSource11,GPIO_AF_TIM5);//定时器5 通道2GPIO_PinAFConfig(GPIOH,GPIO_PinSource12,GPIO_AF_TIM5);//定时器5 通道3GPIO_PinAFConfig(GPIOI,GPIO_PinSource0,GPIO_AF_TIM5);//定时器5 通道4/* TIM5 */tim.TIM_Prescaler = 19-1; //18OKtim.TIM_CounterMode = TIM_CounterMode_Up;tim.TIM_Period = 1*5;   //4->1us //0.5HIGH 0.75LOW 0码; 0.75HIGH 0.5LOW 1码tim.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&tim); //初始化时间基数单位oc.TIM_OCMode = TIM_OCMode_PWM2;oc.TIM_OutputState = TIM_OutputState_Enable;oc.TIM_OutputNState = TIM_OutputState_Disable;oc.TIM_Pulse = 0;oc.TIM_OCPolarity = TIM_OCPolarity_Low;oc.TIM_OCNPolarity = TIM_OCPolarity_High;oc.TIM_OCIdleState = TIM_OCIdleState_Reset;oc.TIM_OCNIdleState = TIM_OCIdleState_Set;TIM_OC1Init(TIM5,&oc);//定时器5 通道1TIM_OC2Init(TIM5,&oc);//定时器5 通道2TIM_OC3Init(TIM5,&oc);//定时器5 通道3TIM_OC4Init(TIM5,&oc);//定时器5 通道4TIM_OC1PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM5,ENABLE);TIM_Cmd(TIM5,DISABLE);}

DMA初始化

#define WS2812BIT_HIGH 3
#define WS2812BIT_LOW 1
const u8 WS2812BitDef[2] ={WS2812BIT_LOW,WS2812BIT_HIGH};
#define WS2812_NUMS 350
#define WS2812_SIZE 24*WS2812_NUMS+1 //最后一bit为reset电平 //还有另一种实现思路是使能DMA传输完成中断 并在该中断中将CCR寄存器置0
u32 Pwm5_3_DMABuffer[WS2812_SIZE]={0};void WS2812_TIM5_3_DMA_Init(void)
{NVIC_InitTypeDef nvic;DMA_InitTypeDef dma;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);   //使能DMA传输delay_ms(5);DMA_Cmd(DMA1_Stream0, DISABLE);DMA_DeInit(DMA1_Stream0);dma.DMA_Channel = DMA_Channel_6;dma.DMA_PeripheralBaseAddr = (uint32_t)(&TIM5->CCR3);  /* DMA外设基地址 *///DMA外设TIM5-CCR3地址/dma.DMA_Memory0BaseAddr = (uint32_t)Pwm5_3_DMABuffer; ///* DMA内存基地址 */DMA内存基地址/dma.DMA_DIR = DMA_DIR_MemoryToPeripheral;/* 数据传输方向,从内存读取发送到外设 */dma.DMA_BufferSize = WS2812_SIZE;/* DMA通道的DMA缓存的大小 */dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/* 外设地址寄存器不变 */dma.DMA_MemoryInc = DMA_MemoryInc_Enable;/* 内存地址寄存器递增 */dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;/* 数据宽度为32位 */dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;/* 数据宽度为32位 */dma.DMA_Mode = DMA_Mode_Normal;      ///* 工作在正常模式 */工作在正常缓存模式dma.DMA_Priority = DMA_Priority_Medium;   //DMA通道 x拥有中优先级 dma.DMA_FIFOMode = DMA_FIFOMode_Disable;   //DMA通道x没有设置为内存到内存传输dma.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//DMA_FIFOThreshold_HalfFull;//DMA_FIFOThreshold_1QuarterFull;dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/* 配置DMA */DMA_Init(DMA1_Stream0, &dma);TIM_DMACmd(TIM5, TIM_DMA_Update, ENABLE);DMA_Cmd(DMA1_Stream0, DISABLE);  /*不使能DMA */  TIM_Cmd(TIM5, ENABLE);  /* 使能TIM5 */}

调用发送部分

u32 DMAsetcounter=0;
bool PWM5_3_DMA_Enable(void)
{static u8 start_flag=0;if(DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF0)!= RESET || start_flag!=1) //传输完成标志,若在传输过程中再次设置将会打乱时序{start_flag=1;DMA_ClearFlag(DMA1_Stream0,DMA_IT_TCIF0);DMA_Cmd(DMA1_Stream0, DISABLE );DMA_SetCurrDataCounter(DMA1_Stream0,DMAsetcounter); //WS2812_SIZEDMA_Cmd(DMA1_Stream0, ENABLE);//TIM_Cmd(TIM5, ENABLE);  /* 使能TIM3 */TIM5->EGR |= 0x00000001; /* 由于最后一次ARR值为0,这是为了停止定时器对io口的操作,但是不要忽略了一点:CNT并没有停止计数,而且是不会再停下来,如果没有手动操作的话,所以需要在每次dma使能时加上一句,将EGR里的UG位置1,清零计数器 */return true;}else{return false;}
}bool WS2812_UpdateColor(u8 colors[][3],u16 led_nums) //GRB 高位先发
{if(led_nums>WS2812_NUMS) return false;for(int i=0;i<led_nums;i++){for(int channel=WS2812_GREEN;channel<WS2812_BLUE+1;channel++) //这两个for可合并为一个{for(int bit=7;bit>=0;bit--){Pwm5_3_DMABuffer[i*24+channel*8+(7-bit)]=WS2812BitDef[*(colors[i] + channel)>>bit&0x01];}}}Pwm5_3_DMABuffer[led_nums*24]=0;DMAsetcounter=led_nums*24+1;PWM5_3_DMA_Enable();return true;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yx19981001/article/details/102457819

STM32F427库函数配置DMA驱动TIM5 PWM驱动WS2812B单总线全彩RGB相关推荐

  1. 【基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯】

    基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯 STM32CubeMX配置: 工程源码: END 以上就是相关配置,最需要注意的就是时钟以及pre数值以及芯片时钟频 ...

  2. WS2812全彩RGB驱动方法

    一. 简介 买了一个圆形的WS2812模块玩玩,特来总结一下驱动方法,感觉对比于普通的RGB灯来说,还是有点不一样的. 踩了一些坑,也在此列出. 二. ws2812驱动 驱动方法其实很简单,就是发送一 ...

  3. DMA+PWM驱动彩色RGB灯

    前言 现在带IC的彩灯虽然有 SK6812 .WS2812 等不同信号,但是其控制逻辑基本是完全兼容的,本文所描述相关控制参数来源于 SK6812 ,原于带 IC 芯片的 RGB 可以通过串联来实现数 ...

  4. 如何使用STM32F103C8T6驱动WS2812(PWM+DMA)

    一.WS2812概述: WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果. 数据传输时间: T0H 0码,高电平时间 22 ...

  5. STM32F427库函数PWM+DMA控制ws2812b灯带

    STM32F427IIHx库函数PWM+DMA控制ws2812b灯带 一.参考资料 查看ws2812b用户手册可知: 二.代码部分 添加文件ws2812b.c,ws2812b.h 配置的F427IIH ...

  6. NUC980 PWM驱动配置与测试

    一.查看电路PWM引脚 分别是PF7与PF8引脚 再查手册,PF7与PF8都属于PWM0下PWM02与PWM03 二.内核配置 1.→ Device Drivers使能PWM驱动 2.→ Device ...

  7. STM32单片机基础12——使用通用定时器产生PWM驱动蜂鸣器

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的通用定时器外设,产生PWM驱动无源蜂鸣器. 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM ...

  8. STM32: 利用高级定时器产生6路互补PWM波形输出在BLDC中H-PWM-L-ON驱动方式下驱动无刷电机

    原文网址:http://jingyan.eeboard.com/article/73847#/prettyPhoto%5Bpp_gal%5D/6/ http://jingyan.eeboard.com ...

  9. Linux驱动之模拟PWM驱动

    pwm(脉冲宽度调制)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变.这种方式能使电源的输出电压在工作 ...

最新文章

  1. strcpy +memcpy实现循环右移
  2. 零基础学习Java培训有什么攻略
  3. 红橙Darren视频笔记 万能Dialog builder设计模式
  4. android+动画+锯齿,Android_rotate--animation 动画旋转两图片,消除动画锯齿现象 android 开发:动画旋转两图片 - 下载 - 搜珍网...
  5. java案例代码8--最终要随机输出一组出来做为排名
  6. 同余方程-NOIP2012TGD2T1
  7. 【修改R语言的安装包路径】
  8. android数据线投屏电视机,手机连接电视机的办法很多,连接效果也有很大差异,下面为大家介绍...
  9. 【PageHelper】实现拦截pageNum和pageSize
  10. 自然语言处理顶会 ACL2019论文接收列表
  11. 800万像素摄像头,评估可以看到多远的红绿灯【1】?
  12. cannot find -l****问题的解决办法
  13. ios系统——先了解iCloud是什么吧
  14. 为SSD编程(6):总结—每个程序员都应该了解的关于固态硬盘的知识
  15. 【东哥视觉】做人做事禁忌
  16. 小白学习,歌词解析(半成品)
  17. Android-PickerView实现全国地区选择
  18. 黑苹果一些奇怪的事情
  19. 《罗马革命》豆瓣 9.1 从恺撒大帝到屋大维
  20. android到底要多少内存,手机内存究竟要多大才够用?

热门文章

  1. NOD32/ESET/EAV/ESS之间的区别是什么?
  2. 关于霍尼韦尔几个配置条码
  3. 商品期货局部极值识别判断峰值波谷
  4. 【强化学习论文合集】二十.2019机器人与自动化国际会议论文(ICRA2019)
  5. java牛顿切线法求解方程组,牛顿迭代法求方程的解
  6. 信号完整性之玻纤效应
  7. ARM:嵌入式系统之硬件总复习
  8. LPC2368FBD100芯片相关资料!
  9. 如开开发一个微信自动回复功能
  10. git查看两个版本之间修改了哪些文件