#imxrt1062 #devices #rt #ws2812 #600m-hz #customizeable #bitbanger

nightly ws2812-nop-imxrt1062

基于 Nop 的 600MHz (可定制) IMXRT1062 设备的位打爆器

3 个不稳定版本

0.2.0 2022年6月26日
0.1.1 2022年4月6日
0.1.0 2022年4月6日

#5 in #rt

MIT 许可证

9KB
77 行代码,不包括注释

在 imxrt1062 板上使用 ws2812 灯

  • 适用于 smart-leds
  • 实现了 SmartLedsWrite 特性

警告

WS2812s 在 5v 下运行。IMXRT1062 引脚在 3v 下运行,并且不耐受 5v。您需要一个逻辑电平转换器,并且布线时需要小心。

为什么?

因为我显然太笨了,无法使用 ws2812-timer-delay 让周期性定时器工作。

如何?

此库使用汇编中的简单 nop 循环来等待。

WS2812s 每周期大约 333ns 长读取输入。每 LED 写入 3 个字节 (GRB | 绿色,红色,蓝色),然后“锁存”(设为低)6us 到 250us,具体取决于您的型号。写入单个位需要三个位消息,其外观为 [1, x, 0],其中 x 是要写入的位。也就是说,要将一个位 1 写入 LED,您必须发送 [1, 1, 0],并在每个位之间等待 333ns。

尽管 WS2812 周期据称约为 333ns,但某些时间约束非常严格,而其他则非常宽松。

了解更多关于 WS2812s 的时间约束

附言。我将锁存硬编码为 6us。如果您需要 250us,请给我发邮件或克隆项目。

使用 teensy4-bsp 的示例


#[cortex_m_rt::entry]
fn main() -> ! {
    ...

    let mut data: [RGB8; 3] = [RGB8::default(); 3];
    let empty: [RGB8; 3] = [RGB8::default(); 3];

    data[0] = RGB8 {
        r: 0x10,
        g: 0x00,
        b: 0x00,
    };
    data[1] = RGB8 {
        r: 0x00,
        g: 0x10,
        b: 0x00,
    };
    data[2] = RGB8 {
        r: 0x00,
        g: 0x00,
        b: 0x10,
    };

    configure(&mut pins.p2,{
        Config::zero()
            .set_drive_strength(DriveStrength::R0_7)
            .set_speed(Speed::Max)
            .set_slew_rate(SlewRate::Fast)
    });
    let pin = GPIO::new(pins.p2).output();

    let mut ws = ws2812_nop_imxrt1062::Ws2812::new(pin, 600.0);

    loop {
        ws.write(data.iter().cloned()).unwrap();
        systick.delay_ms(500);

        ws.write(empty.iter().cloned()).unwrap();
        systick.delay_ms(500);
    }
}

依赖项

~220KB