Rust嵌入式显示驱动库mipidsi的使用,支持MIPI DSI接口的LCD屏幕控制与图形渲染

Rust嵌入式显示驱动库mipidsi的使用,支持MIPI DSI接口的LCD屏幕控制与图形渲染

mipidsi是一个通用的显示驱动库,用于连接实现MIPI显示命令集的TFT显示屏。它使用interface::Interface通过传输协议(目前支持SPI和并行GPIO)与硬件通信。

主要特性

  • 支持通过embedded-graphics-core提供绘图API
  • 可选批量绘图功能(通过batch特性启用,默认开启)
  • 支持多种显示模型(GC9107, GC9A01, ILI9341, ILI9342C, ILI9486, ST7735, ST7789, ST7796等)

示例代码

下面是一个使用mipidsi控制ILI9486显示屏的完整示例:

// 添加依赖到Cargo.toml
// mipidsi = "0.9.0"
// embedded-hal = "1.0"

use mipidsi::{Builder, models::ILI9486Rgb666};
use embedded_hal::digital::OutputPin;
use embedded_hal::blocking::delay::DelayMs;
use embedded_hal::spi::SpiDevice;

// 假设我们有以下硬件资源
struct Hardware {
    spi: SpiDevice,      // SPI设备
    dc: OutputPin,       // 数据/命令选择引脚
    rst: OutputPin,      // 复位引脚
    delay: Delay,        // 延时实现
}

fn main() -> Result<(), mipidsi::Error> {
    let hw = initialize_hardware(); // 初始化硬件
    
    // 创建不带CS控制的SPI接口
    let di = SPIInterfaceNoCS::new(hw.spi, hw.dc);
    
    // 创建ILI9486显示驱动(RGB666颜色模式)
    // 使用硬件复位引脚初始化
    let mut display = Builder::new(ILI9486Rgb666, di)
        .reset_pin(hw.rst)
        .init(&mut hw.delay)?;
    
    // 清屏为黑色
    display.clear(Rgb666::BLACK)?;
    
    // 绘制一个红色矩形
    let style = PrimitiveStyle::with_fill(Rgb666::RED);
    Rectangle::new(Point::new(50, 50), Size::new(100, 100))
        .into_styled(style)
        .draw(&mut display)?;
    
    Ok(())
}

完整示例demo

下面是一个更完整的示例,展示了如何使用mipidsi库初始化显示并绘制基本图形:

// Cargo.toml依赖
// [dependencies]
// mipidsi = "0.9.0"
// embedded-hal = "1.0"
// embedded-graphics = "0.7.1"

use embedded_hal::{
    blocking::delay::DelayMs,
    digital::OutputPin,
    spi::SpiDevice,
};
use embedded_graphics::{
    pixelcolor::Rgb666,
    prelude::*,
    primitives::{Circle, Rectangle, Triangle},
    style::PrimitiveStyle,
    text::Text,
    mono_font::{ascii::FONT_6X10, MonoTextStyle},
};
use mipidsi::{Builder, models::ILI9486Rgb666};

// 硬件抽象
struct DisplayHardware {
    spi: impl SpiDevice,          // SPI设备实现
    dc: impl OutputPin,          // 数据/命令选择引脚
    rst: impl OutputPin,         // 复位引脚
    delay: impl DelayMs<u32>,    // 延时实现
}

fn main() -> Result<(), mipidsi::Error> {
    let hw = initialize_display_hardware(); // 初始化硬件
    
    // 创建SPI接口(不带CS控制)
    let di = SPIInterfaceNoCS::new(hw.spi, hw.dc);
    
    // 创建显示驱动(ILI9486, RGB666颜色模式)
    let mut display = Builder::ili9486_rgb666(di)
        .reset_pin(hw.rst)
        .init(&mut hw.delay)?;
    
    // 清屏为白色背景
    display.clear(Rgb666::WHITE)?;
    
    // 创建文本样式
    let text_style = MonoTextStyle::new(&FONT_6X10, Rgb666::BLACK);
    
    // 绘制文本
    Text::new("Hello Rust!", Point::new(10, 20), text_style)
        .draw(&mut display)?;
    
    // 绘制红色矩形
    Rectangle::new(Point::new(50, 50), Size::new(100, 50))
        .into_styled(PrimitiveStyle::with_fill(Rgb666::RED))
        .draw(&mut display)?;
    
    // 绘制蓝色圆形
    Circle::new(Point::new(150, 100), 40)
        .into_styled(PrimitiveStyle::with_fill(Rgb666::BLUE))
        .draw(&mut display)?;
    
    // 绘制绿色三角形
    Triangle::new(
        Point::new(200, 50),
        Point::new(250, 100),
        Point::new(200, 100),
    )
    .into_styled(PrimitiveStyle::with_fill(Rgb666::GREEN))
    .draw(&mut display)?;
    
    Ok(())
}

// 硬件初始化函数(实际实现取决于具体硬件平台)
fn initialize_display_hardware() -> DisplayHardware {
    // 这里需要根据具体硬件平台实现
    unimplemented!()
}

架构说明

  • Display驱动包含主要功能
  • 每个具体的显示模型为它支持的每个颜色格式实现Model trait
  • 模型可以有不同变体,通过Builder结构体处理
  • 使用embedded-graphics-core提供绘图API

支持的显示模型

可以通过Builder::with_model调用或快捷函数(如Builder::st7789)使用支持的显示模型。外部crate可以提供额外的模型。

当前支持的模型包括:

  • GC9107
  • GC9A01
  • ILI9341
  • ILI9342C
  • ILI9486
  • ST7735
  • ST7789
  • ST7796

注意事项

  • 此crate名称有点不幸,因为它适用于使用MIPI显示命令集的显示屏,但目前不支持MIPI显示串行接口(DSI)

最低支持Rust版本(MSRV)

此crate保证在稳定Rust 1.75.0及以上版本编译。它可能能在更旧版本上编译,但在任何新的补丁版本中都可能改变。

许可证

MIT许可证


1 回复

Rust嵌入式显示驱动库mipidsi使用指南

简介

mipidsi是一个Rust实现的嵌入式显示驱动库,专门用于控制通过MIPI DSI接口连接的LCD屏幕。它提供了对多种显示控制器的支持,包括图形渲染功能,适用于嵌入式系统开发。

主要特性

  • 支持多种MIPI DSI显示控制器
  • 提供基本的2D图形绘制功能
  • 支持多种像素格式
  • 与嵌入式生态系统良好集成(embedded-hal)
  • 异步和同步操作支持

完整示例代码

下面是一个完整的mipidsi使用示例,展示了如何初始化显示、绘制基本图形和文本:

use embedded_graphics::{
    mono_font::{ascii::FONT_6X10, MonoTextStyle},
    pixelcolor::Rgb565,
    prelude::*,
    text::Text,
};
use mipidsi::{Builder, Display};
use embedded_hal::digital::v2::OutputPin;

// 假设的硬件接口结构体
struct SpiInterface;
struct GpioPin;

// 实现必要的trait
impl embedded_hal::blocking::spi::Write<u8> for SpiInterface {
    // 实现spi写操作
}

impl OutputPin for GpioPin {
    // 实现GPIO输出操作
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化硬件接口
    let mut spi = SpiInterface;
    let mut rst_pin = GpioPin;
    let mut dc_pin = GpioPin;
    
    // 创建显示接口
    let mut interface = mipidsi::DisplayInterface::new(spi, dc_pin);
    
    // 初始化ST7789显示控制器
    let mut display: Display<_> = Builder::st7789()
        .with_display_size(240, 320)
        .with_orientation(mipidsi::Orientation::Landscape)
        .init(&mut interface, Some(&mut rst_pin))?;
    
    // 1. 清除屏幕为红色
    display.clear(Rgb565::RED)?;
    
    // 2. 绘制绿色矩形
    display.draw_rectangle(50, 50, 100, 100, Rgb565::GREEN)?;
    
    // 3. 绘制黄色对角线
    display.draw_line(0, 0, 239, 319, Rgb565::YELLOW)?;
    
    // 4. 使用embedded-graphics绘制文本
    let style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE);
    Text::new("Hello mipidsi!", Point::new(30, 40), style)
        .draw(&mut display)?;
    
    // 5. 使用帧缓冲区模式
    let mut buffer = vec![0u8; display.width() as usize * display.height() as usize * 2];
    let mut fb = display.with_frame_buffer(&mut buffer);
    
    // 在帧缓冲区上绘制蓝色圆形
    fb.clear(Rgb565::BLACK)?;
    fb.draw_circle(120, 160, 50, Rgb565::BLUE)?;
    
    // 刷新到屏幕
    fb.flush()?;
    
    Ok(())
}

项目结构说明

对于实际项目,建议采用模块化组织代码:

display_app/
├── Cargo.toml
└── src/
    ├── main.rs         # 主程序入口
    └── display/        # 显示相关模块
        ├── mod.rs      # 模块声明
        └── driver.rs   # 显示驱动封装

关键点说明

  1. 硬件接口实现:需要根据实际硬件平台实现SPI和GPIO接口
  2. 显示控制器选择:根据实际LCD屏幕选择正确的控制器类型
  3. 内存管理:帧缓冲区模式需要更多内存,但性能更好
  4. 错误处理:所有操作都可能失败,需要适当处理错误

进阶使用

对于需要更高性能的场景,可以考虑:

  1. 使用DMA传输数据
  2. 实现双缓冲机制
  3. 优化绘图算法减少重绘区域

总结

mipidsi库为Rust嵌入式开发提供了强大的显示控制能力,通过合理组织代码和选择适当的操作模式,可以构建高效可靠的嵌入式图形应用程序。

回到顶部