2. 嵌入式GUI基础
做嵌入式GUI,第一步就是选硬件平台。我见过不少项目,软件写得挺好,结果硬件带不动屏幕,卡成幻灯片。说白了,选型就是定基调,后面所有工作都围着它转。
今天咱们就把这事聊透。从处理器选型,到屏幕接口,再到触摸屏和存储估算,一条线捋清楚。
MCU 还是 MPU?这不是个选择题
很多人问我:「做GUI到底用MCU还是MPU?」我的回答是:看你的屏幕和交互复杂度。
MCU(微控制器),比如 STM32、ESP32、GD32,特点是片上集成Flash和RAM,外设丰富,功耗低。适合做小尺寸屏幕(3.5寸以下)、简单界面、低刷新率的场景。
MPU(微处理器),比如全志F1C200s、瑞芯微RK系列、NXP i.MX系列,需要外挂DDR和存储,跑Linux系统。适合大屏(5寸以上)、复杂动画、多点触控、网络交互的场景。
核心判断标准:
- 屏幕分辨率 ≤ 480×320,界面元素少于20个 → MCU 够用
- 分辨率 ≥ 800×480,需要滑动、动画、多窗口 → 上 MPU
- 需要运行 LVGL 的复杂控件库,且帧率 > 30fps → 建议 MPU
我在一个智能家居面板项目里踩过坑。当时选了 STM32F429,驱动 4.3 寸 480×272 屏,跑 LVGL 基本流畅。但客户后来要求加一个实时波形显示,帧率直接掉到 15fps。最后换了全志 F1C200s,跑 Linux + LVGL,问题才解决。嗯,选型时一定要留余量。
| 对比项 | MCU 方案 | MPU 方案 |
|---|---|---|
| 典型芯片 | STM32F4/H7, ESP32-S3, GD32F4 | 全志F1C200s, RK3566, i.MX6ULL |
| 操作系统 | 裸机 / FreeRTOS / RT-Thread | Linux / Android |
| 最大分辨率 | 800×480(带FMC/SDRAM) | 1920×1080 |
| 帧率 | 15-30fps | 30-60fps |
| 开发复杂度 | 低,直接裸机或RTOS | 高,需要Linux驱动适配 |
| 成本 | 20-80元 | 50-200元 |
屏幕接口:SPI、RGB、MIPI DSI 怎么选?
屏幕接口决定了你的硬件连接方式和性能上限。我按实际项目经验给你拆开讲。
SPI 接口
最常见的小屏接口。4线或3线,速度一般在 20-80MHz。适合 2.8 寸以下、分辨率 320×240 以内的屏。
- 优点:引脚少(6-8根),MCU 几乎都支持,驱动简单
- 缺点:刷新慢,全屏刷一帧需要发送大量数据,CPU 占用高
- 适用场景:静态界面、数字显示、菜单
我的经验:SPI 屏最好用 DMA + 双缓冲。我曾经在 STM32F103 上驱动 2.4 寸 SPI 屏,不用 DMA 时 CPU 占用率 80%,用了 DMA 降到 15%。
RGB 接口
也叫并行接口,通常是 16 位或 18 位数据线,加上行场同步信号。适合 3.5-7 寸、分辨率 480×272 到 1024×600 的屏。
- 优点:刷新快,直接操作显存,帧率轻松上 30fps
- 缺点:引脚多(20-30根),需要 MCU 带 FMC/FSMC 接口
- 适用场景:工业控制面板、智能家居中控
注意:RGB 接口需要外部 SDRAM 做显存。MCU 内部 SRAM 通常不够用。比如 800×480 分辨率、16位色深,一帧需要 800×480×2 = 768KB,很多 MCU 内部只有 256KB。
MIPI DSI 接口
这是手机和平板上用的标准接口。差分信号,高速传输,支持 4 通道,每通道 1Gbps 以上。适合 5 寸以上、高清屏。
- 优点:速度快、抗干扰强、支持长距离传输
- 缺点:需要 MPU 带 MIPI DSI 控制器,驱动复杂
- 适用场景:高端人机界面、车载显示、医疗设备
你想想看,如果只是做个温湿度计,用 SPI 屏就够了。但要做个带地图导航的车载仪表盘,MIPI DSI 是唯一选择。
触摸屏:电阻屏 vs 电容屏
触摸屏这事,我吃过不少亏。早期项目图便宜用了电阻屏,结果用户反馈「点不准」「要用力按」。后来全换成电容屏,体验好很多。
| 对比项 | 电阻屏 | 电容屏 |
|---|---|---|
| 工作原理 | 压力感应,两层导电膜接触 | 人体电容感应 |
| 触摸方式 | 任何物体(手指、笔、手套) | 手指或电容笔 |
| 多点触控 | 不支持(最多两点) | 支持 5-10 点 |
| 透光率 | 70-80% | 90% 以上 |
| 成本 | 低(10-30元) | 中高(30-100元) |
| 耐用性 | 易磨损,寿命短 | 表面玻璃,耐磨 |
选型建议:
- 工业环境、戴手套操作 → 电阻屏(比如工厂产线终端)
- 消费产品、需要手势操作 → 电容屏(比如智能家居面板)
- 户外强光环境 → 电容屏(透光率好,显示更清晰)
我曾经在一个户外充电桩项目里用了电阻屏,结果夏天暴晒后屏幕表面起泡,触摸失灵。后来换成电容屏,加了一层防眩光玻璃,问题解决。环境因素一定要考虑进去。
RAM/Flash 需求估算
这是选型里最容易翻车的地方。我见过有人选了 256KB RAM 的 MCU,结果 LVGL 初始化就占了一半,界面稍微复杂点就崩了。
咱们来算笔账。以 LVGL 为例,内存消耗主要分三块:
- 显存(帧缓冲):分辨率 × 色深 / 8。比如 480×272、16位色,一帧需要 480×272×2 = 261KB。双缓冲就是 522KB。
- LVGL 运行时内存:默认配置下约 8-16KB,加上控件对象、样式、字体缓存,建议预留 32-64KB。
- 系统堆栈和任务:RTOS 每个任务栈 2-4KB,加上系统堆,建议预留 16-32KB。
快速估算公式:
最小 RAM = 帧缓冲大小 × 2 + 64KB(LVGL + 系统)
最小 Flash = 固件 + 字体 + 图片资源 + 20% 余量
举个例子。一个 4.3 寸 480×272 的屏,16位色,用 MCU 方案:
- RAM:261KB × 2 + 64KB = 586KB → 选 1MB 以上 RAM 的芯片
- Flash:固件 200KB + 字体 100KB + 图片 200KB + 余量 100KB = 600KB → 选 1MB 以上 Flash
如果是 MPU 方案,外挂 64MB DDR + 128MB NAND Flash 基本够用。但要注意,Linux 内核和根文件系统会占掉 30-50MB,留给 GUI 的也就十几 MB。
避坑指南:我曾经在 STM32H743 上做项目,选了 2MB Flash + 1MB RAM,觉得绰绰有余。结果客户要求加中文字库(GB2312 全字库约 2MB),Flash 直接爆了。最后只能外挂 SPI Flash 存字库。所以,字库和图片资源一定要提前规划。
知识体系总览
下面这张图把本章的核心逻辑串起来了。从处理器选型开始,到屏幕接口、触摸屏、存储估算,每一步都影响最终方案。
这张图你可以保存下来,以后做选型时对照着看。从顶层处理器开始,一路往下走,每个分支都对应一个决策点。
好了,硬件选型这块就聊到这儿。记住一句话:选型不是选最贵的,也不是选最便宜的,而是选最合适的。把屏幕尺寸、分辨率、交互复杂度、成本预算摆到桌面上,答案自然就出来了。