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的发送

posted @ 2022-01-24 15:17  magicduan  阅读(1940)  评论(0编辑  收藏  举报