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的发送
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)