在前面的文章中實現了使用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的發送