#ws2812 #led-driver #dma #smart-leds #pwm #timer #u16

no-std ws2812-pwm-dma

基于PWM和DMA的Ws2812 LED驱动程序

2个版本

0.1.1 2023年5月20日
0.1.0 2023年5月6日

#10 in #smart-leds

MIT/Apache

19KB
289

用于与smart-leds crate配合使用。

stm32f4xx-hal的Ws2812 LED驱动程序,使用PWM定时器和DMA流。

它使用缓冲区来存储信号并在后台自动通过DMA传输。

为什么

与ws2812-spi等包相比,此实现对时序约束要求较低,且不会因中断而中断。

为什么不

当前实现的一个大问题是存储需求。这需要每个LED 48或96字节(取决于定时器ARR的大小)。

代码也不太便携,因为没有对DMA传输进行通用抽象。因此,目前仅支持stm32f4xx-hal。

示例

let led_buf={
    static mut led_buf:[u16;24*LED_COUNT+8]=[0;24*LED_COUNT+8];
    unsafe{&mut led_buf};
}

let gpiob=dp.GPIOB.split();
let dma1=dp.DMA1.split();

let ws_pin=gpiob.pb5.into_alternate();

// uses stream channel 5 and Timer channel 2
let mut ws=Ws2812Pwm::new(dp.TIM3,ws_pin,dma1.5,led_buf,&clocks);

ws.write((0..=LED_COUNT).map(|_|RGB8::new(255,255,255)));

依赖项

~54MB
~1.5M SLoC