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

电器工程 手臂 液晶显示器
2022-01-22 10:42:19

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

如果可以节省控制器引脚,并行模式可能会更好,但我不知道有任何与家庭无关的方法来连接并行接口,而不需要为每个像素提供三个单独的内存存储指令(一个用于设置数据,一个将时钟输出设置为高电平,一个将其时钟设置为低电平)。一些 ARM 芯片具有内存总线接口,但这些芯片通常想做多路复用地址和数据之类的事情,或者使用很多引脚来输出不相关的地址位(LCD 只需要一个地址位)。

看看 ILITEK 的 ILI9320 或 Renesas 的 HD66789,一种看起来很有趣的方法是使用 CPLD 将 SPI 转换为并行数据,并包括一种每比特输出一个像素的模式。查看 Renesas 数据表,通过使所有并行端口数据位跟踪串行数据引脚,对除像素以外的所有内容使用串行模式,可能以最少的硬件(不需要 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 获得合理电流消耗的唯一方法是使用结合了显示缓冲区和列驱动器的控制器。即使在单个每像素位的显示器上,每帧在芯片之间发送大量显示也会浪费大量能量;在每像素十六位的彩色显示器上,情况会更糟。

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

我希望对于大多数项目而言,典型的屏幕将由任意放置的文本和中等数量的任意大小的纯色字体组成。字体最有可能存储为每像素位数据。使用 Cortex-M3,如果我想用并行数据编写显示,那么编写两个像素的代码“内循环”可能最终会是这样的:

  滚 r0,r0,#2 ; 在 C 中获取一位,在 N 中获取另一位
  国际贸易中心
  strhcs r1,[r3,#DATA_OFS] ; 写入数据
  strhcc r2,[r3,#DATA_OFS] ; 写入数据
  strb r4,[r3,#CLOCK_SET_OFS] ; 设置时钟高
  strb r4,[r3,#CLOCK_CLR_OFS] ; 将时钟设置为低
  伊米
  strhmi r1,[r3,#DATA_OFS] ; 写入数据
  strhpl r2,[r3,#DATA_OFS] ; 写入数据
  strb r4,[r3,#CLOCK_SET_OFS] ; 设置时钟高
  strb r4,[r3,#CLOCK_CLR_OFS] ; 将时钟设置为低

不完全是世界上最快的东西。消除对设置/清除时钟指令的写入会有所帮助。我的猜测是没有很好的独立于架构的方法来消除两个时钟写入,但可能有一种非常常见的方法可以消除一个(例如,许多芯片可能有一个计数器/PWM,可以用来脉冲输出简要地响应单个内存存储操作)。

使用 SPI 端口并添加硬件来为每位一个像素提供时钟将大大加快显示访问速度。如果使用没有掩蔽和透明的显示器,CPLD 必须包括一个地址计数器,并且对于每个像素,要么时钟一个像素数据字,要么为下一个像素的位置设置地址命令(为此它需要一个计数器)。相比之下,如果显示器有遮蔽和透明度,我需要做的就是让 CPLD 支持一种模式,在它以 16 位计时后,每个额外的位都会将一个数据字输出到显示器,并带有LSB 跟踪 SDI 引脚(甚至可能不需要使用 CPLD——只需几个普通逻辑芯片)。我会将透明度颜色设置为我想写的颜色,但 LSB 翻转了。

我不想想出一个依赖遮罩和透明度的漂亮设计,然后发现唯一具有此类功能的显示器有 30 周的交货时间。另一方面,如果这样的显示器易于并且仍然可以从许多供应商处广泛使用,我不想让对可用性的偏执驱使我使用劣质设计。

1个回答

使用微控制器驱动 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 接口

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

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

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