STM32CUBEMX使用PWM+DMA驱动WS2812

2023-05-16

STM32CUBEMX使用PWM+DMA驱动WS2812

  1. 首先在stm32cubemx中设置pwm和dma。我设置了TIM1的CH1为PWM引脚
  2. 编写DMA响应函数,即PWM DMA完成数据发送后的回调函数
// PWM DMA 完成回调函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	HAL_TIM_PWM_Stop_DMA(&htim1, TIM_CHANNEL_1);
}

  1. 编写DMA载入数据的代码,运行后将会把数组(内存)中的数据写入到WS2812中。要更新WS2812的数据,只需要更改数组的内容即可。在此处LED_N为led数量
uint16_t led_buffer[LED_N*24 + 50];		// 最后50为reset信号,全设置为0
extern TIM_HandleTypeDef htim1;
// 启动DMA载入数据
void WS_Load(void)
{
	HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)led_buffer, LED_N*24+50);
}
  1. 编写一些改变数组数据的函数,例如全红,全蓝之类的。
/ 关闭所有LED灯
void WS_Clear(void)
{
	uint16_t i;
	
	for(i=0; i<LED_N*24; i++)
		led_buffer[i] = LED_0;			// 写入逻辑0的占空比
	
	for(; i<LED_N*24+50; i++)
		led_buffer[i] = 0;					// 占空比比为0,全为低电平
	
	WS_Load();
}

// 全部led灯设置成一样的亮度,其中RGB分别设置亮度
// WS2812的写入顺序是GRB,高位在前面
void WS_Write_RGB(uint8_t n_R, uint8_t n_G, uint8_t n_B)
{
	uint16_t i, j;
	uint8_t dat[24];
	
	// 将RGB数据进行转换
	for(i=0; i<8; i++)
	{
		if((n_G&0x80) == 0)
			dat[i] = LED_0;
		else
			dat[i] = LED_1;
		n_G <<= 1;
	}
	for(i=0; i<8; i++)
	{
		if((n_R&0x80) == 0)
			dat[i+8] = LED_0;
		else
			dat[i+8] = LED_1;
		n_R <<= 1;
	}
	for(i=0; i<8; i++)
	{
		if((n_B&0x80) == 0)
			dat[i+16] = LED_0;
		else
			dat[i+16] = LED_1;
		n_B <<= 1;
	}
	
	for(i=0; i<LED_N; i++)
	{
		for(j=0; j<24; j++)
		{
			led_buffer[i*24 + j] = dat[j];
		}
	}
	
	for(i=LED_N*24; i<LED_N*24+50; i++)
	{
		led_buffer[i] = 0;					// 占空比比为0,全为低电平
	}
	
	WS_Load();
}

// 单独打开所有的LED R,亮度为n
void WS_Write_R(uint8_t n_R)
{
	WS_Write_RGB(n_R, 0, 0);
}

void WS_Write_G(uint8_t n_G)
{
	WS_Write_RGB(0, n_G, 0);
}

void WS_Write_B(uint8_t n_B)
{
	WS_Write_RGB(0, 0, n_B);
}
  1. 在main.c中调用这些函数即可。可以将改变WS2812数组的代码放入到定时器中,以固定的频率进行亮度和颜色改变

最后,WS2812的工作电压最好超过3.5V,当使用3.3V电压时,亮度和颜色已经不准确(正)了,在5V的时候亮度很正

使用PWM+DMA的可以使STM32不必一直处理这个,只需改变数组内容即可。同时时序控制也非常方便

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CUBEMX使用PWM+DMA驱动WS2812 的相关文章

  • rk3399下pwm驱动

    现在记录一下rk3399下pwm的驱动编写 xff0c 下面是内核pwm的API xff0c 从开源论坛复制 xff08 firefly的开源论坛里面的Wiki教程 xff09 1 在要使用 PWM 控制的设备驱动文件中包含以下头文件 xf
  • stm32HAL库 串口接收不定长数据(DMA传输)

    相信大家很多初学者都会遇到串口接收不定长数据的情况 对于初学者可能看着有点难理解 xff0c 多看几遍就好 xff0c 亲测能用 话不多说上菜上菜 xff01 xff01 xff01 xff01 此代码是本人在具体工程应用 xff0c 实测
  • 学习PS2无线手柄解码通讯手册

    学习 PS2 无线手柄的使用方法 将市场上 PS2 手柄通过解码应用到我们自己产品之中 比如控制智能车 机械臂等等任何涉及无线通信控制的一些diy场景 本次主要让大家了解 PS2 无线手柄的工作原理 以及掌握 PS2 无线手柄的使用并最终通
  • FreeRTOS例程4-串口DMA收发不定长数据

    FreeRTOS例程4 串口DMA收发不定长数据 知乎 zhihu com
  • 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的 所以作者若是看到不允许转载 请给我留言或给我邮件 lushiliangcsdn 163 com 我会立即删除 转载原因 这篇文章把pid 算法解释的很详细 我担心以后这篇文章无故删除 才转载到我这边的 谢谢 转载来源于
  • STM32 进阶教程 15 - 串口DMA收发

    前言 串口操作相信大家一定很熟悉 如果你已经会串口的收发数据 并可以灵活使用轮询及中断方式对串口进行数据收发 那么恭喜你 学完本节内容后 也将可以学会串口的更高级操作方式 DMA方式 DMA操作串口可以大大减轻MCU的负担 同时也可以加快数
  • STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

    参考 stm32定时器与定时器中断 作者 打酱油的 发布时间 2021 04 11 01 04 09 网址 https blog csdn net weixin 46098612 article details 115493737 参考 s
  • STM32CubeMX学习一 之GPIO配置

    文章目录 前言 一 本地环境 二 开始 1 工程创建 2 GPIO配置 2 时钟配置 3 代码生成 3 编译工程 前言 记录一下STM32CubeMX的学习笔记 同时分享给初学的小白 希望一起进步 一 本地环境 编译环境 KEIL 代码生成
  • RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (二、无线温湿度传感器 之 CubeMX配置)

    应用篇 在STM32L051上使用RT Thread 第二篇 使用STM32CubeMX 进行对应外设配置 同时做一些简单测试 目录 前言 一 使用 STM32CubeMX 配置 1 1 基础步骤 1 2 修改配置 1 3 踩坑记录 二 初
  • STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中 对于直流电机来说 编码器至关重要 它不仅可以使我们对电极进行精确的速度闭环 位置闭环 还可以通过时间积分 根据运动学关系 获得速度 位置等信息 STM32的定时器有编码器模式 大大的方便我们的开发 使用STM32cubeM
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • stm32Cubemx实用篇(一):PWM控制SG90舵机

    stm32Cubemx 一 PWM控制SG90舵机 本章将介绍使用stm32Cubemx软件配置PWM来控制SG90舵机角度 硬件平台 Stm32H743IIT6 舵机 SG90 0 180 旋转范围 网购5元一个 软件 Stmcubemx
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • STM32发送单极性归零码驱动WS2812(二)

    STM32发送单极性归零码驱动WS2812 二 形容我的心情 二 旧事 重提 时间匆匆过去 也到了该着手准备毕业设计的阶段了 我早早就向老师确定了选题 我想做一个智能灯光控制系统 在灯光选型的问题上 我又想到了几个月前令我头疼好长时间的WS
  • warning: #940-D: missing return statement at end of non-void function “fgetc“解决方案

    问题描述 warning 940 D missing return statement at end of non void function fgetc 解决方案 解决措施 引入头文件stdio h
  • STM32CubeMX学习六 之ADC配置

    文章目录 前言 一 本地环境 二 开始 1 定时器配置 2 引脚配置 在这里插入图片描述 https img blog csdnimg cn e5b6f155a1b8468cb15046a0a9d031cd png 3 内部时钟配置 4 A
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 为什么在 Linux 中使用 kmalloc 和 GFP_DMA 时会得到高地址?

    我正在 Linux 中为 DMA 设备编写设备驱动程序 在Linux 设备驱动程序 第 15 章 http lwn net images pdf LDD3 ch15 pdf 它说 对于有这种限制的设备 应该分配内存 通过将 GFP DMA

随机推荐