头文件:

#ifndef __LAMP_BEADS_H__
#define __LAMP_BEADS_H__#include "tim.h"
#include "main.h"#define LED_NUM  4
#define GRB_LEN (3*8)
//800KHz的倒数即1250ns,84MHz的倒数对应11.905ns即一拍(1 bit),105拍对应1250ns(满)
//#define WS_ZERO   35
//#define WS_ONE    45
#define WS_ZERO 28 //对应333.33ns,符合220ns~380ns的T0H
#define WS_ONE  60 //对应714.29ns,符合580ns~1us的T1H
#define WS_RESET    240 //一拍传一位,对应1.25us,240拍对应300us,符合280us以上的要求
#define WS_DATA_LEN (LED_NUM*GRB_LEN)//extern uint16_t pixel_buffer[WS_RESET+WS_DATA_LEN];
extern uint32_t pixel_buffer[WS_RESET+WS_DATA_LEN];void ws281x_init(uint8_t led_num);
void ws281x_show(void);
uint32_t ws281x_color(uint8_t r, uint8_t g, uint8_t b);
void ws281x_set_color(uint16_t index, uint8_t color_r, uint8_t color_g, uint8_t color_b);
void ws281x_red(uint8_t led_num);
void ws281x_green(uint8_t led_num);
void ws281x_blue(uint8_t led_num);
void ws281x_close(void);
#endif /* __LAMP_BEADS_H__ */

源文件:

#include "lamp_beads.h"
#include <math.h>
#include <stdlib.h>//DMA传输完成回调函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{//__HAL_TIM_SetCompare(htim, TIM_CHANNEL_2, 0); //占空比清0,若不清会导致灯珠颜色不对//HAL_TIM_PWM_Stop_DMA(htim, TIM_CHANNEL_2);
}//PWM占空比数值为uint16_t类型,DMA传输时只能以半字输出,pixelBuffer应为uint16_t 类型
//uint16_t pixel_buffer[WS_RESET+WS_DATA_LEN] = {0};
uint32_t pixel_buffer[WS_RESET+WS_DATA_LEN] = {0};void ws281x_init(uint8_t led_num)
{uint16_t num_data;num_data = WS_RESET + led_num*GRB_LEN;for(uint8_t i=0; i<led_num; i++)ws281x_set_color(i, 0x00, 0x00, 0x00);HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pixel_buffer, num_data);
}uint32_t ws281x_color(uint8_t r, uint8_t g, uint8_t b)
{return (uint32_t)(g<<16 | r<<8 | b);
}void ws281x_show(void)
{//HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pulse, 176);HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pixel_buffer, WS_RESET+WS_DATA_LEN);
}void ws281x_set_color(uint16_t index, uint8_t color_r, uint8_t color_g, uint8_t color_b)
{//uint16_t *p = (pixel_buffer+WS_RESET) + index*GRB_LEN;uint32_t *p = (pixel_buffer+WS_RESET) + index*GRB_LEN;for(uint8_t i=0; i<8; i++){p[i] = ((color_g << i) & 0x80) ? WS_ONE : WS_ZERO;p[i+8] = ((color_r << i) & 0x80) ? WS_ONE : WS_ZERO;p[i+16] = ((color_b << i) & 0x80) ? WS_ONE : WS_ZERO;}
}void ws281x_red(uint8_t led_num)
{uint16_t num_data;num_data = WS_RESET + led_num*GRB_LEN;for(uint8_t i=0; i<led_num; i++)ws281x_set_color(i, 0xFF, 0x00, 0x00);HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pixel_buffer, num_data);
}void ws281x_green(uint8_t led_num)
{uint16_t num_data;num_data = WS_RESET + led_num*GRB_LEN;for(uint8_t i=0; i<led_num; i++)ws281x_set_color(i, 0x00, 0xFF, 0x00);HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pixel_buffer, num_data);
}void ws281x_blue(uint8_t led_num)
{uint16_t num_data;num_data = WS_RESET + led_num*GRB_LEN;for(uint8_t i=0; i<led_num; i++)ws281x_set_color(i, 0x00, 0x00, 0xFF);HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, (uint32_t *)pixel_buffer, num_data);
}void ws281x_close(void)
{for(uint8_t i=0; i<LED_NUM; i++){ws281x_set_color(i, 0x00, 0x00, 0x00);}ws281x_show();
}

测试代码:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_TIM5_Init();/* USER CODE BEGIN 2 */HAL_Delay(1000);//HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);ws281x_init(4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){ws281x_green(4);HAL_Delay(1000);ws281x_red(4);HAL_Delay(1000);ws281x_blue(4);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

STM32F405驱动WS2812E灯珠灯带代码相关推荐

  1. STM32使用PWM+DMA方式驱动WS2812灯珠

    一. 关于WS2812 WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果. WS2812B Datasheet 二. WS ...

  2. 利用硬件SPI控制WS2812,驱动1024颗灯珠

    " 简 介: 利用ESP32中的硬件SPI控制WS2812的显示.使用了高频三极管9018 作为输出接口反向器,确定合适的电阻参数,验证了驱动方案的硬件和软件的可行性. 关键词: WS281 ...

  3. WS2812灯珠(三)-- STM32 PWM+DMA方式驱动

    WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 文章目录 WS2812灯珠(三)-- STM32 PWM+DMA方式驱动 一.理论 二.代码实践 一.理论 PWM输出就是对外输出脉宽( ...

  4. WS2812串行可控彩色LED灯珠

    简 介: 利用ESP32中的硬件SPI控制WS2812的显示.使用了高频三极管9018 作为输出接口反向器,确定合适的电阻参数,验证了驱动方案的硬件和软件的可行性. 关键词: WS2812,ESP32 ...

  5. STC15点亮WS2812灯珠(C结合汇编)

    WS2812自带5050灯珠,只需要一个IO口就能够驱动LED灯带,十分方便.但是,由于需要800K的PWM信号,对大部分单片机来说,压力非常大,通常单片机的硬件PWM只支持到100K左右. 好不容易 ...

  6. 灯珠电路图_LED灯盘的实际电路到底长啥样,LDE灯珠又怎样检测?

    上期说到了我家灯盘LED灯珠的驱动芯片,这期我们就看看我家LED灯盘的电路到底长啥样,在说灯盘电路之前先看看我家的灯盘主要有哪些器件,请看下图: 图1 LED灯盘器件 在知道了灯盘的主要结构以及结合上 ...

  7. (一)幻彩灯珠-SK6812

    文章目录 一.简介 二.SK6812特性 三.详细设计 3.1. 硬件设计 3.2. 固件设计 3.2.1 时序分析 3.2.2 数据结构分析 3.2.3 源码 一.简介 幻彩灯珠其内置IC,可显示2 ...

  8. stm32【RGB_LED_WS2812灯珠】

    RGB_LED 内置驱动IC:WS2812 测试平台:stm32f103c8t6 库版本:官方标准库3.5.0版本 LED规格:RGB-5050 内置IC:ws2812 驱动方式:归零码 相比普通的L ...

  9. STM32驱动全彩LED灯模块WS2812

    STM32驱动全彩LED灯模块WS2812 WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示. 级联电路 WS2811(未 ...

最新文章

  1. C#设计模式——适配器模式(Adapter Pattern)
  2. 使用pip安装python库的几种方式,解决pip安装python库慢的问题
  3. 统一沟通-技巧-13-Lync-Polycom RMX 1500-配置
  4. 计算机房消防知识培训,通信机房消防知识培训课件.ppt
  5. layui时间日期控件使用
  6. 知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  7. 用户自定义变量、系统变量、环境变量
  8. 酒吧、ktv、夜店收银系统分析
  9. 学习笔记-OS - Exploits
  10. win10录屏_关于使用Win10自带录屏工具小技巧
  11. 秋招之8.31农行研发中心笔试
  12. html怎么设置图片循环播放,gif循环播放怎么设置 怎样让gif图片一直循环播放 gif循环播放...
  13. JPA中id前面有空格导致的Column 'id' not found问题
  14. PS|如何将Adobe Photoshop(PS)完全卸载
  15. 自然语言处理文本分析_通过自然语言处理释放文本分析的力量
  16. 产品的概念:提出与筛选--第三章人人都是产品经理
  17. Failed to introspect Class [com.mchange.v2.c3p0.ComboPooledDataSource] from ClassLoader [ParallelWeb
  18. javascript实现QR code二维码扫描
  19. 985助理教授与二本教授哪个水平高?
  20. c 之父 java is not_Java之父评价C语言之父:我用尽了形容词

热门文章

  1. 申宝市场放量了10%还是很强势
  2. macbook上好用的解压软件_苹果电脑有什么好用的解压软件?推荐 Mac OSX 下最方便实用的六款解压缩软件...
  3. 面试指导——剑指offer
  4. 光盘显示0字节可用_HT光盘刻录管理系统~一套光盘智能管理的系统解决方案
  5. 将下列计算机中文翻译成英文,急...将计算机类英文翻译成中文
  6. proteus教程——并行扩展静态RAM
  7. DM DISQL使用
  8. JS 下载文件方法分享(解决图片文件无法直接下载和 IE兼容问题)
  9. web自动化三大浏览器驱动包之谷歌,火狐,IE
  10. 位置偏差在马蜂窝推荐排序中的实践