Перейти к содержанию

LTDC — контроллер LCD-TFT в STM32

Дисплеи с SPI сами хранят картинку в своей памяти. Панель с параллельным RGB-интерфейсом памяти не имеет: кадр нужно непрерывно передавать ей десятки раз в секунду. В STM32F429 это делает аппаратный контроллер LTDC — он читает кадровый буфер из памяти и выдаёт пиксели с развёрткой сам, без участия процессора.

Обновлено Редакция GAW

LTDC (LCD-TFT Display Controller) — встроенный в STM32F429 и STM32F439 контроллер панелей с параллельным RGB-интерфейсом. Он формирует сигналы горизонтальной и вертикальной синхронизации HSYNC и VSYNC, пиксельную частоту LCD_CLK и сигнал разрешения данных DE, а пиксели выдаёт на 24 линии — по 8 на красный, зелёный и синий (RM0090, разд. 16.1 и 16.3.3). Данные LTDC сам читает из кадрового буфера в памяти через шину AHB, поэтому процессор занят только рисованием в буфер, а не передачей кадра.

Возможности

  • Два слоя со своими FIFO и окнами, смешиваемые по альфа-каналу, и фоновый цвет под ними.
  • Восемь входных форматов на слой: ARGB8888, RGB888, RGB565, ARGB1555, ARGB4444, L8 (индекс в таблице цветов), AL44, AL88. Таблица цветов CLUT — до 256 цветов на слой.
  • Разрешение до XGA — 1024 × 768.
  • Дизеринг для панелей с меньшим числом бит на цвет и цветовой ключ для прозрачности.

По разд. 16.2 RM0090. Панель с 16-битным интерфейсом RGB565 подключают к старшим линиям: R[4:0] панели — к LCD_R[7:3], G[5:0] — к LCD_G[7:2], B[4:0] — к LCD_B[7:3]; неиспользуемые выводы LTDC свободны для других функций.

Развёртка и частота пикселей

Строка панели состоит из синхроимпульса HSYNC, задней площадки HBP, активных пикселей и передней площадки HFP; кадр — так же из строк: VSYNC, VBP, активные строки, VFP. Значения берут из даташита панели и записывают в регистры LTDC_SSCR, LTDC_BPCR, LTDC_AWCR и LTDC_TWCR не по отдельности, а накопленными суммами минус единица (разд. 16.4.1). Полярность всех сигналов программируется.

Частота LCD_CLK — это полное число пикселей в строке, умноженное на полное число строк и на частоту кадров (наш расчёт). В примере RM0090 для панели 640 × 480 полная строка — 8 + 7 + 640 + 6 = 661 пиксель, полный кадр — 4 + 2 + 480 + 2 = 488 строк; при 60 Гц нужна частота около 19,4 МГц. Её получают от отдельного умножителя PLLSAI.

Память для кадра

У LTDC три тактовых домена: HCLK для чтения памяти, PCLK2 для регистров и LCD_CLK для панели (разд. 16.3.2). Чтение идёт непрерывно, и кадровый буфер должен успевать отдавать данные. Кадр 640 × 480 в RGB565 — 614 400 байт (наш расчёт), а системной SRAM у STM32F42x — 256 Кбайт, поэтому крупные буферы ставят во внешнюю SDRAM через FMC. Формат L8 с палитрой уменьшает буфер вдвое против RGB565 ценой 256 цветов.

Этим LTDC отличается от модулей с собственным контроллером дисплея вроде ILI9341: там кадр хранит сам модуль, и микроконтроллер передаёт только изменения по SPI или параллельной шине. Сравнение технологий экранов — в статье «Технологии дисплеев».

Частые вопросы

Чем LTDC отличается от контроллера дисплея вроде ILI9341?

ILI9341 и подобные контроллеры стоят в самом модуле дисплея и хранят кадр в своей памяти — у ILI9341 это 172 800 байт GRAM на 240 × 320 точек: микроконтроллер пишет в неё только изменения. LTDC стоит внутри STM32F429 и памяти панели не имеет — он без остановки читает кадровый буфер из памяти микроконтроллера и передаёт панели каждый пиксель каждого кадра. Зато кадр можно обновлять быстро и целиком; у ILI9341, кстати, есть и свой RGB-интерфейс на 6, 16 или 18 бит, так что такой модуль можно подключить и к LTDC.

Хватит ли встроенной памяти STM32F429 на кадровый буфер?

Только для небольших экранов или режима с палитрой. Кадр 640 × 480 в формате RGB565 занимает 614 400 байт (наш расчёт: 640 × 480 × 2), а системной SRAM у STM32F42x всего 256 Кбайт (RM0090, разд. 2.3.1). Поэтому большие кадры держат во внешней памяти SDRAM через контроллер FMC, а формат L8 с таблицей цветов CLUT уменьшает буфер вдвое против RGB565.

Как посчитать частоту пикселей для панели?

Умножить полное число пикселей в строке на полное число строк и на частоту кадров (наш расчёт по определениям RM0090). Полная строка — синхроимпульс, задняя площадка, активные пиксели и передняя площадка. Для примера из RM0090 с панелью 640 × 480 это 661 × 488 = 322 568 тактов на кадр, при 60 Гц — около 19,4 МГц на выходе LCD_CLK.

Источники

  1. STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21, June 2024) — гл. 16 (только STM32F429xx/439xx): разд. 16.1 — параллельный цифровой RGB и сигналы горизонтальной и вертикальной синхронизации, пиксельной частоты и Data Enable для LCD- и TFT-панелей; разд. 16.2 — выход RGB 24 бита (RGB888), два слоя со своим FIFO 64 × 32 бит, таблица цветов CLUT до 256 цветов на слой, разрешение до XGA (1024 × 768), программируемые тайминги и полярность HSYNC, VSYNC и DE, восемь входных форматов на слой: ARGB8888, RGB888, RGB565, ARGB1555, ARGB4444, L8, AL44, AL88; псевдослучайное дизеринг-округление, смешивание слоёв по альфа-каналу, цветовой ключ, окно слоя, мастер AHB с пакетами по 16 слов, до 4 событий прерывания; разд. 16.3.2 — три тактовых домена: HCLK для чтения памяти в FIFO, PCLK2 для регистров настройки, LCD_CLK для сигналов панели, LCD_CLK настраивается через PLLSAI; разд. 16.3.3 — сигналы LCD_CLK, LCD_HSYNC, LCD_VSYNC, LCD_DE, LCD_R[7:0], LCD_G[7:0], LCD_B[7:0]; панель RGB565 подключают к старшим линиям: R[4:0] к LCD_R[7:3], G[5:0] к LCD_G[7:2], B[4:0] к LCD_B[7:3]; разд. 16.4.1 — HSYNC и VSYNC width, HBP и VBP, Active Width и Height, Total Width и Height записываются накопленными суммами минус 1 в регистры LTDC_SSCR, LTDC_BPCR, LTDC_AWCR, LTDC_TWCR; пример панели 640 × 480: синхроимпульсы 8 пикселей и 4 строки, задние площадки 7 пикселей и 2 строки, передние площадки 6 пикселей и 2 строки
  2. STMicroelectronics. RM0090, разд. 2.3.1 Embedded SRAM (Rev 21, June 2024) — STM32F42xxx и STM32F43xxx: 4 Кбайт резервной SRAM и 256 Кбайт системной SRAM (SRAM1, SRAM2, SRAM3 и CCM)
  3. ILITEK. ILI9341 a-Si TFT LCD Single Chip Driver 240RGBx320, Specification V1.11 (ILI9341_DS_V1.11) — разд. 1–2: драйвер со встроенной памятью кадра GRAM 172 800 байт для 240 × 320 точек; интерфейсы: параллельная шина MCU 8/9/16/18 бит, RGB-интерфейс 6/16/18 бит, SPI на 3 и 4 линии; область обновления в GRAM задаётся окном

Нашли ошибку?