打印
[应用相关]

Stm32 LCD彩屏开发笔记

[复制链接]
183|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  嵌入式产品离不开显示,比如示波器显示一些波形啦,手环显示一些健康参数啦。这个时候就需要LCD屏幕以及其驱动器。

LCD工作原理
      LCD是“Liquid Crystal Display”的缩写,中文翻译为“液晶显示器”。每个像素点,由RGB三种原色组成,通过控制RGB三原色不同的配比来生成任意颜色。那么问题来了怎么控制一个像素点的一个原色(R或G或B)的亮度呢?顾名思义就是利用LCD液晶材质的光电特性。



LCD的一个像素
     如上图,LCD由背光层,垂直偏光片,正极电路,液晶层,负极电路,水平偏光片,彩色滤光片组成。这里会涉及到光的偏振方向问题,是偏振方向,不是光的照射方向,涉及到光学原理。简单理解下:垂直偏光板能通过垂直光(偏振角度为90度),但无法通过水平偏光(偏振角度为零)。水平偏光片偏光板能通过水平光,但是无法通过垂直光。

   光源发出的光是各种颜色,然后先经过垂直偏光板滤出垂直光,然后垂直光经过水平偏光板直接滤出的话就没了,变成了合适。这个时候神奇的地方就来了,在垂直和水平偏光板之间加了层液晶,它可以改变光的偏振方向,使得过来的垂直光变成60度或30度偏振光,这样这些光就可以穿过后面的水平偏光片了,不至于显示黑色。通过在正负电路之间施加不同的电压,使得液晶分子的排列不同,进而使得其对光角度的影响发生变化,最终达到控制光线强弱的效果。



OLED的一个像素
      相比之下OLED工作原理则简单粗暴,如上图,每个像素直接由RGB三种颜色的发光二极管组成,直接控制发光二极管的亮度,生成不同颜色。虽然原理简单,但其优点颇多(1) OLED没有背光板,并且每个像素都可以独立控制,因此我们可以以低功耗的形式进行局部区域的刷新,比如手机的时钟。(2)相对于LCD其黑色就是纯黑色,对比度非常高。(3) 刷新速率非常快,不会出现残影。(4) 可以做的更薄。

LCD驱动架构
      前面我们已经知道一个像素的工作原理了,那么把像素排列成矩阵就构成了LCD屏幕,是不是跟内存很像,内存的本质也是位矩阵。就像CPU要访问内存一样,给出一个地址,地址译码器把它转化成行和列选通信号。LCD阵列同样也需要行列选通信号。行列选通信号太底层,我们需要进一步进行封装和抽象,衍生出lvds/rgb/MCU-8080等接口。这些接口定义不同,应用场景,速率以及支持的分辨率都不一样。这个封装和抽象的任务是由液晶驱动IC来完成的,也就是说这些接口是液晶驱动IC提供的。



DPI接口



DBI接口(MCU接口)
     例如,SSD1306则只提供了MCU接口。ILI9341和ST7789则既提供了MCU接口和又提供了RGB接口,ILI9488更为强大可以提供MCU接口,RGB接口。

      MCU接口与RGB/lvds/等底层接口相比其抽象层次更高,也就是说它提供了更完备的功能。驱动IC芯片内自带显存,我们只需要通过8080并口或spi串口往驱动IC里发命令和数据就行,命令指示了在哪里显示,数据则指示了显示的颜色,这样就可以节约mcu的资源用来做其他事情。通常显存较小,适用于低分辨率,低刷新速率的场景。而rgb/lvds一般都是与高端芯片进行连接,这些芯片内部自带LCD控制器,LCD控制器在内存中开辟显存,可以结合图形加速器提高显示性能(比如stm32的H7系列高端芯片,s3c2440,rk3588,imx6ull),适用于高分辨率,高刷新率场景。也就是这些LCD控制器对内接收CPU的绘图指令,对外输出lvds/RGB等底层信号。

    在MCU开发过程中主要用到的就是上述接口,然后还有edp,mipi-dsi,hdmi等接口是更加高端的接口,用于电脑,智能手机领域,这里我不做研究。



LCD模块(LCM)
       如上图所示,我们买到的通常是LCM(LCD Module)即LCD模组。其包含了液晶显示器(LCD),控制驱动芯片,PCB板,背光源,结构件以及连接器等诸多部件装配在一起的组件,甚至连触摸芯片也内置了。这样就节省了我们大量的时间了,但这同时也阻碍了我们对底层原理的理解。

LCD接口
RGB接口(TTL电平)



LCD像素扫描过程
        如上图所示,LCD显示一帧图像时是一个像素一个像素地刷新的,从左上角开始一直到右下角。因此,就必然有信号控制每个像素的刷新速度,换行信号,以及这一帧结束下一帧率开始的信号,这些信号如下:



RGB接口信号线
(1) 垂直同步信号, VSYNC (Vertical Sync):指示显示器开始新一帧的绘制。每当 VSYNC 信号的到来时,显示器会清空当前图像并准备绘制新的一帧。

(2) 水平同步信号 HSYNC (Horizontal Sync):指示显示器开始绘制新的一行。当 HSYNC 信号到来时,显示器会开始从左到右绘制当前行的像素。

(3) 定点时钟信号PCLK (pixel Clock):控制像素数据的传输速率。

(4) 数据信号线 DATA bus:用于传输像素颜色数据。

(5) 数据使能信号 DE:指示像素颜色数据的有效性。



接口时序图
如上图所示有垂直上三个时间VSPW,VBPD,VFPD。

VSPW (Vertical Sync Pulse Width):垂直同步脉冲的宽度,即垂直同步信号高电平持续的时间。

VBPD (Vertical Back Porch Duration):VBPD 是垂直后沿时间,即在垂直同步脉冲结束后,显示器在开始显示新的帧之前的时间(此时间用于等待电子枪移动)。

VFPD (Vertical Front Porch Duration):垂直前沿时间,即在垂直回扫结束后,显示器开始显示新帧之前的空闲时间(此时间用于等待显示稳定和消隐)。

同样在水平方向上也有三个时间:HSP,HBP,HFP。定义的话也是对称的:

HSPW (Vertical Sync Pulse Width):垂直同步脉冲的宽度,即垂直同步信号高电平持续的时间。

HBPD (Vertical Back Porch Duration):VBPD 是水平后沿时间,即在垂直同步脉冲结束后,显示器在开始显示有效数据之前的时间(等待电子枪移动)。

HFPD (Vertical Front Porch Duration):水平前沿时间,即在垂直回扫结束后,显示器开始显示新帧之前的空闲时间(等待显示稳定和消隐)。

     个人认为水平前沿时间(HFP),是为了等待一段时间,让本行显示稳定,然后再开始下一行的显示,不然可能会出现显示的闪烁。然后垂直前沿时间(VFP)是为了让这一帧显示稳定并消隐后,再开始一帧的显示,否则就会出现显示的撕裂。其实等待电子枪移动的时间是不需要的,使用数字电路译码器可以快速选通某个像素点,这些名字时间的存在是为了兼容以前的CRT显示器。



用RCT理解LCD时序参数
     为了更好地理解后延时间,我们先假设没有后延时间(HBP,VBP)。上图把LCD驱动器IC比喻成电子枪,LCD控制器使用RGB接口控制这个电子枪。控制器从显存中拿像素数据传给电子枪,电子枪负责往屏幕上发射像素。成像过程如下:①LCD控制器发出VSYNC信号告诉电子枪,要开始新的一帧了,这时电子枪开始把枪头调转到LCD屏幕的左上角。②与此同时,LCD控制器发出HSYNC信号(告诉电子枪新行开始, 从左向右动发射子弹吧)。但是由于电子枪接收到VSYNC信号后需要一定的扭转反应时间,这大概需要几个HSYNC信号周期的时间。因此在上图的时间窗口上方出现了无效区。③当第一行扫描结束时,LCD控制器又发出HSYNC信号,但电子枪枪头扭转到下一行新行也需要时间,大概需要几个像素周期。所以出现左边的无效区。④循环这三个过程,就会形成带有无效数据的环形时间窗口。 加入后沿时间(VBP和HBP)就可以解决上述问题。

     总而言之,前沿时间(VFP,HFP)是针对液晶分子的惯性(液晶分子偏振方向的改变需要时间/等待显示稳定或消隐)所加的时间;后延时间是针对电子枪的移动需要时间。

     RGB时序接口可以分为三种模式:(DE模式,SYNC模式,DE+SYNC模式),其区别在于是否使用DE信号,使用DE进行有效像素的筛选,控制更为灵活,但控制难度也大。

LVDS接口(低压差分电平)
     LVDS采用低压差分技术克服了TTL接口在高码率数据时功耗大、电磁干扰大的缺点。其传输的信号与RGB接口的本质是一样的,传输颜色信号,垂直同步信号,水平同步信号,只不过是把TTL电平改成了低压差分信号,优化了传输。说明白点就是低压节省了功耗,差分抵抗了干扰,串行节省了线数。



LVDS接口示意图
     如图,LVDS接口电路包括两部分,即主板侧的LVDS输出接口电路(LVDS发送端)和液晶面板侧的LVDS输入接口电路(LVDS接收器)。发送端负责把RGB信号转化成lvds信,接收端负责把lvds信号转化成RGB信号。那么lvds信号到底长什么样子?



TTL转lvds芯片
    上图为lvds发送芯片DS90C387。输入是并行的RGB888信号,在转换芯片的一个时钟周期内,R,G,B数据按位并行传输,总共使用24条数据线和3条同步信号线。输出是串的差分信号,包含10对差分信号,8对用于传输数据(RGB+同步信号),2对用于传输时钟。在芯片的一个工作时钟周期内,每对差分线传输7位数据。那么RGB信号与lvds信号之间又是怎么对应的呢?两种标准:VESA和JEIDA。



     如上图,以RGB666信号为例进行说明,在转换芯片的一个时钟周期内,需要传输[18+1+1+1] 21位数据。恰好3个(21/7)差分对就可以完成对这21位数据的传输。同理RGB888的话需要4个差分对(27/7),RGB101010的话需要5个(33/7)。VESA与JEIDA格式相似,不同之处在于RGB的位分布不同。像素时钟信号不编码在串行信号内,它使用额外一条差分对进行传输。

     通道指的是一个像素的完整的传输(包括RGB,水平同步,垂直同步,DE)。通常,LVDS 接口的时钟为 20MHz 到 85MHz ,因此对于输出像素时钟低于 85MHz 的信号,只需一个 通道就可以。而对于输出像素时钟高于 85MHZ 的信号,比如 1080P/60HZ 的输出,像素显示时钟为 148.5MHz ,就不能只传输一个通道了,而是将输出的像素按顺序分为奇像素和偶像素,将所有的奇像素用一组差分线传输,所有的偶像素用另外一组差分线传输,也就是两个通道。在芯片的一个时钟周期内传输两个像素,分组并行,提高传输速率。对于像素显示时钟更高的信号,比如 1080P/120HZ 显示,则需要 4 个 通道来传输。当然通道越多所需要的差分对越多,需要转接芯片的性能就更强,常见的分类可以有以下几种:

①单路6bit LVDS:采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,也称18位或18bit LVDS接口。

②双路6bit LVDS:采用双路方式传输,每个基色信号采用6位数据,其中奇路数据为18位,偶路数据为18位,共36位RGB数据,也称36位或36bit  LVDS接口。

③单路8bit LVDS:采用单路方式传输,每个基色信号采用8位数据,共24位RGB数据,也称24位或24bit LVDS接口。

④双路8bit LVDS:采用双路方式传输,每个基色信号采用8位数据,其中奇路数据为24位,偶路数据为24位,共48位RGB数据,也称48位或48bit LVDS接口。

解下来就看看lvds信号的时序图吧,加深理解:



单路18位lvds信号时序
     上图中NA表示未使用。控制信号仅有DE(DE模式),未使用行同步信号HS和场同步信号VS。当使用(DE+同步信号模式时),图中的两个NA更换为场同步信号VS和行同步信号HS。



双路18位lvds信号时序
        从图中可以看出,双路6bit LVDS发送芯片数据输出格式与单路6bit LVDS发送芯片数据输出格式是相同的,只不过一路传送奇数像素RGB数据,另工路传送偶数像素RGB数据。OR0、OR1、…中的“O”代表奇数像素,ER0、ER1、…中的“E”代表偶数像素。

MCU接口
       LCD模组提供给MCU的接口可以是8080并口,也可以是高速串口SPI。只是通信接口的类型不同,其操作逻辑是相似的,即向LCD模块写指令进行控制(颜色反转,伽马值设置,设置行列地址等命令)。向LCD模块写RGB颜色数据,其控制流程如下:



MCU接口LCD使用流程
     下面以ILI9341为例进行描述,不同的芯片在具体接口的具体时序以及命令的定义是不同的,但整体控制思路是相同的。

8080接口
       虽然8080微处理器已经被时代逐渐淘汰,但是由于8080的并行总线协议,在扩展方面及数据传输方面的优越性被保留了下来。很多追求高速,近距离的接口和传输方式依然使8080总线,比如CPU扩展外部的RAM和ROM,LCD、打印机等广泛使用。其他的并口包括6800也是并口,与8080相似。下面介绍了8080并口的时序。



8080写时序



8080写周期
       如上图为8080接口的时序图,CS为片选信号。RES为复位信号。D/C为命令数据选择信号,低电平表示命令,高电平表示数据。WR是写信号。RD是读信号。D[17:0]是数据信号。在WR的下降沿,CPU写数据到的数据线D[0:15],在WR的上升沿ILI3941从数据线上读取数据。



8080读时序



8080并口读周期
在RD的下降沿,ILI9341写数据到的数据线D[0:15],在RD的上升沿CPU从数据线上读取数据。

SPI接口
      SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于微控制器与各种外设之间的通信,如传感器、存储器、显示器和其他微控制器等。SPI 接口由 Motorola 在 1980 年代提出,并已成为许多设备的标准通信协议。

     ILI9341提供了3线SPI和4线SPI,3线SPI提供了:片选CS,数据线SDA, 时钟线SCL。看着怎么这么像IIC,不是的,3线SPI没有复杂的寻址和应答策略。就是片选,然后传命令和数据。4线SPI比三线SPI多了一条D/C数据/命令选择线。因此就导致了连着数据帧格式存在差异,也就是说三线SPI必须把D/C信号作为一个数据位放在数据帧里进行传输,如下图。



3\4线SPI数据帧格式
        这与我们常说的3线SPI是半双工,四线SPI是全双工不同。以上两者均为半双工通信,即同一时刻数据的传输方向只能是一个方向。



三线SPI时序图(有间隔)



三线SPI时序图(连续传输)
       如上图,在SCL的下降沿CPU给出数据,在上升沿ILI9341进行数据的读取。可以实现连续地写数据/命令或者在数据与数据之间利用CS进行停顿。

Stm32驱动LCD
LCD控制器(LTDC) 驱动 LCD
LTDC介绍
      Stm32的高性能(STM32F429/F750/F767/H743/H750)系列提供了LCD控制器,可以直接与RGB接口进行连接,结合DMA2可以大幅度提升LVGL等图形界面库的帧率,真牛X21年的时候我还在用RA8889芯片,没想到如今STM32直接内置了。前面讲了RGB接口的一些时序参数(VBP,VFP,VSW,HBP,HFP,HSW),直接在LTDC的寄存器进行配置就可以了,然后像素时钟直接在时钟控制相关寄存器配置就可以了。这里,我们重点介绍LTDC的强大功能。

     Stm32的LCD控制器特性:①支持多种像素格式,RGB888,RGB565,ARGB8888。②支持两个图层,并且两个图层之间可以实现ALPHA混合。③可编程的显示窗口位置。④高达4个可编程中断事件。⑤支持L8、 AL44 和AL88 输入像素格式(即支持索引色)。 ⑥ 可以结合DMA2D实现加速,减轻CPU的负担。



LTDC主框图
         如上图。在每个像素时钟的边沿,首先LTDC层从FIFO中检索一个像素数据,其次通过PFC将其转换为内部ARGB8888像素格式。然后将其与背景以及其他图层像素进行混合,汇合后的像素以RGB888格式编码。最后将RGB数据并行地,输出到RGB数据线上,同时也会根据相关寄存器配置生成垂直,水平,DE等控制信号。这样像素便会显示到屏幕上拉。

     ATTENTION:每个垂直同步信号到来时,LTDC会不断地读取显存内的内容,并刷新到显示器上(就是说LCD会同步显存与屏幕上的内容,这样我们图像处理和渲染就不能放在显存里,必须再开辟一个存储区域)。

(1)PFC是像素格式转换器,将RGB转化为ARPG。为什么需要转换?因为要混合就必须要有ahpha通道(透明度通道),如果PFC从FIFI中取得的ARPG像素则不需要转换,直接混合。如果取得的是RGB数据则要添加一个alpha通道,这个alpha通道中的值,在像素空间的任何位置都是一样的。



PFC工作示意图
(2)  抖动单元使用伪随机抖动技术,进行像素深度的转换。其实所谓的伪随机技术就是对像素值的低两位进行舍入(当然通过配置可以是3,或4位)。使得24位深度的像素可以自然地显示在16位的TFT-LCD屏幕上。

(3)然后就是三个时钟域了,AHB用来驱动AHB总线工作,以访问显存。APB用来驱动APB总线工作,以配置控制和状态寄存器。这两个时钟都是在系统初始化的时候配置好的。我们需要配置的就是像素域时钟了,它需要与LCD屏幕的像素时钟相匹配。

2个强大的图层
     每层一个 64x32 位的 FIFO,用来缓冲像素数据。LTDC有两个图层,每个层可以单独启用、禁用和配置,显示顺序由下至上,先显示图层1再显示图层2。两个图层之间可以进行混合(叠加),混合功能通过配置alpha值来激活。混合顺序固定,即由下至上。 如下图所示,如果使能了两个层,首先第 1 层将与背景色混合,随后第 2 层与第 1 层和背景的混合颜色结果再次混合。背景颜色可通过LTDC_BCCR寄存器使用RGB888格式进行编程。



ALPHA混合示意图



      如上式所示,所谓ahpha混合就是把两层的像素乘以系数再进行求和运算,可以实现两幅图像的叠加效果。若显存设置成RGB格式,则图像中的所有像素共享一个ahpha系数。若显存设置成ARGB格式,alpha通道自带透明度信息,每个像素点所乘的系数由alpha通道指示。



窗口显示
       并且每个图层都可以进行灵活的窗口位置和尺寸配置。可以显示完整图像或仅显示图像帧的一部分。



显存的配置
        最后两个图层显存(帧缓冲区)所在位置也可以灵活的配置,每个图层都可配置特定行数(长),行长(宽)和行间距。① 每个层的帧缓冲区均有一个起始地址,该地址通过 LTDC_LxCFBAR 寄存器进行配置。② 行长(以字节为单位)在LTDC_LxCFBLR寄存器中进行配置。③ 行数(以字节为单位)在LTDC_LxCFBLNR寄存器中进行配置。④ 行间距是指一行开始和下一行开始之间的距离,它通过LTDC_LxCFBLR寄存器配置(以字节为单位)。⑤ 像素输入格式可编程,LTDC每层最多可配置8种输入颜色格式。

存储控制器(FSMC)驱动 LCD
FSMC介绍
     stm32的高性能系列芯片才带有LCD控制器 ,对于一般芯片F103一般使用FSMC驱动LCD。FSMC能够驱动LCD-8080接口,其本质在于8080时序与SRAM接口的时序相似。FSMC提供的接口能够兼容LCD-8080接口,这里,我们将重点介绍这两种时序的相似性,并介绍如何兼容。



4个BANK及其地址分布



BANK所对应的设备类型和寄存器
     FSMC支持各种类型的存储器:PC卡;NAND型存储器( FLASH FLASH);NOR型存储器(NOR FLAH,SRAM)。这些存储器的地址被分配到0x60000000~0x9FFFFFFF的地址空间内,具体而言分成了4个BANK。 然后不同的BANK又分为四个区,每个区的大小为64M,使用NE信号选择不同的区,可以理解为:在FSMC AHB接口处。[HADDR30,HADDR31]这两根地址线被译码为FSMC选通信号。[HADDR28,HADDR29]这两根地址线被译码成4个BANK选通信号。[HADDR26,HADDRA27]这两条地址线被译码成4个NE选通信号。[HADDR0~HADDRA25]被送到FSMC的地址输出总线上,最终传给存储器。这里我们使用BANK1区域。



FSMC框图
       上图为FSMC框图,有些信号线是公共的,有些是NAND,NOR,PC,NOR所独有的。这里我们重点介绍NOR信号。具体来说:

FSMC_NE[4:1]为区选择信号(接存储器的片选信号CS)
FSMA_NL和NBL是高低字节选择信号接存储器的NL和NB(当存储器为16位,然后我们又想按字节寻址就会使用到这两个信号)
FSMC_NOE为读使能信号
FSMC_NWE为写使能信号
FSMC_NWAIT为等待信号
FSMC_A[0:25]为地址线(从这里可以看出,FSMC每个区支持的最大容量只能是64M)
FSMC_D[0:16]为数据线线。(从这里可以看出,FAMC支持的数据位宽度最大为16)。
使用FSMC兼容LCD-8080



信号接线图
      FSMC与LCD屏幕按照上述关系进行接线,这些接线关系就决定了我们代码里的命令地址和数据地址:CS接到了NE4上,表示将LCD屏幕分配到了BANK1的第四个子区域。其地址空间0X6BFFFFFF~0x6FFFFFFF,也就是往这个空间写数据就能选通LCD的CS。RS接到了A0,所以这个空间内的所有偶数地址使得RS为高电平,奇数地址使得RS为低电平。那么我们在 0X6BFFFFFF~0x6FFFFFFF这个地址空间内任意选一个偶数地址用来写命令,奇地址用来写数据就OK了。



FSMC支持的模式
    FSMC支持同步模式和异步模式,然后异步模式又有多种子模式,以适配不同的存储器类型。这里我们选择异步模式,的子模式A来兼容LCD-8080接口。下面将分析读和写时序兼容

(1) 读时序兼容



写时序对比
实现FSMC兼容LCD-8080,主要关注以下两个参数:地址建立时间,低电平时间。

地址建立时间:MCU在执行读命令后,地址A0被送到LCD的D/S端口,LCD接收到D/S信号后,需要等待一个时间,以选通内部命令/数据寄存器。这个等待的时间就被称为地址建立时间。左图中为tast,在右图中为(ADDSET+1)*THCLK,我们需要配置ADDSET使得地址建立时间(ADDSET+1)*THCLK满足上表中tast的值区间。

低电平时间:左图中为trdl,右图中为(DATASET+3)*THCLK。我们需要配置DATASET使得数据保持时间(ADDSET+1)*THCLK满足上表中trdl的值区间。

数据建立时间(读访问时间): 地址建立后,LCD在RDX信号的下降沿开始时输出数据,需要等待一个时间,使得输出数据稳定。这个时间称为读访问时间(数据建立时间)。左图中为trat,右图中没标出来。读访问时间tract在配置兼容时是可以不考虑的。无论它的值为多少,只要低电平时间一致,MCU总能读到正确的数据,因为MCU在上升沿的瞬间就可以完成数据读取。因此,我们通过设置低电平时间来间接满足数据建立时间。

地址保持时间:MCU在RDX上升沿开始读数据,D/S信号会保持一段时间,从而保证数据线上的数据稳定一段时间,方便MCU正确读取,此时间被称为地址保持时间。左图中为taht,右图中为0。如前所述,MCU在RDX上升沿瞬间完成数据的读取,因此不需要地址保持时间,直接在RDX的上升沿发出下一个地址。相当于地址保持时间为0,也满足表中taht的值区间。

读输出禁用时间(数据保持时间):MCU在上升沿发起读数据之后,LCD会等一个读输出禁止时间trodh,在这段时间内不允许对数据总线进行操作,从而保证数据线稳定方便读取。MCU的速度足够快在RDX上升沿的瞬间就完成了数据的读取,不需要等这个时间,MCU在上升沿后直接开启下一个读周期。大但图中trodh的值为20~80ns,此时时序出现不兼容,也就是在下个周期开始的20~80ns内,数据总线是不能写的。不过没关系,这个时间段是地址的建立时间,并不涉及到数据总线的操作。

(2)写时序兼容



写时序对比
         对于写时序同样也是通过ADDSET和DATAST设置地址建立时间和低电平时间。写数据保持时间tdht要求10ns以上,这点我不知道FSMC是怎么兼容的,这里只有1HCLK,如果是168M的话就是每个时钟周期为5ns左右,不满足需求。



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_39912966/article/details/145199407

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

60

帖子

0

粉丝