尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

总结-esp-idf 接口与抽象层设计

总结-esp-idf 接口与抽象层设计
📅 发布时间:2026/6/20 3:22:39

疑惑

esp-idf中 lcd、io、bus 像是 spi_bus 和 spi_io 不都是配套出现的吗?那为啥还要分层呢...

总结

抽象分层

核心思想:分层不是为了拆分,是为了抽象 + 可组合

ESP-IDF 的 esp_lcd 框架分为三个层级:

  • BUS 层(硬件接口)
    • SPI / I2C / 8080 / RGB / MIPI DSI
    • 负责 怎么把数据按该总线的规则发出去。
  • IO 层(屏幕指令接口)
    • st7789_spi、ili9341_spi、st7789_8080 等
    • 负责 怎么向某个屏幕型号发送命令/数据。
  • Panel 层
    • st7789、ili9341
    • 负责 分辨率、初始化序列、偏移、MADCTL、坐标翻转等逻辑。

代码写的多的话会发现不同 io 所用的 SPI 总线基本一致,唯一不同的是如何对 SPI 做 IO 操作。不管如此,其他外设也会使用到 SPI 总线,如 SD 卡、Flash...
之所以分这些层,就是因为提高复用,增加可组合性。

接口

接口 = 稳定的抽象边界

之前学习 js 就有接触 class,但是权当 class 作为一种组织代码的方式,接口也从来没怎么用过,完全没 get 到接口的精髓。
现在接触了嵌入式,面对纷杂庞大的环境,第一次体会到 接口设计 的好处,接口的目的不仅仅是封装功能,而是隔离变化。
就拿屏幕来说,不同屏幕有不同驱动芯片,相同芯片也可能会使用到不同总线。只有一套配置的话,代码写在一起也还可以,这样反而更轻松。但是如果要给上面所有情况各写一套代码,那简直是 灾难😣

来看一个具体的示例:

esp_lcd_panel_io_handle_t lcd_io = NULL;
esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &lcd_io);// 初始化 panel
esp_lcd_panel_handle_t lcd_panel = NULL;
const esp_lcd_panel_dev_config_t panel_config = {...};esp_lcd_new_panel_st7789(lcd_io, &panel_config, &lcd_panel);

新建一个 st7789_panel 只需要一个 panel_config 和 提供 io 操作的 lcd_io 句柄。
虽然 lcd_io 是一个底层由 spi 驱动的 io,但是不同总线最终都会返回一个 拥有相同操纵 io 的 esp_lcd_panel_io_handle_t 句柄。

esp_lcd_panel_io_t 的具体 io 操作:

/*** @brief LCD panel IO interface*/
struct esp_lcd_panel_io_t {/*** @brief Transmit LCD command and receive corresponding parameters*/esp_err_t (*rx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size);/*** @brief Transmit LCD command and corresponding parameters*/esp_err_t (*tx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size);/*** @brief Transmit LCD RGB data*/esp_err_t (*tx_color)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size);/*** @brief Destroy LCD panel IO handle (deinitialize all and free resource)*/esp_err_t (*del)(esp_lcd_panel_io_t *io);/*** @brief Register LCD panel IO callbacks*/esp_err_t (*register_event_callbacks)(esp_lcd_panel_io_t *io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx);
};

这样的话,即使更换底层总线驱动,也只需要更改新的 io 就行,向上暴露的方法都是一样的,也就是 隔离了变化。

相关新闻

  • 洛谷-训练题-算法1-2
  • 兄弟们好
  • Day47(17)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02

最新新闻

  • 2026年6月昆明好的旋转铝导轨抱夹供应商深度分析与选择指南 - 品牌鉴赏官2026
  • 3分钟掌握llama-bench:你的大语言模型性能优化终极指南
  • 终极MPV播放器UI指南:uosc如何用接近感应式设计改变你的观影体验
  • XXMI启动器:6款热门二次元游戏模组管理的技术实现与效率革命
  • Depth Anything 3实战指南:从单张图片快速构建3D场景
  • 工业洁净厂房车间装修隔墙材料规范及施工要点 - 华川洁净

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号