#embedded-graphics #display #epaper #epd #gde021a1

no-std epd-gde021a1

基于 embedded-hal 的 ePaper 显示驱动程序,芯片:GDE021A1(172x72 灰度通过 SPI)

4 个版本

0.2.1 2020 年 6 月 25 日
0.2.0 2020 年 6 月 25 日
0.1.2 2020 年 6 月 14 日
0.1.1 2020 年 6 月 14 日

#1830 in 嵌入式开发

自定义许可

29KB
386

Build Status

此库包含 GDE021A1 控制器 E-Paper 模块的驱动程序(172x72 灰度像素通过 SPI)。

它使用 embedded graphics 库作为可选的图形支持。

需要 2018 版本的兼容版本(Rust 1.31+)。

资源需求

  • GED021A1 ePaper 显示器是黑白(每个像素4个灰度级别)
  • 每个像素值由2位编码。
  • 在刷新 ePaper 显示器之前,所有数据都写入 RAM。强制需要一个 3096 字节的 RAM 缓存存储(2位/172x72像素)。
  • 除了 RAM 之外,还需要典型的 SPI 外设(时钟、CLK引脚、MOSI引脚)和额外的任意GPIO引脚(数据/命令、忙、复位)。

用法

例如,初始化序列如下(在Cortex MCU上,使用嵌入式 hal包)

在例如.cargo/config文件中设置默认编译目标为

[build]
target = "thumbv6m-none-eabi"    # Cortex-M0 and Cortex-M0+

以支持 Cortex-M0。


    let dp = pac::Peripherals::take().unwrap();
    let cp = cortex_m::Peripherals::take().unwrap();

    // Configure the clock.
    let mut rcc = dp.RCC.freeze(Config::hsi16());

    // Acquire the GPIOx peripheral.
    // This also enables the clock for GPIOx in the RCC register.
    let gpioa = dp.GPIOA.split(&mut rcc);
    let gpiob = dp.GPIOB.split(&mut rcc);

    // The GPIO's
    let chip_sel = gpioa.pa15.into_push_pull_output();
    let data_cmd = gpiob.pb11.into_push_pull_output();
    let reset = gpiob.pb2.into_push_pull_output();
    let busy = gpiob.pb8.into_pull_up_input();

    // The SPI
    let mosi = gpiob.pb5;
    let clk = gpiob.pb3;
    let spi = dp.SPI1.spi((clk, NoMiso, mosi), MODE_0, 1_000_000.hz(), &mut rcc);

    // the time delay
    let mut delay = cp.SYST.delay(rcc.clocks);

    // and finally the display structure
    let mut disp =  GDE021A1::new(spi, reset, Some(chip_sel), data_cmd, busy);
    // initialize the display
    disp.init(&mut delay).expect("could not init display");

一旦显示器初始化,就可以使用嵌入式图形库,例如

    // all pixels turn white
    disp.clear();

    // draw some fancy stuff and graphics via embedded graphics api
    let elem =  Circle::new(Point::new(140, 36), 25)
         .into_styled(PrimitiveStyle::with_fill(BinaryColor::On));
    elem.draw(&mut disp);
    let elem = Text::new("Hello Rust!", Point::new(1, 8))
        .into_styled(TextStyle::new(Font6x8, BinaryColor::On));
    elem.draw(&mut disp);

    // refresh the epaper
    disp.refresh(&mut delay).expect("could not flush display");

测试

嵌入式目标可能与主机非常不同,并在您的.cargo/config文件中预先配置。但是,测试(特别是在主机上运行的 CI 环境中)

因此,可以通过指定您的目标来安全地运行测试

cargo test --target=x86_64-unknown-linux-gnu

接口

接口 描述
DIN SPI MOSI
CLK SPI SCK
CS SPI 芯片选择(低有效)- 可选
DC 数据/命令控制引脚(高为数据,低为命令)
RST 外部复位引脚(低为复位)
BUSY 忙状态输出引脚(低为忙)

致谢

依赖关系

~2–2.8MB
~55K SLoC