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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM