2个版本
0.1.1 | 2023年5月20日 |
---|---|
0.1.0 | 2023年5月6日 |
#10 in #smart-leds
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