使用CubeMX配置TIM+DMA的方式驱动WS2812

一、CubeMX配置

1、配置时钟 、配置STLINK下载方式 

 

 

 

2、配置定时器,设置DMA

 

 

 二、驱动WS2812

生成工程后,要添加驱动代码,主要就是把WS2812各个灯珠的颜色准备好,然后开启DMA,等传输完毕之后停止DMA.

#define WS2812_NUM	10
#define FRAME_BYTES 24*WS2812_NUM+4

//传输一次WS2812灯带数据格式
typedef struct{
	uint16_t head[3];				//reset
	uint16_t GRB[24*WS2812_NUM];
	uint16_t tail;					//传输完后为低电平
}ws2812_frame_def;

ws2812_frame_def ws2812_frame = {
	.head[0] = 0,
	.head[1] = 0,
	.head[2] = 0,
	.tail = 0
};


#define BIT0	28u
#define BIT1	61u

//颜色缓存
uint8_t G = 255;
uint8_t R = 0;
uint8_t B = 0;

//转换数据,传输WS2812灯带,开启一次传输
void WS2812_Control()
{
	uint16_t i,j;	
	for(i=0;i<WS2812_NUM;i++){
		for(j=0;j<8;j++){
			ws2812_frame.GRB[i*24+j]	=(G&(0x80>>j))?BIT1:BIT0;
			ws2812_frame.GRB[i*24+8+j]	=(R&(0x80>>j))?BIT1:BIT0;
			ws2812_frame.GRB[i*24+16+j]	=(B&(0x80>>j))?BIT1:BIT0;
		}
	}
	//函数要求为32位无符号指针,但实际传输时,因为之前定义的为half word,所以还是16bit传输
	HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_2, (uint32_t *)&ws2812_frame,FRAME_BYTES);

}

//PWM的DMA完成中断回调函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	HAL_TIM_PWM_Stop_DMA(&htim2,TIM_CHANNEL_2);
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_TIM2_Init();

    HAL_Delay(1000);
    WS2812_Control();
  
    while (1){

    }

}

WS2812B简介: 新一代的RGB5050将控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 ● 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。 ● 内置上电复位和掉电复位电路。 ● 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。 ● 串行级联接口,能通过一根信号线完成数据的接收与解码。 ● 任意两点传传输距离在不超过5米时无需增加任何电路。 ● 当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式不小于1024点。 ● 数据发送速度可达800Kbps。 ● 光的颜色高度一致,性价比高。 基于STM32驱动WS2812B设计案例概述: 使用了STM32L011D4P6设计了最小系统板,电源部分前级采用TI高效率开关电源芯片TPS563200将12V转换为5V,再由低压差LDO AMS1117-3.3转换为3.3V给单片机供电,STM32使用了PWM来模拟24bit数字信号,驱动WS2812B,达到LED颜色,亮度可控的目的。详细介绍及程序文件详见附件内容。 工程采用CubeMX生成,使用的是ST最新的HAL库,需要使用keil5及以上版本打开,CubeMX版本需要16.0及以上,下载地址:https://www.st.com/content/st_com ... -long-promo_feb2014; 安利下个人空间:https://club.gizwits.com/home.php?mod=space&uid=7261 优酷视频:https://player.youku.com/player.php/sid/XMTc0ODA0NDYwMA==/v.swf 三点说明: WS2812B为5V供电,5V逻辑器件,因此需要电平转换IC; RGB5050 最大60mA电流,单色时为20mA.因此应根据灯珠的多少设计合适的电源; 本设计采用TI开关电源芯片TPS563200,最大3A电流输出能力。 STM32驱动WS2812B电路板截图:
使用 DMA 和定时器 (TIM) 驱动 WS2812 LED 灯带,你可以按照以下步骤进行配置: 1. 配置 GPIO:选择一个合适的 GPIO 引脚,用于连接 WS2812 灯带的数据引脚。在 STM32CubeMX 或者手动设置寄存器的方式下,将该引脚配置为推挽输出模式。 2. 配置 DMA配置 DMA 以实现数据的传输。选择一个合适的 DMA 通道,并将其配置为从内存到外设的传输方向。设置传输数据的大小为 8 位。 3. 配置定时器 (TIM):选择一个合适的定时器,并将其配置为 PWM 模式。将定时器的周期设置为 WS2812 的周期,通常为 1.25us。配置比较匹配单元 (CCU) 以产生适当的高电平和低电平时间。 4. 编写发送函数:编写一个函数,用于生成并发送数据到 WS2812 灯带。使用 DMA 将生成的数据传输到 GPIO 输出寄存器。 在发送函数中,你可以使用 TIM 的比较匹配中断来触发 DMA 传输。每次比较匹配中断时,将下一个像素的数据加载到 DMA 的内存中,并启动传输。在 DMA 完成传输后,可以在 DMA 完成中断中关闭 TIM,以确保传输完成。 这种方法可以减少 CPU 的负载,因为数据传输和定时信号的生成都由 DMATIM 完成。同时,确保根据 WS2812 的协议要求设置适当的延时。 请注意,以上步骤仅提供了一个大致的思路,具体的实现细节可能因硬件配置和需求而有所不同。建议参考 STM32F103ZET6 的参考手册和相应的库文档,以获取更详细的配置和代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值