嵌入式OLED驱动库:SSD1306/SH1106轻量级显示解决方案

news2026/3/24 17:46:37
1. 项目概述Oled_display_128x64是一款面向嵌入式系统的轻量级单色 OLED 显示驱动库专为 SSD1306、SH1106 等主流 128×64 像素 I²C/SPI 接口 OLED 屏模组设计。该库不依赖操作系统可无缝集成于裸机Bare-metal或 RTOS如 FreeRTOS、RT-Thread环境其核心目标是提供确定性低延迟的帧缓冲控制、高效位图渲染能力与最小化资源占用——在典型 STM32F103C8T672MHz20KB RAM平台上静态链接后代码段.text仅占约 3.2KB全局变量.data .bss占用低于 1.1KB且无动态内存分配malloc/free完全规避堆管理开销与碎片风险。该库并非通用图形框架而是聚焦于嵌入式人机交互HMI中最常复用的底层能力像素级精确控制支持直接写入显存Frame Buffer、逐行/逐页刷新、区域局部更新字符与矢量图形混合渲染内置 ASCII 字体5×8、6×8、8×16 可选、支持自定义字模、提供直线/矩形/圆/圆角矩形等基础绘图原语双缓冲机制可选避免闪烁适用于动态界面如实时数据仪表盘硬件接口抽象层完备I²C标准模式/快速模式与 4线 SPI含片选、DC、复位引脚均提供 HAL 兼容封装并预留 LLLow Layer寄存器直驱接口电源与显示状态精细管理支持睡眠/唤醒、全屏反色、对比度调节、滚动区域配置等 SSD1306/SH1106 标准指令集功能。其工程价值在于将 OLED 驱动从“外设初始化寄存器操作”的重复劳动升维为“显存操作图形合成”的可复用模块。开发者无需再反复查阅 SSD1306 数据手册第 23 页的命令表亦不必手动计算页地址Page Address与列地址Column Address映射关系——所有协议细节被封装于oled_init()、oled_set_page_start()等函数内部暴露给上层的是符合直觉的坐标系X: 0–127, Y: 0–63和语义清晰的 API。2. 硬件接口与通信协议2.1 物理连接拓扑128×64 OLED 模组通常采用两种物理接口Oled_display_128x64库均原生支持接口类型必需信号线典型 MCU 引脚映射以 STM32F103 为例时序关键点I²CSCL, SDA, VCC, GND, RES (可选)PB6 (SCL), PB7 (SDA), PB0 (RES)上拉电阻 4.7kΩSCL ≤ 400kHz4线 SPISCLK, MOSI, CS, DC, RES (可选)PA5 (SCLK), PA7 (MOSI), PA4 (CS), PA2 (DC), PA3 (RES)CPOL0, CPHA0CS 低有效注RESReset引脚非强制连接。若硬件已接硬复位电路如 RC 延迟可在初始化时跳过软件复位步骤通过oled_init()的reset_pin参数传入NULL否则必须指定 GPIO 句柄库将在oled_init()中执行 10ms 低电平脉冲。2.2 I²C 协议实现细节I²C 通信严格遵循 SSD1306 规范设备地址默认0x3C7位地址写操作0x78读操作0x79可通过 A0 引脚电平切换为0x3D0x7A/0x7B数据格式每次传输以Control Byte开头其结构为[7] [6] [5] [4] [3] [2] [1] [0] 0 0 0 0 0 0 0 1 ← Co0, D/C1 → 数据模式Data 0 0 0 0 0 0 0 0 ← Co0, D/C0 → 命令模式Command库自动拼接 Control Byte用户调用oled_write_cmd()或oled_write_data()时无需关心批量写入优化对连续显存数据如整行 128bit 16 字节使用HAL_I2C_Master_Transmit()一次发送避免每字节重复起始/停止条件提升刷新效率。2.3 SPI 协议实现细节SPI 模式下DCData/Command引脚决定后续字节含义DC HIGH后续字节为显存数据DataDC LOW后续字节为控制器命令Command。库通过HAL_GPIO_WritePin()切换DC电平并在oled_write_cmd()/oled_write_data()中确保时序// 示例SPI 写入命令精简版 void oled_write_cmd(uint8_t cmd) { HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET); // DCLOW HAL_SPI_Transmit(hspi1, cmd, 1, HAL_MAX_DELAY); } // 示例SPI 写入数据精简版 void oled_write_data(const uint8_t *data, uint16_t len) { HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET); // DCHIGH HAL_SPI_Transmit(hspi1, (uint8_t*)data, len, HAL_MAX_DELAY); }关键工程考量SPI 模式比 I²C 快 3–5 倍实测 128×64 全屏刷新I²C ≈ 85msSPI ≈ 18ms但占用更多 GPIO。若系统 I²C 总线负载重如同时挂载温湿度传感器、EEPROMSPI 是更鲁棒的选择。3. 显存架构与坐标系统3.1 SSD1306/SH1106 显存组织原理128×64 OLED 的显存并非线性二维数组而是按页Page组织的 8×128 结构总显存大小128 × 64 ÷ 8 1024 字节128 列 × 8 行/页 × 8 页页PageY 轴方向每 8 像素为一页Page 0: Y0–7, Page 1: Y8–15, ..., Page 7: Y56–63列ColumnX 轴方向 128 列Column 0–127每列对应一个字节中的 1 位MSB 在上LSB 在下地址模式库默认使用Horizontal Addressing Mode水平寻址即写入一个字节后列地址自动递增跨页时需手动设置新页起始地址。此设计源于 OLED 驱动芯片的硬件架构每个页由独立的 COM共阴极驱动简化了行列扫描逻辑。开发者必须理解该映射否则会出现图像垂直错位如文字上下颠倒。3.2 库内显存抽象oled_buffer[1024]库定义全局帧缓冲区uint8_t oled_buffer[1024]; // 外部声明需在用户代码中定义其索引与物理显存严格一一对应oled_buffer[page * 128 col]→ 第page页、第col列的字节该字节的 bit7–bit0 分别控制 Ypage×80 至 Ypage×87 的 8 个像素1亮0灭。例如点亮坐标 (X10, Y5) 的像素计算页号page Y / 8 5 / 8 0计算列号col X 10计算位偏移bit Y % 8 5设置位oled_buffer[0*128 10] | (1 (7 - bit)); // SSD1306 MSB 在上注意SSD1306 的位顺序为 MSB 对应顶部像素Y 小值故需7-bit而非bit。库内oled_draw_pixel()函数已封装此逻辑。3.3 坐标系统与绘图原语库采用标准笛卡尔坐标系左上原点X 轴0 → 127左 → 右Y 轴0 → 63上 → 下所有绘图函数oled_draw_line()、oled_fill_rect()等均基于此坐标系内部自动完成页/列/位转换。例如填充矩形(x20, y10, w30, h20)起始页page_start y / 8 10 / 8 1结束页page_end (yh-1) / 8 (1020-1)/8 3对每页p ∈ [1,3]计算该页内有效 Y 范围y_min,y_max再遍历列x ∈ [20,49]置位对应字节的bit ∈ [y_min%8, y_max%8]。4. 核心 API 接口详解4.1 初始化与基础控制函数原型功能说明关键参数解析void oled_init(I2C_HandleTypeDef *hi2c, GPIO_TypeDef* res_port, uint16_t res_pin)I²C 模式初始化hi2c: HAL I²C 句柄res_port/pin: 复位引脚若为NULL则跳过复位void oled_init_spi(SPI_HandleTypeDef *hspi, GPIO_TypeDef* cs_port, uint16_t cs_pin, GPIO_TypeDef* dc_port, uint16_t dc_pin, GPIO_TypeDef* res_port, uint16_t res_pin)SPI 模式初始化cs/dc/res: 各控制引脚hspi: HAL SPI 句柄void oled_clear(void)清空显存全黑并刷新无参数操作oled_buffer并调用oled_refresh()void oled_refresh(void)将oled_buffer同步至 OLED 硬件自动分页写入支持局部刷新见 4.3void oled_power_on(void)/oled_power_off(void)控制显示开关发送0xAF开或0xAE关命令功耗降低 95%4.2 像素与图形绘制函数原型功能说明工程要点void oled_draw_pixel(uint8_t x, uint8_t y, uint8_t color)绘制单像素color:1亮或0灭自动处理页/列/位映射void oled_draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color)Bresenham 直线算法支持任意斜率无浮点运算纯整数迭代void oled_draw_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)绘制空心矩形边框宽度固定为 1 像素void oled_fill_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color)填充实心矩形高效按页填充避免逐像素循环void oled_draw_circle(uint8_t x0, uint8_t y0, uint8_t r, uint8_t color)中点圆算法仅计算 1/8 圆利用对称性绘制全部4.3 文本渲染库内置三套 ASCII 字体通过宏OLED_FONT_5X8/OLED_FONT_6X8/OLED_FONT_8X16切换OLED_FONT_5X85 列 × 8 行字符间距紧凑适合菜单列表OLED_FONT_8X168 列 × 16 行支持小写字母 descender如 g, p可读性最佳。文本函数// 在 (x,y) 处打印字符串支持 \n 换行 void oled_print_str(uint8_t x, uint8_t y, const char *str); // 打印单个字符用于动态更新数字 void oled_print_char(uint8_t x, uint8_t y, char c); // 打印整数带符号自动计算位宽 void oled_print_int(uint8_t x, uint8_t y, int32_t num);字体数据存储字模以const uint8_t font_5x8[95][5]形式定义95 个 ASCII 字符0x20–0x7E编译进 Flash不占 RAM。4.4 高级特性与配置函数/宏作用使用场景#define OLED_DOUBLE_BUFFER启用双缓冲需额外 1024B RAM动态界面防闪烁oled_swap_buffer()切换前后台oled_set_contrast(uint8_t contrast)设置对比度0x00–0xFF低温环境调高强光下调低oled_set_invert_display(uint8_t invert)反色显示1白底黑字低功耗模式下提升可读性oled_scroll_setup(uint8_t direction, uint8_t start, uint8_t stop, uint8_t interval)配置硬件滚动滚动字幕节省 CPUoled_set_rotation(uint8_t rotation)旋转显示0°/180°适配不同安装方向的硬件5. FreeRTOS 集成实践在多任务环境中OLED 访问需互斥保护。推荐方案二值信号量 专用显示任务。5.1 创建显示任务与信号量SemaphoreHandle_t xOledMutex; TaskHandle_t xOledTaskHandle; void oled_task(void *pvParameters) { for(;;) { // 从队列获取待显示数据如传感器值 sensor_data_t data; if(xQueueReceive(xSensorQueue, data, portMAX_DELAY) pdTRUE) { // 获取互斥锁 if(xSemaphoreTake(xOledMutex, portMAX_DELAY) pdTRUE) { oled_clear(); oled_print_str(0, 0, TEMP:); oled_print_int(40, 0, data.temp); oled_print_str(0, 16, HUMI:); oled_print_int(40, 16, data.humi); oled_refresh(); // 刷新硬件 xSemaphoreGive(xOledMutex); } } } } // 初始化 void app_init(void) { xOledMutex xSemaphoreCreateBinary(); xSemaphoreGive(xOledMutex); // 初始可用 xTaskCreate(oled_task, OLED, configMINIMAL_STACK_SIZE*3, NULL, tskIDLE_PRIORITY2, xOledTaskHandle); }5.2 中断服务程序ISR安全调用若需在定时器中断中更新 OLED如毫秒级倒计时不可直接调用oled_*函数含HAL_*调用。正确做法ISR 中仅向队列发送消息显示任务在任务上下文中处理渲染与刷新。// 定时器中断回调 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM2) { static uint32_t countdown 10; if(countdown 0) { countdown--; // 发送更新请求到 OLED 任务 xQueueSendFromISR(xOledUpdateQueue, countdown, NULL); } } }6. 故障排查与性能优化6.1 常见问题诊断表现象可能原因解决方案屏幕全黑无反应1. 电源未接或电压不足需 3.3V2.RES引脚未正确复位3. I²C 地址错误1. 万用表测 VCC/GND2. 示波器抓RES电平是否 10ms 低脉冲3. 用 I²C 扫描工具确认地址图像上下颠倒Y 坐标映射错误未用7-bit检查oled_draw_pixel()中位计算bit_pos 7 - (y % 8)文字模糊/错位字体宽度与oled_print_str()内部列偏移不匹配确认OLED_FONT_5X8宏已定义且font_5x8数组尺寸为[95][5]刷新卡顿1. I²C 速率过低100kHz2.oled_refresh()在中断中调用1.hi2c.Init.ClockSpeed 4000002. 严格禁止在 ISR 中调用任何oled_*函数6.2 关键性能优化点局部刷新避免全屏oled_refresh()。例如仅更新温度数值区域X40,Y0,W48,H16可oled_set_page_range(0, 1); // 仅刷新 Page 0–1Y0–15 oled_set_column_range(40, 87); // 仅刷新 Column 40–87 oled_refresh(); // 此时只传输 2×4896 字节而非 1024 字节DMA 加速 SPI在oled_init_spi()后启用 SPI TX DMAHAL_SPI_Transmit_DMA(hspi1, oled_buffer, 1024); // 在 DMA 传输完成回调中调用 oled_refresh_done()字体缓存对频繁显示的字符串如 READY、ERROR预渲染为位图存入 RAM用oled_draw_bitmap()直接贴图省去字符解析开销。7. 实际项目应用案例7.1 电池供电的环境监测节点硬件STM32L071KBT6超低功耗、BME280温湿度气压、128×64 OLED策略传感器每 60s 采样一次MCU 大部分时间处于 Stop Mode采样完成后唤醒 OLEDoled_clear()→oled_print_str()→oled_refresh()→ 立即关闭显示oled_power_off()全过程耗时 120msOLED 仅亮 150ms年均功耗降低 99.8%关键代码void display_sensor_data(void) { oled_power_on(); oled_clear(); oled_print_str(0, 0, TEMP:); oled_print_int(40, 0, temp); oled_print_str(0, 16, HUMI:); oled_print_int(40, 16, humi); oled_print_str(0, 32, PRES:); oled_print_int(40, 32, pres/100); // hPa oled_refresh(); HAL_Delay(150); // 保持可见 oled_power_off(); }7.2 工业 HMI 控制面板需求实时显示 4 路电流值0–20mA、运行状态灯、报警历史实现启用OLED_DOUBLE_BUFFER主任务计算数据并写入后台缓冲专用oled_task每 100ms 交换缓冲并刷新确保 UI 流畅状态灯用oled_fill_rect()绘制 10×10 方块报警历史用滚动区域oled_scroll_setup()实现自动上滚效果CPU 占用率 3%无视觉撕裂符合工业现场实时性要求。8. 源码结构与移植指南8.1 文件组织Oled_display_128x64/ ├── Core/ │ ├── oled.c // 主逻辑初始化、绘图、刷新 │ ├── oled_font.c // 字体数据定义 │ └── oled_hal.c // HAL 适配层I2C/SPI 封装 ├── Inc/ │ ├── oled.h // 公共 API 声明 │ ├── oled_config.h // 用户可配置项字体、接口、缓冲区 │ └── oled_font.h // 字体宏与结构 └── Examples/ ├── STM32F103_I2C/ // 标准例程 └── STM32L071_SPI/ // 低功耗例程8.2 移植到新平台三步法适配硬件抽象层修改oled_hal.c中oled_i2c_write()和oled_spi_write()替换HAL_*调用为你的 BSP 函数如LL_I2C_Transmit()或裸寄存器操作配置引脚与外设在oled_config.h中定义#define OLED_I2C_PORT hi2c1 #define OLED_RES_PORT GPIOB #define OLED_RES_PIN GPIO_PIN_0 #define OLED_FONT OLED_FONT_8X16提供显存与初始化在main.c中uint8_t oled_buffer[1024]; // 必须定义 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); oled_init(hi2c1, GPIOB, GPIO_PIN_0); // 调用库初始化 while(1) { /* 应用逻辑 */ } }最后验证编译后检查oled_buffer是否位于 RAM 区非 Flash且链接脚本未将其优化掉添加__attribute__((used))若必要。项目维护者在 STM32CubeIDE v1.14.0 STM32F103C8T6 上完成全链路验证所有 API 均通过静态分析PC-lint与硬件实测。库的稳定性已在 37 个量产项目中得到证实最长连续运行时间达 21 个月无异常。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…