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

news2024/11/26 20:21:12

文章目录

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

说在前面

  • 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
    

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

78 子集

子集 题解1 回溯模板 题解2 迭代&#xff08;mask思想&#xff09; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入…

AcWing 第127场周赛 构造矩阵

构造题目&#xff0c;考虑去除掉最后一行最后一列先进行考虑&#xff0c;假设除了最后一行和最后一列都已经排好了&#xff08;你可以随便排&#xff09;&#xff0c;那么分析知最后一个数字由限制以外其他都已经确定了&#xff0c;无解的情况是k为-1 并且n&#xff0c;m的奇偶…

网络编程套接字(1)——简单的UDP网络程序

文章目录 一.预备知识1.理解源IP地址和目的IP地址2.理解源MAC地址和目的MAC地址3.理解源端口号和目的端口号4.PORT VS PID5.认识TCP协议和UDP协议6.网络字节序 二.socket编程接口1.socket常见API2.sockaddr结构 三.简单的UDP网络程序1.服务端创建套接字2.服务端绑定3.字符串IP …

ctf md5爆破

1.知道组成的字符为数字,然后知道加密后的MD5,求组成的字符 import hashlibimport stringdef crackMd5(dst):dst dst.lower()for a in range(0,10):for b in range(0,10):for c in range(0,10):for d in range(0,10):word str(a) str(b) str(c) str(d) "_heetian&q…

【报错】kali安装ngrok报错解决办法(zsh: exec format error: ./ngrok)

问题描述 kali安装ngrok令牌授权失败 在安装配置文件的时候报错&#xff1a;zsh: exec format error: ./ngrok 原因分析&#xff1a; 在Kali Linux上执行./ngrok时出现zsh exec格式错误的问题可能是由于未安装正确版本的ngrok或操作系统不兼容ngrok导致的。以下是一些可能的解…

k8s安装时初始化报错:error execution phase preflight

服务器配置与k8s版本 系统版本&#xff1a; CentOS Linux release 7.9.2009 (Core)内核版本&#xff1a; [rootk8s-node02 tmp]# uname -r 5.4.259-1.el7.elrepo.x86_64k8s版本 v1.15.1 [rootk8s-node1 tmp]# kubeadm version kubeadm version: &version.Info{Major:&q…

(免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设农产品销售管理系统。…

人工智能(AI)在医疗领域的应用

人工智能&#xff08;AI&#xff09;在医疗领域的应用 人工智能&#xff08;AI&#xff09;在医疗领域的应用近年来得到了广泛的关注。其中&#xff0c;AI辅助治疗疾病的技术成为了研究热点。本文将介绍AI辅助治疗疾病的技术&#xff0c;包括其定义、应用场景、案例分析和发展…

jdk10的var局部变量类型推理

注&#xff1a;本人参考了openjdk官网&#xff0c;由于openjdk是开源的&#xff0c;所以不存在侵权行为&#xff0c;本章只为学习&#xff0c;我觉得没有什么比官网更具有话语权 1、jdk10的var的类型推测&#xff1a;就是这种处理将仅限于具有初始值设定项的局部变量、增强型 -…

Android问题笔记四十三:JNI 开发如何快速定位崩溃问题

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

opencv 滤波与blob检测总结

参考&#xff1a;https://learnopencv.com/contour-detection-using-opencv-python-c/ import cv2 impory numpy as np image cv2.imread(rxxx.jpg) # Sobel Edge Detection sobelx cv2.Sobel(srcimg_blur, ddepthcv2.CV_64F, dx1, dy0, ksize21) # Sobel Edge Detection o…

Python程序设计期末复习笔记

文章目录 一、数据存储1.1 倒计时1.2 os库1.3 字符串操作1.4 文件操作1.5 列表操作1.6 元组1.7 字典 二、文本处理及可视化2.1 jieba分词2.2 集合操作2.3 pdf文件读取2.4 参数传递2.5 变量作用域 三、数据处理分析3.1 Sumpy3.2 Matplotlib3.3 Numpy 四、Pandas4.1 索引操作4.2 …

【算法|动态规划 | 01背包问题No.1】AcWing 426. 开心的金明

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

Java Dubbo 微服务框架 HP-SOA

HP-SOA 功能完备&#xff0c;简单易用&#xff0c;高度可扩展的Java微服务框架。 【快速开始】 技术架构 技术集成 Web服务框架&#xff1a;spring-boot 3.x微服务框架&#xff1a;Dubbo 3.x服务注册中心&#xff1a;Nacos配置中心&#xff1a;Nacos服务治理中心&#xff1…

色彩校正及OpenCV mcc模块介绍

一、术语 1.光&#xff1a;是电磁波&#xff0c;可见光是可被人眼感知的电磁波。可见光大约在400-700nm波段。光子携带的能量与波长成反比&#xff0c;400nm--700nm之间的单色光的颜色从紫色渐变成红色。 2.光谱&#xff1a;除了太阳光源外&#xff0c;LED灯、白炽灯等各种照明…

基于Java的汉服文化平台网站设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

python随手小练10(南农作业题)

题目1&#xff1a; 编写程序&#xff0c;输出1~1000之间所有能被4整除&#xff0c;但是不能被5整除的数 具体操作&#xff1a; for i in range(1,1000): #循环遍历1~999&#xff0c;因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示&#xff1a; 题目2&…

Docker:安装MySQL

Docker&#xff1a;安装MySQL 1. 部署MySQL2.部署多个MySQL服务 1. 部署MySQL 首先需要安装Docker&#xff0c;安装Docker地址&#xff1a;http://t.csdnimg.cn/utPGF 安装命令&#xff1a; docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT…

AMD Ryzen AI 暂仅支持 Windows,Linux 系统有望后续支持

近日消息&#xff0c;最新的 AMD Ryzen 7040 系列笔记本电脑配备了基于 Xilinx IP 的专用 AI 引擎&#xff0c;名为“Ryzen AI”&#xff0c;可以加速 PyTorch 和 TensorFlow 等机器学习框架的运行。不过目前这个 Ryzen AI 只支持微软 Windows 系统。但是如果有足够的客户需求&…

最新FL Studio 21.2中文版即将发布,2024年会有哪些新功能呢?

好消息&#xff01;FL Studio 21.2 在 10 月 26 日正式发布啦&#xff0c;它新增了 FL Cloud 在线采样库和 AI 音乐制作功能&#xff0c;还提供音乐分发到 Spotify、Apple Music 等主要音乐平台的服务。此外&#xff0c;还有新的音频分离功能、自定义波形颜色和新的合成器 Kepl…