【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕

说在前面

  • esp32版本:s3
  • 运行环境:esp-idf(std)
  • 开发环境:wsl2
  • LCD模块:ST7789V2 240*280 LCD
  • github地址:这里

模块详情

  • 某宙的esp32s3开发板
    在这里插入图片描述

  • 某雪的1.69inch LCD模块,包含杜邦线
    在这里插入图片描述

准备工作

  • 开发环境(std)搭建,见上篇

  • lcd引脚
    在这里插入图片描述

  • esp32引脚
    在这里插入图片描述

  • 引脚连接
    除了几个固定的,其它可以自行选择,这里我的连接如下

    LCDesp32(括号里为上图的序号)esp32 gpio
    VCC3.3V(18)/
    GNDGND(17)/
    DINSPI_MOSI(20)GPIO17
    CLKSPI_CK(19)GPIO18
    CSSPI_CS(23)GPIO14
    DCGPIO15(22)GPIO15
    RSTGPIO16(21)GPIO16
    BLGPIO13(24)GPIO13

开始

  • 如果从空工程开始的话,可以使用code-generate
    cargo generate esp-rs/esp-idf-template cargo
    
  • 添加依赖
    [features]
    default = ["std", "embassy", "esp-idf-svc/native"]
    
    pio = ["esp-idf-svc/pio"]
    std = ["alloc", "esp-idf-svc/binstart", "esp-idf-svc/std"]
    alloc = ["esp-idf-svc/alloc"]
    nightly = ["esp-idf-svc/nightly"]
    experimental = ["esp-idf-svc/experimental"]
    embassy = ["esp-idf-svc/embassy-sync", "esp-idf-svc/critical-section", "esp-idf-svc/embassy-time-driver"]
    
    
    [dependencies]
    anyhow = {version = "1", features = ["backtrace"]}
    log = { version = "0.4", default-features = false }
    esp-idf-svc = { version = "0.47.1", default-features = false }
    embedded-graphics = "0.8.1"
    display-interface-spi = "0.4"
    mipidsi = "0.7.1"
    
    [build-dependencies]
    embuild = "0.31.3"
    
    [package.metadata.esp-idf-sys]
    esp_idf_tools_install_dir = "global"
    
  • 代码(逻辑基本和树莓派一致)
    use display_interface_spi::SPIInterfaceNoCS;
    use embedded_graphics::{mono_font::{MonoTextStyle, ascii::FONT_10X20}, pixelcolor::Rgb565, text::Text, prelude::*, Drawable};
    use esp_idf_svc::hal::{spi, gpio, prelude::*};
    use anyhow::Result;
    
    fn main() -> Result<()> {
        // It is necessary to call this function once. Otherwise some patches to the runtime
        // implemented by esp-idf-sys might not link properly. See https://github.com/esp-rs/esp-idf-template/issues/71
        esp_idf_svc::sys::link_patches();
    
        // Bind the log crate to the ESP Logging facilities
        esp_idf_svc::log::EspLogger::initialize_default();
    
        let peripherals = Peripherals::take().unwrap();
        let pins = peripherals.pins;
    
        test_lcd(
            peripherals.spi2,
            pins.gpio13.into(),
            pins.gpio15.into(),
            pins.gpio16.into(),
            pins.gpio18.into(),
            pins.gpio17.into(),
            pins.gpio14.into(),
        )?;
    
        Ok(())
    }
    
    fn test_lcd(
        spi: spi::SPI2,
        backlight: gpio::AnyOutputPin,
        dc: gpio::AnyOutputPin,
        rst: gpio::AnyOutputPin,
        sclk: gpio::AnyOutputPin,
        sdo: gpio::AnyOutputPin,
        cs: gpio::AnyOutputPin,
    ) -> Result<()> {
        let driver = spi::SpiDeviceDriver::new_single(
            spi,
            sclk,
            sdo,
            Option::<gpio::AnyIOPin>::None,
            Some(cs),
            &spi::SpiDriverConfig::new().dma(spi::Dma::Disabled),
            &spi::SpiConfig::new()
                .baudrate(20_000_000.into())
                .data_mode(esp_idf_svc::hal::spi::config::MODE_0),
        )?;
    
        let dc = gpio::PinDriver::output(dc)?;
        let rst = gpio::PinDriver::output(rst)?;
        let mut backlight = gpio::PinDriver::output(backlight)?;
    
        let di = SPIInterfaceNoCS::new(driver, dc);
    
        let mut delay = esp_idf_svc::hal::delay::Ets;
        let mut display = mipidsi::Builder::st7789(di)
            .with_display_size(240, 280)
            .with_orientation(mipidsi::Orientation::Landscape(true))
            .init(&mut delay, Some(rst))
            .unwrap();
    
        // Text
        let text = "Hello World ^_^;";
        let text_x = 120;
        let text_y = 280 / 2;
        let text_style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);
    
        // Alternating color
        let colors = [Rgb565::RED, Rgb565::GREEN, Rgb565::BLUE];
    
        // Clear the display initially
        display.clear(colors[0]).unwrap();
    
        // Turn on backlight
        let _ = backlight.set_high();
    
        // Draw text
        Text::new(text, Point::new(text_x, text_y), text_style)
            .draw(&mut display)
            .unwrap();
        println!("Draw Hello from Rust!");
    
        Ok(())
    }
    

编译

  • 编译如果不通过,可以参考环境搭建
    cargo build --target xtensa-esp32s3-espidf
    

烧录

  • wsl访问usb设备见环境搭建
    espflash flash target/xtensa-esp32s3-espidf/debug/rs-esp32s3-st7789-demo
    

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值