STM32CUBEMX使用PWM+DMA驱动WS2812

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
  1. 在main.c中调用这些函数即可。可以将改变WS2812数组的代码放入到定时器中,以固定的频率进行亮度和颜色改变

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

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

你可能感兴趣的:(STM32CUBEMX使用PWM+DMA驱动WS2812)