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 # 显示驱动封装
关键点说明
- 硬件接口实现:需要根据实际硬件平台实现SPI和GPIO接口
- 显示控制器选择:根据实际LCD屏幕选择正确的控制器类型
- 内存管理:帧缓冲区模式需要更多内存,但性能更好
- 错误处理:所有操作都可能失败,需要适当处理错误
进阶使用
对于需要更高性能的场景,可以考虑:
- 使用DMA传输数据
- 实现双缓冲机制
- 优化绘图算法减少重绘区域
总结
mipidsi库为Rust嵌入式开发提供了强大的显示控制能力,通过合理组织代码和选择适当的操作模式,可以构建高效可靠的嵌入式图形应用程序。