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

文章目录

  • 说在前面
  • 模块详情
  • 准备工作
  • 开始
  • 编译
  • 烧录
  • 结果

说在前面

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

模块详情

  • 某宙的esp32s3开发板
    【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕_第1张图片

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

准备工作

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

  • lcd引脚
    【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕_第2张图片

  • esp32引脚
    【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕_第3张图片

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

    LCD esp32(括号里为上图的序号) esp32 gpio
    VCC 3.3V(18) /
    GND GND(17) /
    DIN SPI_MOSI(20) GPIO17
    CLK SPI_CK(19) GPIO18
    CS SPI_CS(23) GPIO14
    DC GPIO15(22) GPIO15
    RST GPIO16(21) GPIO16
    BL GPIO13(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
    

结果

【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕_第4张图片

你可能感兴趣的:(Rust,单片机,rust,开发语言,esp32s3,std,esp-idf,st7789,lcd)