ws2812-pwm-dma

Crates.iows2812-pwm-dma
lib.rsws2812-pwm-dma
version0.1.1
sourcesrc
created_at2023-05-06 14:31:30.87168
updated_at2023-05-20 13:05:19.876947
descriptionPwm and Dma based Ws2812 led driver
homepage
repositoryhttps://github.com/royAmmerschuber/ws2812-pwm-dma
max_upload_size
id858518
size30,751
(royAmmerschuber)

documentation

README

For usage with the smart-leds crate.

An stm32f4xx-hal driver for ws2812 leds using a pwm timer and dma streaming.

It uses a buffer to store the signal & transmits it automatically in the background over dma.

Why

Compared to packages like ws2812-spi this implementation requires less timing constraints and has no problems with being interrupted by interrupts.

Why not

a big problem of the current implementation is storage requirements. this needs 48 or 96 bytes per LED (depending on the timers ARR size).

the code is also not very portable since there is no general abstraction over DMA transfers. therefore currently only the stm32f4xx-hal is supported.

Example

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)));
Commit count: 10

cargo fmt