【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引脚

-
引脚连接
除了几个固定的,其它可以自行选择,这里我的连接如下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-generatecargo 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/71esp_idf_svc::sys::link_patches();// Bind the log crate to the ESP Logging facilitiesesp_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();// Textlet text = "Hello World ^_^;";let text_x = 120;let text_y = 280 / 2;let text_style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);// Alternating colorlet colors = [Rgb565::RED, Rgb565::GREEN, Rgb565::BLUE];// Clear the display initiallydisplay.clear(colors[0]).unwrap();// Turn on backlightlet _ = backlight.set_high();// Draw textText::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屏幕
文章目录 说在前面模块详情准备工作开始编译烧录结果 说在前面 esp32版本:s3运行环境:esp-idf(std)开发环境:wsl2LCD模块:ST7789V2 240*280 LCDgithub地址:这里 模块详情 某宙的esp32s3开发板 某雪的1.69inch LCD模块…...
YOLOv8如何添加注意力模块?
分为两种:有参注意力和无参注意力。 eg: 有参: import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // self.groups > 0self.softmax …...
用LibreOffice在excel中画折线图
数据表格如下。假设想以x列为横坐标,y1和y2列分别为纵坐标画折线图。 选择插入-》图表: 选择折线图-》点和线,然后点击“下一步”: 选择:列中包含数据序列,然后点击完成(因为图挡住了数据…...
RabbitMQ 链接管理-发布者-消费者
RabbitMQ连接管理器 using RabbitMQ.Client; using System; public class RabbitMQConnectionManager { private readonly IConnectionFactory _connectionFactory; private IConnection _connection; public RabbitMQConnectionManager(string hostName) { …...
JAVA中的垃圾回收器(3)----ZGC
一)ZGC介绍:是JAVA11新引入的低延迟垃圾收集器 ZGC是一款基于Regin的,暂时没有分代概念的,使用了读屏障,颜色指针等技术来实现并发的标记清除和标记整理算法,一低延迟为主要目标的一款垃圾回收器 ZGC的regin可以分为是下图中具有大…...
IDEA 如何运行 SpringBoot 项目
步骤一:配置 Maven 第一步:用 IDEA 打开项目,准备配置 maven 环境 ,当然如果本地没有提前配置好 maven,就用 IDEA 默认的配置即可 配置 maven 步骤 情况 1:如果本地没有配置过 maven,可以保持如…...
Linux MeterSphere测试平台远程访问你不会?来试试这篇文章
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…...
15.k8s集群防火墙配置
防火墙配置 ######################## # master节点防火墙设置 ######################### 所有master节点开放相关防火墙端口 $ firewall-cmd --zonepublic --add-port6443/tcp --permanent $ firewall-cmd --zonepublic --add-port2379-2380/tcp --permanent $ firewall-cmd…...
Python beautifulsoup网络抓取和解析cnblog首页帖子数据
视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 我们抓取下https://www.cnblogs.com/ 首页所有的帖子信息,包括帖子标题,帖子地址,以及帖子作者信息。 首先用requests获取网页文件࿰…...
Java集成腾讯云OCR身份证识别接口
一、背景 项目用到身份证识别获取人员信息的功能,于是想到了腾讯云提供这样的API。在整合代码过程都很顺利,利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题,通过Nginx代理后的环境无法访问到目标腾讯云接口,…...
C++之C++11引入enum class与传统enum关键字总结(二百五十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
如何将word格式的文档转换成markdown格式的文档
如何将word格式的文档转换成markdown格式的文档 前言 A. 介绍Markdown和Word格式文档 什么是Markdown? Markdown是一种轻量级标记语言,旨在简化文本格式化和排版的过程。它以纯文本形式编写,通过使用简单的标记语法,使文档更具…...
Leetcode—2558.从数量最多的堆取走礼物【简单】
2023每日刷题(十二) Leetcode—2558.从数量最多的堆取走礼物 大顶堆实现代码 void swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; }void downAdjustHeap(int *heap, int low, int high) {int i low;int j 2 * i 1;while(j < high) {if(j …...
【如何写论文】硕博学位论文的结构框架、过程与大纲分析
硕士论文可以说是毕业前最重要的一部分,也可以说是展示和检验你3年研究生学习的成果的一个考试。硕士论文答辩和检验合格,才能够顺利拿到毕业生和学位证,可见其重要性。 目录 一、基础框架1.1、摘要(Abstract)1.2、绪论…...
砷化镓(GaAs)纳米线 砷化镓纳米线 GaAs纳米线 瑞禧
砷化镓(GaAs)纳米线 名称:砷化镓(GaAs)纳米线 直径:50-400 nm 长度:10-80μm 纳米线是一种新型的材料结构,具有较小的直径和高的长度比,因此在纳米电子学、光电器件等领域有着广泛的应用前景…...
PostGreSQL:JSON|JSONB数据类型
JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…...
树----数据结构
树的概念 树是一种非线性的数据结构,它是由 n (n>1) 个有限结点组成一个具有层次关系的集合,它看起来就像一颗倒挂的树,根朝上,叶朝下。由 0 个节点构成的树,叫做空树。 树的特点:每个结点有 0 个或多…...
GitLab定时备份
GitLab定时备份 文章目录 GitLab定时备份GitLab基础环境备份命令自动清理备份上传命令设置定时任务参考链接 GitLab基础环境 部署方式:Docker 版本:16.2.2 备份命令 Notes: 编写sh脚本时,不要使用Windows上的Notepad类似编辑…...
SQL IN 运算符
SQL IN 运算符 IN 运算符允许您在 WHERE 子句中指定多个值。 IN 运算符是多个 OR 条件的简写。 SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); 或者 SELECT column_name(s) FROM table_name WHERE column_name IN (SELE…...
虚拟机构建单体项目及前后端分离项目
引言 在现代化办公环境中,会议是组织沟通、决策和合作的重要方式之一。为了提高会议的效率和质量,许多企业选择部署会议OA系统来实现会议管理的自动化和数字化。本博客将介绍如何部署和优化会议OA系统,并探讨前后端分离的SPA项目在此过程中的…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
