ARM在彩色LCD上高效显示简单文本/图形


12

当设计一种基于ARM的设备,该设备应在彩色LCD上显示简单的图形时,如何最好地进行设计以允许快速更新,最好不要与特定的ARM或LCD供应商绑定?我当前的项目使用的是黑白显示屏,该显示屏可以通过PIC上的SPI端口实现闪电般的驱动(在1/60秒内重新绘制复杂的显示屏)。似乎普通的彩色LCD显示器具有SPI端口,但是即使以纯色填充160x120的LCD也要花费30ms,而在320x240的最佳情况下要花费120ms(10MHz的移位时钟)。

如果可以腾出控制器引脚,并行模式可能会更好,但是我不知道任何独立于家庭的方式来连接并行接口,而无需为每个像素分配三个独立的存储指令(一个用于设置数据,一个将时钟输出设置为高电平,另一个将其时钟设置为低电平)。某些ARM芯片具有内存总线接口,但那些芯片通常想要执行多路复用地址和数据之类的操作,或者将大量引脚用于输出无关的地址位(LCD仅需要一个地址位)。

看看ILITEK的ILI9320或Renesas的HD66789,一种似乎很有趣的方法是使用CPLD将SPI转换为并行数据,并包括一种可每位输出像素的模式。查看瑞萨数据表,通过使所有并行端口数据位都跟踪串行数据引脚,并使用除像素以外的所有内容的串行模式,可能需要最少的硬件(无需CPLD)来按位写入像素写入,并使用比较/掩码功能,以便全零像素将是透明的,而全零像素将设置GRAM中的选定位,或者全零像素将是透明的,全零像素将清除选定的位。IKITEK数据表的“功能”部分表明它具有类似的功能,但寄存器映射不具有此功能。

假设代码将主要显示纯色文本和图形,则理想的方法似乎是使用CPLD将ARM的SPI端口连接到显示器的并行端口,并允许CPLD加载前景色/背景色。如果人们有一种写“透明”像素的方法,那就特别好。给定一种字体为两种颜色的位图,只需将字体数据直接加载到SPI端口即可。这样可以使字体数据以每两个ARM时钟一个像素的速率显示。另一方面,足以处理这样的显示控制任务的CPLD将花费约2美元。

如果目标是主要显示纯色文本或简单(例如16色或64色)图形,那么将ARM与彩色LCD相连的最佳方法是什么?

编辑

我已经完成了许多LCD显示器项目,包括许多类型的LCD,包括字符模式LCD,使用我自己的驱动方法基于定制的3:1多路复用段,具有内置控制器的黑白图形LCD以及黑白显示器。我设计了自己的基于CPLD的控制器以与微控制器的通用DMA(甚至提供四级灰度)接口的白色LCD。我以制作蓬乱的显示感到自豪。其中一个图形控制器有点像一条狗,即使写入恒定数据也需要大约1/10秒才能进行全屏刷新,但是我的大多数显示器甚至可以在1/50秒内渲染出相当复杂的图像。

我从事的许多项目都是电池供电的,因此电流消耗是一个问题。我基于DMA的显示控制器工作得很好,但是它是用于线路供电项目的。我相信从图形LCD获得合理电流的唯一方法是使用结合了显示缓冲区和列驱动器的控制器。每帧在芯片之间发送大量的显示内容会浪费很多能量,即使在每像素一位显示上也是如此。在每像素16位的彩色显示器上,情况会更糟。

我只是开始查看彩色LCD数据表。尽管我在基于通用设计的控制器上找到的所有数据表都被标记为“初步”,但许多显示器似乎都使用了与ILITEK ILI9320类似的控制器。有些人喜欢ILITEK,有人声称它具有屏蔽和透明功能,但没有列出它们的任何寄存器。我不知道真正的芯片是否具有这样的功能,但是“初步”数据表中却忽略了这些功能,或者它们是否省略了这些功能却忘记了提及它们。如果实际上所有这些芯片都具有透明度功能,那么为它们设计似乎是合理的;如果不是,则不会。

我希望对于大多数项目而言,典型的屏幕将由任意放置的文本以及适量的任意大小的纯色字体组成。字体很可能会存储为每像素数据。使用Cortex-M3,如果我想用并行数据编写显示,则代码的“内部循环”中要写入两个像素可能会导致如下结果:

  rol r0,r0,#2; 在C中获得一位,在N中获得另一位
  itcs
  strhcs r1,[r3,#DATA_OFS]; 写数据
  strhcc r2,[r3,#DATA_OFS]; 写数据
  strb r4,[r3,#CLOCK_SET_OFS]; 将时钟设为高
  strb r4,[r3,#CLOCK_CLR_OFS]; 将时钟设为低
  Itmi
  strhmi r1,[r3,#DATA_OFS]; 写数据
  strhpl r2,[r3,#DATA_OFS]; 写数据
  strb r4,[r3,#CLOCK_SET_OFS]; 将时钟设为高
  strb r4,[r3,#CLOCK_CLR_OFS]; 将时钟设为低

并非世界上最快的东西。消除对设置/清除时钟指令的写入将有所帮助。我的猜测是,没有消除所有时钟写操作的与体系结构无关的好方法,但是可能有一种非常普遍的方法可以消除一个时钟写操作(例如,许多芯片可能具有可以使输出脉冲的计数器/ PWM)简要响应单个内存存储操作)。

使用SPI端口并添加硬件以每位时钟1个像素将大大加快显示访问速度。如果使用不带遮罩和透明性的显示器,则CPLD将必须包括一个地址计数器,并且对于每个像素,时钟一个像素数据字或一个用于下一个像素位置的set-address命令(为此需要一个计数器) )。相比之下,如果显示器具有遮罩和透明性,我所要做的就是让CPLD支持一种模式,在该模式中,当它以16位时钟输出之后,每增加一位将用一个时钟将数据字输出到显示器。 LSB跟踪SDI引脚(可能甚至不需要使用CPLD,仅使用一些普通逻辑芯片即可)。我将透明色设置为我要写的颜色,但LSB翻转了。

我不想提出依赖于遮罩和透明度的精美设计,然后发现仅有的具有此类功能的显示器的交货时间为30周。另一方面,如果这样的显示器易于被许多供应商使用并保持广泛使用,我不想让对可用性的偏执驱使我使用劣质的设计。


1
这不是一个答案,因为您的要求包括不与特定的ARM供应商绑定,但LPC LH754xx系列微控制器包括一个集成的LCD驱动器。
凯文·威米尔

@reemrevnivek:有许多带有小型LCD驱动器的ARM芯片;我无法想象任何一种芯片上都有适合任何有用尺寸的图形显示的驱动程序,而该封装在玻璃上芯片以外的任何情况下都可以使用。芯片可能具有控制器,但是带有玻璃上芯片控制器的LCD似乎更节能,并且更易于使用。不过,我会检查您提到的芯片-可能很有趣。
supercat

@supercat-我正在考虑具有RGB接口的LCD:像素时钟,帧同步和行同步控制线以及并行的像素数据总线。您是否希望使用COG控制的显示器?
凯文·维米尔

1
@reemrevnivek:那就是我一直在想的。它们似乎很常见,因为它们已在许多便携式电池供电的设备(如手机)中使用。具有内置控制器的COG显示器将比需要连续时钟RGB数据的显示器具有更高的功率效率。
supercat

@reemrevnivek:我只是更详细地更新了我的问题。
supercat

Answers:


7

使用微控制器驱动LCD的问题在于LCD需要不断地关注。可以通过通过SPI驱动的CPLD(当然使用DMA)来缓解这种情况,但是随后您会遇到另一个问题:彩色LCD要求很高。数据的。黑白的320x240的边际大小为9.6KB,但将其设置为24位彩色,突然间,您需要在1/60秒内交付230KB的数据。(不过,不要忘记,只需将低20位绑定到一个设置即可获得4位16色控制)。大多数微控制器的板载RAM中都不再装有24位帧缓冲区,您可能没有时间从外部RAM芯片中读取数据,将数据移出时钟,也没有进行其他处理。尝试使用CPLD(或FPGA)和RAM芯片来完成此操作,可以使您远远超过2美元的价格,这使您难以置信。

将微控制器与彩色LCD接口的传统解决方案是显示控制器,例如SSD1963。这是一个非常简单的框图:

MCU到RAM缓冲区和寄存器,然后到LCD接口

并行输入到大RAM帧缓冲区(翻译:超过$ 2),并与可配置寄存器的并行LCD接口连接。并行输入通常与存储器总线接口兼容。

彩色LCD市场并非总是容易在网上找到的,通常仅是OEM的领域,其余的则是从将控制器与显示器集成在一起的公司购买的。我找到的最好的资源是Crystal Fontz,尤其是有关选择图形LCD的页面。滚动到控制器的底部,其中包括以下选项(注意:并非所有人都是颜色控制器):

  • Epson S1D13521B01 E墨水宽幅板(1个模块)
  • 爱普生S1D13700(11个模块)
  • 兼容Epson SED1520(8个模块)
  • 兼容Himax HX8345(1个模块)
  • 兼容ILITek ILI9325(3个模块)
  • 兼容KS0107 / KS0108(26个模块)
  • Novatek NT7534(14个模块)
  • Orise Technology OTM2201A(1个模块)
  • Orise Technology SPFD5420A(1个模块)
  • RAiO RA8835(1个模块)
  • 三洋LC7981(13个模块)
  • 信和财富SH1101A(2个模块)
  • Sitronix ST7920(29个模块)
  • 所罗门SSD1303(1个模块)
  • 所罗门SSD1305(9个模块)
  • 所罗门SSD1325(2个模块)
  • 所罗门SSD1332(1个模块)
  • 所罗门SSD2119(2个模块)
  • ST STV8105(1个模块)
  • 东芝T6963(23个模块)

@reemrevnivek:我一直在想带有内置控制器的彩色LCD。它们似乎很普通,但是我所见的那些通常似乎期望CPU在每个像素上以许多位计时,即使常见的显示方案是显示纯色文本。我曾经使用CPLD实现了一个基于DMA的4级灰度LCD控制器,它工作得很好,但是那是一个线路供电的设备。
超级猫

1
@supercat-很少有LCD控制器期望CPU在每个帧中每像素输入许多位。他们通常期望专用的图形硬件能够做到这一点。基本上,一旦获得相当大的(即> 128 * 128)RGB显示,为屏幕生成图像所需的处理能力就足够大,以至于某种专用GPU(即使已集成到MCU中)也足够了。几乎总是存在。
康纳·沃尔夫,

1
@supercat-但是,您所描述的是,一种进行ASCII到栅格转换的专用CPLD,基本上是(定制)专用图形硬件。我基本上是说不要重新发明轮子,而只购买内置视频接口的MCU并自己设计,可能会更容易且更具成本效益。
康纳·沃尔夫

1
无论如何,如果您真的想自己动手,我想说的是使用几个双端口SRAM IC,并使用一个端口输出到LCD,另一个用于MCU。这样一来,MCU可以以任意速度更改内存内容,并且LCD可以刷新速率运行。
康纳·沃尔夫

1
@Fake名称:它将不是ASCII到栅格的转换。基本上是逐像素转换成逐像素转换。我认为您误会了我在看什么。我不是在寻找具有驱动程序的显示器,而是寻找包含驱动程序和控制器的显示器,因此仅当屏幕上的内容发生变化时才需要馈送数据。
supercat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.