news 2026/9/11 11:31:07

LAT1313 LCD驱动时序深度解析:从FSMC到DMA的工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LAT1313 LCD驱动时序深度解析:从FSMC到DMA的工程实践

1. 项目概述与整体设计思路

1.1 为什么要死磕LAT1313的驱动时序

先说结论:LAT1313这块屏不难驱动,难的是把时序调对。很多朋友拿到一块新LCD,第一反应是找数据手册抄初始化代码,抄完发现屏幕亮了但闪烁、水波纹、边缘锯齿各种问题,最后排查半天发现是时序参数不对。这块JDI出品的LAT1313,属于典型的TFT-LCD模组,分辨率和刷新率都有一定要求,对主控侧的时序匹配相当敏感,所以我干脆把这次驱动过程完整记录下来,方便后续项目直接复用。

JDI(Japan Display Inc.)的屏在工业控制和医疗设备里出现频率很高,特点是色彩还原好、可视角度大、寿命长。LAT1313这块模组默认支持DE模式和SYNC模式两种数据同步方式,内部集成了Source Driver和Gate Driver,官方推荐的是DE模式,因为DE信号天然携带了有效数据的边界信息,不容易出现同步错位。实际项目中我选择DE模式还有一个原因:FSMC接口配合DMA搬运数据时,DE信号可以直接由像素数据流中的blank区域来生成,省掉一根SYNC信号线的布线压力。

这块屏能做什么、适合谁参考?我的定位是:嵌入式工程师、单片机玩家、以及做HMI(人机界面)方案选型的硬件工程师。内容包含完整的时序参数解析、FSMC+DMA驱动方案、GOA双边缘时钟策略、背光亮度与PWM联动,以及调试过程中遇到的同步问题和排查方法。如果你正准备用JDI的屏做项目,或者手头有类似接口的TFT屏需要调时序,这篇文章可以帮你少走至少一周的弯路。

1.2 方案选型:为什么选中FSMC而不是SPI或RGB直连

LAT1313的接口类型是RGB并行接口,主控侧可以通过SPI转RGB桥接芯片、RGB直连、或者FSMC模拟RGB时序来驱动。项目主控用的是STM32H743系列,自带FSMC外设,外部存储器接口支持NOR Flash和SRAM时序,恰好能模拟RGB LCD的写时序。FSMC方案相比SPI方案的优势很明显:带宽高、不占用CPU、DMA可以自动搬运整帧数据;相比RGB直连方案,FSMC不需要专用的LTDC外设,只要引脚够、时序配置对,就能跑起来。

实际选型时我算过一笔带宽账:LAT1313分辨率是800x480,24位色深,60Hz刷新率,原始像素时钟大约需要800x480x24x60,换算下来数据率在530Mbps左右。如果走SPI,即使4线Quad SPI跑到100MHz,带宽也只有400Mbps,加上协议开销必然卡顿;FSMC的16位写时序在STM32H7上能跑到约70MHz的写周期,数据率折合1120Mbps,完全够用。所以在嵌入式Linux或裸机环境中,FSMC+DMA是性价比最高的方案,这也是我最终选型核心理由。

选择FSMC方案还有一个隐藏优势:它天然适合做局部刷新。用DMA传输一整行数据到FSMC数据线,再配合地址线拉高/拉低控制RS引脚,可以精确定位到屏幕的任意行和任意区域。LAT1313的驱动时序里,像素数据是逐行扫描的,FSMC的地址映射可以做到“写一次数据,DMA自动跳转到下一行地址”,这个特性对滚动显示和局部刷新非常友好。

2. 驱动时序基础与关键参数解读

2.1 先搞懂行场同步、像素时钟和DE信号的关系

LCD驱动时序的核心可以归成四条线:像素时钟(DCLK)、行同步(HSYNC)、场同步(VSYNC)、数据使能(DE)。DCLK决定每个像素点数据的锁存时刻;HSYNC标记每一行数据的起始;VSYNC标记每一帧的起始;DE信号拉高时表示当前DCLK上的数据是有效像素。LAT1313的数据手册里给出了典型时序参数,但在实际项目中必须根据主控FSMC的时钟频率做换算,不能直接照抄。

一个常见的误区是把DE模式和SYNC模式混为一谈。DE模式下,HSYNC和VSYNC可以不用接,只要DE为高就认为是有效像素;SYNC模式下,DE可以不用,但HSYNC和VSYNC必须精确对齐到像素数据的边界。LAT1313官方推荐DE模式是有道理的——两种模式虽然屏幕都能点亮,但DE模式对主控的时序容错更好。比如你用FSMC模拟RGB时序时,由于FSMC是以“写事务”为单位工作的,每次写入之间会存在若干等待周期,这会导致DCLK不是严格均匀的,DE模式下屏幕能容忍这种抖动,SYNC模式则可能出现行错位。

像素时钟的计算公式可以从数据手册的Horizontal Timings和Vertical Timings里推出来。假设水平总周期为HTotal,垂直总周期为VTotal,刷新率为60Hz,则DCLK = HTotal × VTotal × 60。LAT1313在800x480@60Hz下,HTotal典型值是1056(含HSYNC脉冲、HBP、HFP),VTotal典型值是525(含VSYNC脉冲、VBP、VFP),算下来DCLK约33.26MHz。这个数值决定了FSMC的时序参数上限,如果FSMC写周期配置过快或者过慢,都会导致显示异常。

2.2 水平时序和垂直时序的逐项拆解

LAT1313的手册里,水平时序分为四个阶段:HSYNC脉冲宽度、Horizontal Back Porch(HBP)、有效像素区、Horizontal Front Porch(HFP)。HSYNC脉冲宽度的作用是为屏幕内部的行驱动器提供复位基准;HBP是行同步之后到有效数据开始这段空窗;HFP是有效数据结束到下一行HSYNC之间的空窗。这三个参数配错会导致图像左移或右移,但屏幕还是能亮,所以很多人会忽略。

垂直时序同理,VSYNC脉冲宽度、Vertical Back Porch(VBP)、有效行区、Vertical Front Porch(VFP)。VBP配错会导致图像上下偏移,VFP配错则可能导致屏幕顶端出现滚动噪点。我在调试LAT1313时遇到过一次图像整体下移约20像素的问题,排查后发现是VBP被配置成了20而实际需要23,相差3个行周期,屏幕内部的行驱动器就会把同步基准往后延,最终表现为图像偏移。

重要提示:LAT1313的数据手册中给了Typical、Min、Max三列参数。建议所有配置严格落在Min到Max范围内,且优先使用Typical值。因为JDI的屏出厂时会以Typical值为基准做Gamma和VCOM校准,偏差过大可能导致屏幕发白或偏色。

在FSMC实现层面,水平时序的HBP和HFP可以映射为FSMC地址线在数据传输前后的无效填充周期,也可以直接在DMA发送的数据缓冲里人为插入无效像素。我推荐后者——把HBP和HFP的无效像素用内存填充好,这样FSMC只需连续搬运整行像素即可,时序更容易保证。

2.3 DE模式与SYNC模式的取舍建议

LAT1313支持DE和SYNC两种模式,但并不是所有JDI模组都支持,选型时一定要确认。DE模式的连接方式更简单:主控只接DCLK、DE、数据线,HSYNC和VSYNC悬空或接固定电平;SYNC模式则必须接全部5类信号。从接口可靠性角度看,DE模式少了两根同步线,PCB布线时抗干扰能力更强,EMI风险也略低。

但从时序校准角度看,SYNC模式更直接:主控可以精确控制每一行和每一帧的起始时刻,配合示波器也能更快定位异常。DE模式下如果FSMC的DMA突发传输之间出现较长空闲,DE信号会出现毛刺,屏幕可能偶尔跳一行。这在实际调试中很常见。

我个人的建议是:如果你的主控FSMC配置得当、DMA优先级合理,优先使用DE模式;如果后续要支持低刷新率或动态帧率,SYNC模式更好,因为VSYNC可以做帧同步触发。LAT1313这个项目最终用了DE模式,配合DMA双缓冲,实测下来在60Hz刷新率下没有出现跳行或撕裂。

3. GOA驱动与双边同步发送策略

3.1 GOA到底是什么,为什么会影响时序设计

GOA(Gate on Array)是把Gate Driver集成在LCD玻璃基板上的技术,JDI的中大尺寸屏大量采用。传统方案里,Gate Driver是独立IC,通过COF或COG绑定在玻璃上;GOA方案直接利用TFT阵列逐级传递扫描信号,省掉Gate IC,成本和功耗更低,但带来一个约束:扫描信号的传递必须像多米诺骨牌一样,一级一级往下接力,不能跳级。

在LAT1313这类采用GOA的屏上,行扫描顺序依赖Clock信号的边沿触发。数据手册里通常标注为CPV信号(Clock for Gate)或者GOA Clock,要求主控在每一行有效数据开始时提供一个完整时钟边沿。这里要特别注意的是,GOA的时钟边沿和像素数据的对齐关系非常严格,如果边沿对齐偏差超过半个像素时钟,屏幕顶部可能会出现几条横向亮线或暗线。

更麻烦的是,LAT1313的GOA模块为了满足窄边框需求,采用了双侧驱动结构,也就是左右两侧各有一条GOA扫描链。为了保证两侧扫描链同步,主控输出的GOA时钟必须是“双向同步发送”——同一时刻在左右两侧的时钟线上同时给出相同波形,否则两侧的行扫描速度不一致,屏幕会出现从中间向两侧扩散的渐变色阶断层。

3.2 传统双边同步发送的实现方法

我在调试LAT1313时,第一次只接了单侧时钟线,结果屏幕左侧正常、右侧有约3像素宽度的灰度渐变。后来翻JDI的参考设计文档,才发现需要把同一个定时器的两个通道同时输出GOA时钟,一个接左侧,一个接右侧。这种“传统双边同步发送”本质上利用了MCU定时器的多通道同步特性。

具体实现上,用STM32H743的高级定时器TIM1输出两路PWM频率相同的时钟信号,分别接到LAT1313左右两侧的CPV引脚。为了保证两侧时钟相位完全一致,必须把两个通道配置为同一种输出模式(比如PWM Mode 1),且共用一个计数器。TIM1的RCR寄存器(重复计数寄存器)可以用来精确控制GOA时钟的脉冲个数,每一行对应一个脉冲,这样可以避免DMA搬运像素数据与GOA时钟不同步的问题。

关键参数参考:LAT1313的GOA时钟频率等于行频率,即60Hz x 525行,约31.5kHz。脉冲高电平宽度建议设置在1~2个DCLK周期,即约30~60ns。用逻辑分析仪抓波形时,要同时抓两路Clock和DE信号,确认左右两侧的Clock上升沿和DE的起始位置对齐到同一个DCLK周期内,偏差不能超过1个DCLK周期。

3.3 双边同步背后的时序风险与规避方案

双边同步最大的风险不是硬件连接错误,而是主控侧“看似同步、实则错相”。比如TIM1和TIM8如果各配置一路Clock,即使频率完全一致,相位差也可能有几个时钟周期,因为两个定时器的计数起始点不同。这时屏幕会表现为:某个亮度下从中间边界处有一条垂直细线。要避免这个问题,必须用同一个定时器的多个通道,而不是多个定时器。

另一个风险在初始化顺序。LAT1313上电后,GOA模块需要先接收到若干个时钟脉冲才能建立稳定的内部扫描链,如果在初始化序列的“设定GOA起始脉冲”阶段没有发送足够的时钟,屏幕会延迟一帧才正常显示。JDI的参考驱动代码里,通常在开显示(Display On)之前会发一段空行数据,目的是让GOA扫描链先跑起来,这一步在时序设计里千万不能省。

实操方法:在进入正常显示循环之前,先给GOA时钟线发送至少VTotal个脉冲,VTotal取525。可以在DMA初始化时不传有效像素,只传一帧纯黑数据,让GOA链完整走一遍。等下一帧有效图像进来时,扫描链已经在正确的位置,这样能有效避免“开机闪白”或“首帧偏色”。

4. 主控侧配置:FSMC+DMA驱动LCD的同步问题

4.1 FSMC的地址映射与LCD的RS引脚如何对接

LAT1313的寄存器写入和显存写入是分开的,通常用RS(Register Select)引脚区分。RS为低时,数据线传的是命令;RS为高时,数据线传的是像素数据。在FSMC方案里,可以通过地址线映射来实现RS的控制:把LCD的RS接到FSMC的A18地址线,那么CPU访问Bank1的某个基地址时,A18为低;访问基地址加上0x40000偏移时,A18为高。这样写命令和写数据在代码里就是访问两个不同的内存地址,DMA也只需要搬运到对应的数据地址即可。

具体配置代码参考:

#define LCD_REG ((uint32_t)0x60000000) // RS = 0 #define LCD_RAM ((uint32_t)0x60040000) // RS = 1(A18置位) void LCD_WriteReg(uint16_t reg, uint16_t data) { *(volatile uint16_t *)LCD_REG = reg; *(volatile uint16_t *)LCD_RAM = data; }

FSMC的NOR/SRAM时序配置里,最关键的三项是ADDSET(地址建立时间)、DATAST(数据建立时间)和HOLD(保持时间)。LAT1313的写时序要求DCLK至少33MHz,换算成周期约30ns。FSMC的写周期不能短于这个值。在STM32H743主频480MHz下,HCLK约240MHz,1个FSMC时钟周期约4.17ns。我最终用的参数是ADDSET=15、DATAST=30,HOLD=1,换算后总写周期约为(15+30+1)x4.17ns,约192ns,远大于官方手册要求,实际显示效果稳定。

4.2 DMA双缓冲解决撕裂和画面闪烁

只靠FSMC写数据是不够的,因为单缓冲模式下,CPU要一边从Flash或SDRAM读取图像数据,一边写给LCD,容易出现显示闪烁。LAT1313的显存是模组内置的,主控只需要持续把像素数据流灌进去即可。但为了防止“写入半帧时屏幕开始刷新”导致画面撕裂,我启用了DMA双缓冲。

DMA双缓冲的核心逻辑是:DMA在传输第一帧时,CPU往第二缓冲写入下一帧数据;DMA传输完成产生中断后立即切换源地址到第二缓冲,CPU继续填第一缓冲。这样LCD始终在读取一个完整帧,不会出现半个新帧和半个旧帧混合的错误图像。

配置DMA时要注意设置高优先级,且数据宽度必须与FSMC一致。LAT1313的RGB接口虽然是24位色深,但FSMC数据总线只有16位,所以显存采用RGB565格式,像素数据宽度是16位。DMA的PSIZE和MSIZE设为HalfWord,Peripheral地址指向LCD_RAM,Memory地址指向显存缓冲区,Direction为MemoryToPeripheral。

4.3 同步问题实战:DE信号毛刺和行错位

FSMC+DMA方案常见的同步问题有三个:DE信号毛刺、行数据错位、帧起始抖动。

DE信号毛刺的根源在FSMC空周期。当DMA每传输4个字节(2个HalfWord)需要重新仲裁总线时,FSMC的地址线会短暂跳变,如果DE恰好在这个跳变沿,屏幕就会捕获到错误的行起始位置。解决办法是把DE信号从FSMC的NOE引脚引出,并配置为在写事务期间保持稳定,而不是从GPIO翻转模拟DE。

行数据错位的典型表现是屏幕出现斜向的“撕裂带”,但动的不是整屏而是部分区域。这通常是HBP或HFP配置与FSMC写周期匹配不当导致。LAT1313的数据手册要求HFP典型值为160个DCLK周期,如果你在DMA缓冲里少插入了一些无效像素,屏幕内部的行缓冲会在下一行数据到来之前提前锁存,表现为图像整体左移或右移。

帧起始抖动则与DMA中断响应延迟有关。当DMA传输完一帧产生中断后,如果系统没有立即配置下一次传输,LCD的VSYNC/DE会等待下一个有效帧起始,导致刷新率忽高忽低。解决办法是把“切换缓冲”的任务放在DMA中断里直接做,不要花时间在中断里做数据处理,只改源地址和传输长度。

5. 亮度调节与时序的联动细节

5.1 亮度控制的两种路径:PWM和寄存器

LAT1313这类JDI屏的背光通常由单独的LED驱动IC控制,亮度调节路径有两条:直接调背光LED驱动的PWM占空比,或通过LCD模组的CABC(Content Adaptive Brightness Control)寄存器。CABC功能需要模组内部统计图像的平均亮度,再自动调整背光,但对主控来说增加了I2C通信和算法复杂度。我的建议是,在嵌入式项目里优先用PWM直接控制背光,响应快、代码少、逻辑透明。

PWM调光的频率选择有讲究。LAT1313内置的是白光LED,PWM频率低于500Hz时,人的眼睛能感觉到闪烁,尤其在低亮度下更明显。我最终选的PWM频率是20kHz,完全超出人眼可感知范围,同时避开LCD驱动扫描干扰。占空比调节范围建议限制在1%~100%,因为低于1%时LED驱动IC的非线性区可能导致亮度突变。

5.2 亮度与内部Gamma的匹配

LAT1313的显示效果除了背光亮度,还受VCOM(公共电压)和Gamma校正影响。如果背光PWM占空比调低,屏幕整体变暗的同时,暗部细节容易丢失。这是因为LCD面板的Gamma曲线是固定的,背光变暗后,低灰度等级的分辨率会被压缩。要缓解这个问题,可以在亮度调低时同步切换Gamma寄存器组,JDI在手册里提供了两组Gamma曲线,一组适合高亮度,一组适合夜间模式。

实际项目中,我发现一个更省事的方案:把调光曲线做成非线性映射,PWM占空比在低亮度区间采用指数曲线而非线性曲线。比如占空比从0到255的调节,实际输出采用平方关系,这样人眼感觉到的亮度变化更均匀,也能减少暗部细节的丢失。

5.3 背光时序的开机和关机顺序

LAT1313对背光上电和断电顺序有要求,不能随意。背光LED驱动应该在LCD显示控制器初始化完成后点亮,否则屏幕先亮起会出现几秒的白屏或花屏。关机时则要反过来,先把背光关闭,再关显示控制器和像素时钟,避免出现“屏幕黑底上残留一行亮线”的现象。

具体顺序我固化在代码里:

  1. 配置LCD接口和FSMC初始化
  2. 发送初始化命令序列(含Display Off)
  3. 配置PWM背光,但保持占空比为0
  4. 发送Display On命令
  5. 延时50ms后把PWM占空比逐步从0升到目标亮度

这样做的好处是,LCD的像素时钟和数据通道先稳定,亮屏瞬间不会看到电源纹波导致的横向干扰条纹。如果项目有前一个版本的驱动代码是“先点亮背光再初始化LCD屏幕”,建议尽快改过来,这一点在实际项目中非常值得注意。

6. 常见问题排查与实操心得

6.1 常见问题速查表

我在整个调试过程中整理了下面这张问题排查表,覆盖了从时序参数到硬件接线的各种常见异常。这个表是根据LAT1313实际调试经验总结的,其他JDI屏也可以参考。

现象可能原因排查手段解决参考
屏幕白屏但背光亮初始化序列未正确发送检查RS引脚电压、I2C或并口命令波形重新上电抓初始化波形
图像整体左移/右移HBP或HFP配置错误逻辑分析仪抓DE有效起始位置调整水平时序无效像素数
图像上移/下移VBP或VFP配置错误对比首行数据与VSYNC位置调整垂直时序无效行数
顶部数条横线GOA起始脉冲未被正确触发检查CPV/GOA Clock波形增加开机空帧脉冲
左右亮度不均或彩色渐变双边缘GOA时钟未同步双通道示波器同时抓两侧CPV改用同一定时器双通道输出
画面撕裂DMA单缓冲导致新旧帧混合屏幕显示过程中修改帧缓冲改DMA双缓冲
屏幕闪烁PWM调光频率过低肉眼可见闪烁PWM频率提升至20kHz
开机白屏后跳黑背光先点亮但显示未就绪上电顺序分析调整开背光时序到LCD初始化之后
特定灰度下有噪点像素时钟过冲或信号反射示波器观察DCLK边沿串联33Ω电阻并调整FSMC时序

这张表的思路是:先肉眼判断显示异常的规律,再用逻辑分析仪检查时序波形,最后回到参数配置。很多问题不需要改PCB,改时序参数就能解决。

6.2 调试时序时我踩过的三个坑

第一个坑:直接把STM32显示例程的时序参数抄进来。不同厂商的LCD列屏对行场同步信号的极性要求可能相反。LAT1313要求HSYNC和VSYNC在无效期间为高电平,但另一个常见型号则为低有效。抄例程前一定要看数据手册的Polarity说明,否则会出现图像颜色正常但几何位置错乱的奇怪现象。

第二个坑:DE模式下忘了把HSYNC/VSYNC引脚设置为高阻或上拉。LAT1313在DE模式下不要求这两根信号,但如果它们悬空或受到干扰,内部逻辑可能会误判同步模式。我一开始没处理这两个引脚,屏幕偶尔闪黑,后来把它们接固定电平,问题就消失了。

第三个坑:DMA传输长度与实际像素数不匹配,导致屏幕右侧出现一条竖条纹。由于LAT1313的DE信号是在有效像素区间内拉高,如果DMA把无效像素也算进传输长度,DE会被拉长,屏幕内部的行缓冲会收到多余数据。最后我把DMA传输长度精确设置为800个HalfWord,并在行末手动插入HFP对应的等待周期,问题才解决。

6.3 我的实操心得与建议

经过这个项目,我最大的体会是LCD时序调试不能靠猜,必须用逻辑分析仪或示波器实测波形。FSMC+DMA的方案虽然经典,但每个主控的FSMC时钟和总线仲裁逻辑不同,照搬参数一定会出问题。建议第一次上电时,把像素时钟降到10MHz以下,确认图像能正常显示后再逐步提速,这样能避免高速下的信号完整性干扰。

另外,LAT1313的源码里最好保留一份“纯寄存器初始化+固定图像测试”的最小工程。这片代码只负责点亮屏幕并显示纯色和彩条,不涉及业务逻辑。后续只要屏幕显示异常,先用这个工程排除硬件问题,再回到应用代码定位,效率会高得多。

最后想说的是,JDI的屏整体质量很稳定,但不同批次可能存在细微的VCOM差异。如果发现同一套代码在不同批次屏幕上亮度略有不同,不要急着改时序,先用示波器测一下VCOM电压是否在规格范围内。我实测过两个批次,VCOM偏差约0.2V,通过调整寄存器重新校准后亮度就一致了。这类问题在量产中很常见,提前做好校准函数,后期会省很多麻烦。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 14:51:22

3步上手PowerShell:跨平台脚本与Docker容器管理完整指南

3步上手PowerShell:跨平台脚本与Docker容器管理完整指南 【免费下载链接】PowerShell PowerShell for every system! 项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell PowerShell 是微软出品的跨平台命令行外壳程序与脚本环境,覆盖…

作者头像 李华
网站建设 2026/9/11 11:30:38

3步用 draw.io 桌面版免费打开并编辑 Visio VSDX 文件

3步用 draw.io 桌面版免费打开并编辑 Visio VSDX 文件 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 同事发来一份 .vsdx 文件,你在 macOS 或 Linux 上打不开&…

作者头像 李华
网站建设 2026/9/2 0:41:30

5 分钟跑通三端 Expo 应用:新手向完整指南

5 分钟跑通三端 Expo 应用:新手向完整指南 【免费下载链接】expo An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web. 项目地址: https://gitcode.com/GitHub_Trending/ex/expo Expo 是一个开…

作者头像 李华
网站建设 2026/9/2 23:41:41

打破AI分析垄断:构建大模型多元评估体系实践指南

最近在给团队做 AI 产品方案评审时,我注意到一个特别的现象:不论讨论什么场景——客服、写作、代码生成、还是企业知识库问答,最后大家都会回到同一套话语体系里,比如“对齐”“幻觉”“温度参数”“评测集分数”。这些词本身没有…

作者头像 李华
网站建设 2026/9/4 14:40:04

Tokens per Second:大模型推理速度的测量与优化全解析

看到 Celeris-1 以 2158 tokens/s 的生成速度登顶 AI 推理速度排行榜时,很多开发者的第一反应是:这个数字到底意味着什么?在真实项目中能不能复现?我自己部署模型之后,怎样测量并优化这个指标? 本篇文章不…

作者头像 李华