ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

把 Slint 装上 ESP32-S3:从 .slint 界面到烧录上屏的完整流程

把 Slint 装上 ESP32-S3:从 .slint 界面到烧录上屏的完整流程 把 Slint 装上 ESP32-S3从 .slint 界面到烧录上屏的完整流程【免费下载链接】slintSlint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps.项目地址: https://gitcode.com/GitHub_Trending/sl/slint在一块 2.4 英寸、320×240 的彩屏上既要显示实时数据、又要能点按交互还要接上触摸与传感器——这是多数物联网设备界面的起点。Slint 用声明式写法只描述界面长什么样不用管怎么画把这套流程压缩成三步写一个 .slint 界面文件、接上 ESP32 的板级支持、交叉编译后烧录上屏。下文以 ESP32-S3-Box 为例走通从界面到烧录的最小可跑流程。它是什么为什么值得用Slint 是一个用声明式语法搭建原生界面的工具包支持 Rust、C、JavaScript、Python。在桌面和 Web 上它的布局、组件、动画都帮你管好放到 MCU 这种没有操作系统的裸机环境它退化为一个纯软件渲染引擎只负责把像素算出来剩下的取输入、传像素到屏、跑事件循环由你的代码补上。两种做法的差别主要体现在谁负责驱动屏幕这件事上传统做法自己写 LCD 的初始化时序自己算哪些区域变了要重画自己管双缓冲和 DMA界面和渲染逻辑交织在一起换一块板子往往要重写一大半。Slint 做法界面用 .slint 描述业务用 Rust 写硬件初始化交给一块现成的板级支持代码。你只声明这里放个文本、这里放个按钮、点它做什么渲染和脏区重绘交给引擎。对刚接触嵌入式 UI 的人这种分工的价值在于你可以先不动渲染只看界面和数据绑定等界面对了再回头调硬件。动手前准备下面这份清单覆盖硬件与工具链每项一句话说清装什么、为什么。一块 ESP32-S3 开发板本文用 ESP32-S3-Box自带 320×240 彩屏、GT911 触摸、Wi-Fi 与蓝牙也可换成 ESP32-S3-LCD-EV-Board、M5Stack CoreS3 等仓库已支持的板型。Rust 工具链通过 rustup 安装用来交叉编译到目标架构。ESP Rust 工具链提供esp的 cargo 工具链与xtensa-esp32s3-none-elf目标把代码编译成能烧进 ESP32 的固件。espflash用cargo install espflash安装负责把固件烧录并打开串口监视。Slint CLI可选cargo install slint-cli用于单独编译 .slint 或预览本文流程里由 build 脚本调用编译不必手动跑。如果还没拿到仓库先克隆源码板级支持 crate 目前只在仓库里不在 crates.iogit clone https://gitcode.com/GitHub_Trending/sl/slint走通最小流程从 .slint 到烧录上屏先让界面能显示、能点再谈接传感器。下面按写界面 → 接逻辑 → 烧录三段来。写界面界面写在一个 .slint 文件里。以一个温湿度监控页为例声明两个入参属性、一个回调再摆上文本和按钮export component MainWindow inherits Window { min-width: 320px; min-height: 240px; preferred-width: self.min-width; preferred-height: self.min-height; in propertystring temperature: --; in propertystring humidity: --; callback toggle_led(); VerticalLayout { padding: 8px; Text { text: 温度 self.parent.temperature 湿度 self.parent.humidity; horizontal-alignment: center; } Button { text: 切换 LED; horizontal-alignment: center; clicked { self.toggle_led(); } } } }把图片、字体这些资源以软件渲染器能识别的格式嵌进二进制由 build 脚本指定fn main() { slint_build::compile_with_config( ui.slint, slint_build::CompilerConfiguration::new() .embed_resources(slint_build::EmbedResourcesKind::EmbedForSoftwareRenderer), ).unwrap(); }依赖上slint要关掉默认特性默认是面向桌面/操作系统的再补上裸机所需特性mcu-board-support与slint-build一起从仓库取[dependencies] slint { git https://gitcode.com/GitHub_Trending/sl/slint, default-features false, features [compat-1-2, unsafe-single-threaded, libm, renderer-software] } mcu-board-support { git https://gitcode.com/GitHub_Trending/sl/slint } [build-dependencies] slint-build { git https://gitcode.com/GitHub_Trending/sl/slint }接业务逻辑主逻辑很薄初始化平台、建窗口、设回调、跑事件循环。板级支持 crate 提供了entry宏和init()函数省去手写Platformtrait#![no_std] #![no_main] extern crate alloc; slint::include_modules!(); use mcu_board_support::prelude::*; #[mcu_board_support::entry] fn main() - ! { mcu_board_support::init(); let window MainWindow::new().unwrap(); window.set_temperature(25.0 °C.into()); window.set_humidity(60 %.into()); window.on_toggle_led(move || { /* 这里接你的硬件控制代码 */ }); window.run().unwrap(); panic!(事件循环不应返回); }编译并烧录在仓库根目录执行下面命令它会交叉编译、再用 espflash 烧录并打开串口监视。--config指向该板型的编译配置设置 16MB flash、espflash runner、build-std 等CARGO_PROFILE_RELEASE_OPT_LEVELs cargo esp run \ --manifest-path demos/printerdemo_mcu/Cargo.toml \ --target xtensa-esp32s3-none-elf \ --no-default-features \ --featuresmcu-board-support/esp32-s3-box-3 \ --release \ --config examples/mcu-board-support/esp32_s3_box_3/cargo-config.toml想在拿到板子前先跑通编译可加simulator特性在桌面预览cargo run --manifest-path demos/printerdemo_mcu/Cargo.toml --featuressimulator --release再进一步把界面做对、做快最小流程跑起来后常见的几个卡点对应几个可以调的开关。选对板级支持包仓库的 examples/mcu-board-support/ 下每个板型一个目录esp32_s3_box_3、esp32_s3_lcd_ev_board、m5stack_cores3等各带一个cargo-config.toml。换板子基本只改--features和--config两处界面与逻辑代码不动。只重画变了的区域软件渲染器配RepaintBufferType::ReusedBuffer时draw_if_needed每轮只把变化的部分重画进复用缓冲没有脏区就直接跳过避免每帧整屏重画拖慢 CPU。像素用 RGB565每像素 2 字节比 RGB888 省一半显存也更贴近多数 MCU 屏的原生格式slint直接提供了对应的Rgb565Pixel类型。按行渲染喂屏RAM 紧张时不必整屏缓存改用render_by_line一次画一行、立刻送显只需留一行像素宽度的缓冲。ESP32-S3-Box 的实现就是这条路线。DMA 与双缓冲官方文档明确提到若同步逐行填充太慢可准备两条行缓冲——CPU 画一条、DMA 异步搬另一条——把传输和计算重叠起来。这些开关分散在 api/rs/slint/mcu.md 里有逐段的代码示例遇到具体报错时按图索骥比较快。官方示例指路想看某种效果直接进对应目录翻代码比读文档更快建立手感。想看 MCU 整机怎么跑去 demos/printerdemo_mcu/这是按小屏改的打印机演示含多页切换、队列和进度是最完整的裸机参考。想看数据可视化 图表去 examples/iot-dashboard/一屏多个传感器读数加图表适合练多组件布局。想看智能家居式交互去 demos/home-automation/灯、温、窗帘这类开关与调节能看样式和动画怎么组织。想看轮播这类轻量动效去 examples/carousel/代码很短适合当第一个自定义组件模板。小结Slint 把嵌入式 UI 拆成声明界面 薄业务层 板级支持三块换板子只动编译参数界面和逻辑基本不重写。从上面的最小流程起步再按板型挑支持包、按需调渲染就能把一套能看能点的界面跑上 ESP32。源码与文档入口见仓库根目录的 README.md 和 api/rs/slint/mcu.md。【免费下载链接】slintSlint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps.项目地址: https://gitcode.com/GitHub_Trending/sl/slint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表