STM32 G431RB 实现灯带WS2812的跑马灯,流水灯,呼吸灯特效
在前面的文章中实现了使用Circular模式控制WS2812灯带,利用Freertos的Task的管理实现了跑马灯,流水灯和呼吸灯的灯效。
代码提交到Github上了。 https://github.com/magicduan/demo_pwm_dma_circular
在实现中碰到一个较大的麻烦,灯带上有168颗灯,利用Circular模式后内存是降下来了,但是由于频繁的产生DMA中断,导致其他Task被Block了。
最后的解决方法是调低DMA中断的优先级从5降到6,同时增加DMA Buffer的大小减少DMA中断的发生。
代码中通过四个函数可以控制灯效的切换。
-
int pwm_led_effect_set(uint32_t dma_id,uint8_t effection, uint32_t eff_interval,uint8_t grp_leds, uint32_t led_color );
这函数用来设置特效的类型。
-
void pwm_led_effect_start(uint32_t dma_id);
这个函数用来启动特效
-
int pwm_led_effect_stop(uint32_t dma_id,uint8_t b_block,uint32_t timeout);
这个函数用来停止特效
-
void pwm_led_run();
这个函数应该放到Task中的循环中执行,这个函数的目的就是扫描特效数组,检查间隔时间,执行每次DMA的发送