№5 / 2018 / статья 2

Разрабатываем устройство с графикой на STM32. Основные возможности периферии

Вячеслав Гавриков (г. Смоленск)

Данная статья является третьей в серии публикаций, посвященных построению графических приложений на базе микроконтроллеров STM32. На этот раз основное внимание уделено специализированным периферийным блокам, которые используются для работы с TFT-дисплеями: FSMC, LTDC, DSIHOST, Chrom-ART Accelerator, Chrom-GRC, JPEG-кодек. В статье также рассказывается о возможности подключения к контроллерам STM32 внешней памяти с помощью QuadSPI и FMC.

Ранее в журнале «Новости электроники» была опубликована статья «TFT-дисплеи Winstar: новинки, характеристики и особенности подключения», в ней кратко рассматривались стандартные интерфейсы для работы с TFT-дисплеями [1]:

  • MIPI-DBITypeA – 8/16-битный параллельный интерфейс, совместимый со спецификацией Motorola Применяется в дисплеях со встроенным контроллером и экранной памятью.
  • MIPI-DBI Type B – 8/16-битный параллельный интерфейс, совместимый со спецификацией Intel 8080. Применяется в дисплеях со встроенным контроллером и экранной памятью.
  • MIPI-DBI Type C – последовательный SPI-интерфейс. Применяется в дисплеях со встроенным контроллером и экранной памятью.
  • MIPI-DPI (MIPI display parallel interface) или RGB – 16/18/24-битный параллельный интерфейс. Применяется в дисплеях, у которых нет собственной экранной памяти, а TFT- контроллер является внешним.
  • MIPI-DSI (MIPI display serial interface) – последовательный дифференциальный интерфейс, который может работать в двух режимах – с дисплеями со встроенным контролером и графической памятью (commandmode) и с дисплеями без собственной графической памяти (videomode).
  • LVDS – последовательный дифференциальный интерфейс, предназначенный для дисплеев с максимальным разрешением без встроенного TFT-контроллера и экранной памяти.

Еще одна статья – «STM32 + современный TFT-дисплей: варианты на любой вкус» – была посвящена обзору 32-битных микроконтроллеров семейства STM32, большая часть которых имеет на борту специализированные периферийные блоки, позволяющие реализовать аппаратное взаимодействие с TFT-дисплеями (кроме LVDS) [2].

В данной статье проводится подробный обзор специализированной графической периферии STM32. Основная часть статьи посвящена рассмотрению базовых блоков, без которых невозможно подключение TFT-дисплеев: FSMC, LTDC и DSIHOST. Во второй части рассказывается о встроенных контроллерах внешней памяти QuadSPI и FMC. В заключение дается краткое описание вспомогательных блоков, позволяющих значительно упростить и ускорить работу с графикой — Chrom-ART Accelerator, Chrom-GRC, JPEG-кодек.

Перед тем как двигаться дальше, необходимо сделать важное замечание. Дело в том, что в ряде случаев взаимодействие с TFT-дисплеями, использующими интерфейсы SPI/Motorola 6800/Intel 8080/RGB, можно организовать с помощью обычных портов ввода-вывода. Однако при этом обмен данными с дисплеем и обработка графики «съест» всю производительную мощность процессорного ядра. В данной статье такое решение не рассматривается, и речь идет только о работе со специализированными аппаратными блоками.

Обзор аппаратной периферии STM32 для создания графических приложений

Номенклатура микроконтроллеров STM32 чрезвычайно богата и насчитывает более тысячи различных моделей, объединенных в 64 линейки. Каждая из линеек имеет индивидуальный набор периферийных блоков, позволяющих взаимодействовать с TFT-дисплеями (таблица 1):

  • SPI-интерфейс – коммуникационный интерфейс для дисплеев с MIPI-DBI Type C. При наличии SPI TFT-дисплеи могут использоваться со всеми без исключения контроллерами STM32. Этот случай достаточно простой и очевидный, и отдельно о встроенном SPI-интерфейсе STM32 в рамках данной статьи рассказано не будет;
  • FSMC (Flexible Static Memory Controller) – контроллер внешней памяти, который позволяет взаимодействовать с TFT-дисплеями, снабженными интерфейсами Motorola 6800 и Intel 8080. При определенных условиях FSMC может использоваться для работы с TFT-дисплеями с RGB-интерфейсом;
  • LTDC (LCD-TFT Display Controller) – специализированный TFT-контроллер, который позволяет работать с TFT-дисплеями, оснащенными RGB-интерфейсом;
  • MIPI-DSI Host – специализированный интерфейс для работы с TFT-дисплеями, с MIPI-DSI.

В большинстве случаев внутренней памяти микроконтроллера не хватает для хранения графических изображений и размещения экранной памяти. По этой причине очень часто требуется внешняя Flash и ОЗУ. Для увеличения объема Flash идеально подходит интерфейс QuadSPI, который присутствует практически во всех последних линейках STM32. Для подключения к STM32 дополнительного ОЗУ следует использовать контроллер внешней памяти FSMC/FMC (таблица 1). Главное различие между FSMC и FMC заключается в том, что FMC способен работать с SDRAM.

В состав многих микроконтроллеров STM32 входят и другие вспомогательные блоки, созданные для оптимизации работы с графикой. Они не являются обязательными для создания графических приложений, и без них вполне можно обойтись, но их использование значительно сокращает нагрузку на процессорное ядро:

  • Chrom-ART – графический ускоритель. Представляет собой особый контроллер прямого доступа к памяти, созданный специально для оптимизации процессов по пересылке больших массивов графических данных с возможностью их потоковой обработки.
  • Chrom-GRC – блок оптимизации хранения графических данных, позволяющий экономить до 20% памяти при работе с дисплеями округлой формы.
  • JPEG-кодек – специализированный ускоритель, необходимый для JPEG-кодирования и декодирования графических изображений.

Таблица 1. Специализированная периферия микроконтроллеров STM32 для графических приложений

Наименование Интерфейсы дисплеев Графические ускорители Внешняя память
SPI Motorola 6800 Intel 8080 RGB MIPI-DSI LVDS
SPI FSMC LTDC DSI СhromeArt Chrom-GRC JPEG-Codec QuadSPI SDRAM
STM32L0x1 +
STM32L0x2 +
STM32L0x3 +
STM32L100 +
STM32L151/152 + + +
STM32L162 + + +
STM32L431 + +
STM32L451 + +
STM32L471 + + + +
STM32L432 + +
STM32L452 + +
STM32L433 + +
STM32L475 + + + +
STM32L476 + + + +
STM32L496 + + + + +
STM32L4R5 + + + + +
STM32L4S5 + + + + +
STM32L4R7 + + + + + + +
STM32L4S7 + + + + + + +
STM32L4R9 + + + + + + + +
STM32L4S9 + + + + + + + +
STM32F0x0 +
STM32F0x1 +
STM32F0x2 +
STM32F0x8 +
STM32F100 + + +
STM32F101 + + +
STM32F102 +
STM32F103 + + +
STM32F105 + + +
STM32F107 + + +
STM32F205 + + +
STM32F215 + + +
STM32F207 + + +
STM32F217 + + +
STM32F301 + + +
STM32F302 +
STM32F303 + + +
STM32F3x4 +
STM32F373 +
STM32F3x8 +
STM32F401 +
STM32F410 +
STM32F411 +
STM32F412 + + + +
STM32F413 + + + +
STM32F405 + + +
STM32F407 + + +
STM32F446 + + + + +
STM32F427 + + + + +
STM32F437 + + + + +
STM32F429 + + + + + +
STM32F439 + + + + + +
STM32F469 + + + + + + + +
STM32F479 + + + + + + + +
STM32F7x2 + + + + + +
STM32F7x3 + + + + + +
STM32F7x5 + + + + + +
STM32F7x6 + + + + + + +
STM32F7x7 + + + + + + + +
STM32F7x8 + + + + + + + + +
STM32F7x9 + + + + + + + + +
STM32H743 + + + + + + + +
STM32H753 + + + + + + + +

При первом взгляде на таблицу 1 становится немного не по себе, ведь такое многообразие может запутать при выборе оптимального контролера. По этой причине с самого начала следует определиться с типом рабочего интерфейса, а уже потом выбирать подходящее семейство и контроллер.

Выбор оптимального микроконтроллера для TFT-дисплея

Предложенная выше сводная таблица 1 будет полезна, если тип и интерфейс дисплея еще не определены. Если же конкретный тип дисплея уже выбран, то для определения подходящего микроконтроллера следует обратиться к классификатору программы STM32CubeMX.

STM32CubeMX – бесплатная комплексная графическая среда от компании STMicroelectroncs, позволяющая выбирать оптимальный контроллер с помощью фильтров, настраивать периферию с помощью графических инструментов и автоматически генерировать код инициализации для различных компиляторов [3]. На этапе поиска оптимального контроллера наибольший интерес представляет встроенный в STM32CubeMX классификатор. Для этих же целей подойдет бесплатная утилита ST MCU Finder.

При старте каждого нового проекта программа STM32CubeMX предлагает выбрать подходящий контроллер с помощью целого ряда фильтров (по типу ядра, серии, корпусу, объему памяти и доступной периферии). При поиске микроконтроллера для графического приложения логично применить фильтр по доступным периферийным блокам. Например, если было принято решение использовать небольшой дисплей с RGB-интерфейсом – то для этого подойдут контроллеры с FSMC/FMC или с LTDC. Ставим галочки в соответствующих графах (рисунок 1). Программа автоматически сократит круг поиска.

Рис. 1. Поиск микроконтроллеров STM32 с подходящей периферией в STM32CubeMX

Рис. 1. Поиск микроконтроллеров STM32 с подходящей периферией в STM32CubeMX

Очевидно, что требования к графическим устройствам сильно отличаются. Однако можно сделать несколько рекомендаций по выбору микроконтроллеров с учетом параметров конкретного дисплея (таблица 1):

  • для TFT-дисплеев с SPI-интерфейсом может использоваться любой микроконтроллер STM32;
  • для TFT-дисплеев с интерфейсами Motorola 6800 и Intel 8080 подойдут линейки с контроллером внешней памяти FSMC/FMC. В данном случае самым бюджетным вариантом будут микроконтроллеры ST32F100 или ST32F103 [4, 5];
  • для TFT-дисплеев с RGB-интерфейсом и малым разрешением в ряде случаев допустимо использовать линейки с контроллером внешней памяти FSMC/FMC[5]. При необходимости простейшей обработки графики следует использовать микроконтроллеры с графическим ускорителем Chrom-ART;
  • для TFT-дисплеев круглой формы с RGB-интерфейсом следует обратить внимание на линейки STM32L4+ со встроенным модулем оптимизации памяти Chrom-GRC [7];
  • для TFT-дисплеев с 24-битным RGB-интерфейсом и высоким разрешением следует использовать старшие линейки с интегрированным графическим контроллером LTDC, начиная с STM32F429 [6];
  • для TFT-дисплеев с DSI-интерфейсом подойдут линейки со встроенным DSI-хостом (DSIHOST) – STM32F469/479, STM32F7x8/x9 и STM32L4R9/S9.

Предложенные рекомендации являются общими и позволяют ограничить выбор рамками нескольких линеек. Для выбора конкретной модели требуется учет требований конкретного приложения.

Использование FSMC для работы с TFT-дисплеями

Контроллер внешней памяти FSMC (Flexible Static Memory Controller) позволяет подключать к STM32 не только различные типы внешней памяти SRAM, NOR Flash, NAND Flash, но и TFT-дисплеи. Исторически именно FSMC впервые позволил микроконтроллерам STM32 работать с TFT-дисплеями с достаточно большим разрешением. С помощью контроллера внешней памяти можно реализовывать различные интерфейсы, в том числе – Motorola 6800, Intel 8080, RGB.

Рассмотрим сначала работу FSMC с интерфейсами Motorola 6800 и Intel 8080. Для этого FSMC использует следующие сигналы [4]:

  • FSMC [D0:D15] – используются в качестве 16/8-битной шины данных;
  • FSMC NEx – используются для управления линией CS выбор чипа(х1…4);
  • FSMC NOE – выполняет роль строба чтения RD(в Intel 8080);
  • FSMC NWE – выполняет роль строба записи RW;
  • FSMC Ax – адресныелинии (х0…25), которые необходимы для выбора типа сообщения «команда/данные RS».С точки зрения программиста передача команды и данных равносильны записи в разные области памяти. Ниже об этом будет сказано подробнее.

Этих линий вполне хватает для работы в режиме Motorola 6800 и Intel 8080 (рисунок 2).

Рис. 2. Подключение микроконтроллеров STM32F10x к TFT-дисплеям с интерфейсами Motorola 6800 и Intel 8080

Рис. 2. Подключение микроконтроллеров STM32F10x к TFT-дисплеям с интерфейсами Motorola 6800 и Intel 8080

Информацию о расположении выводов контроллера FSMC можно взять из документации, но быстрее и проще будет воспользоваться программой STM32CubeMX. Предположим, что при старте проекта STM32CubeMX был выбран микроконтроллер STM32F103ZE (рисунок 1). Тогда для назначения выводов FSMC потребуется всего лишь несколько раз щелкнуть мышкой в окне «Pinout» (рисунок 3).

Рис. 3. Назначение выводов FSMC в STM32CubeMX

Рис. 3. Назначение выводов FSMC в STM32CubeMX

При настройке FSMC система автоматически резервирует выводы, что можно наблюдать в окне, расположенном справа на рисунке 3. На этом преимущества использования STM32CubeMX не заканчиваются. STM32CubeMX позволяет автоматически генерировать программный код инициализации. В данном случае нас интересует инициализация портов ввода-вывода и самого FSMC (листинги 1, 2).

Листинг 1. Функция инициализации портов ввода-вывода для FSMC в stm32f1xx_hal_msp.c

static void HAL_FSMC_MspInit(void){

/* USER CODE BEGIN FSMC_MspInit 0 */

/* USER CODE END FSMC_MspInit 0 */

GPIO_InitTypeDef GPIO_InitStruct;

if (FSMC_Initialized) {

return;

}

FSMC_Initialized = 1;

/* Peripheral clock enable */

__HAL_RCC_FSMC_CLK_ENABLE();

/** FSMC GPIO Configuration

PF0  ------> FSMC_A0

PE7  ------> FSMC_D4

PE8  ------> FSMC_D5

PE9  ------> FSMC_D6

PE10  ------> FSMC_D7

PE11  ------> FSMC_D8

PE12  ------> FSMC_D9

PE13  ------> FSMC_D10

PE14  ------> FSMC_D11

PE15  ------> FSMC_D12

PD8  ------> FSMC_D13

PD9  ------> FSMC_D14

PD10  ------> FSMC_D15

PD14  ------> FSMC_D0

PD15  ------> FSMC_D1

PD0  ------> FSMC_D2

PD1  ------> FSMC_D3

PD4  ------> FSMC_NOE

PD5  ------> FSMC_NWE

PD7  ------> FSMC_NE1

*/

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10

|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14

|GPIO_PIN_15;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14

|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4

|GPIO_PIN_5|GPIO_PIN_7;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* USER CODE BEGIN FSMC_MspInit 1 */

/* USER CODE END FSMC_MspInit 1 */

}
Листинг 2. Функция инициализации FSMC в main.c

static void MX_FSMC_Init(void)

{

FSMC_NORSRAM_TimingTypeDef Timing;

/** Perform the SRAM1 memory initialization sequence

*/

hsram1.Instance = FSMC_NORSRAM_DEVICE;

hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;

/* hsram1.Init */

hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;

hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;

hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;

hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;

hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;

hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;

hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;

hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;

hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;

hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;

hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;

hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;

hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;

/* Timing */

Timing.AddressSetupTime = 15;

Timing.AddressHoldTime = 15;

Timing.DataSetupTime = 255;

Timing.BusTurnAroundDuration = 15;

Timing.CLKDivision = 16;

Timing.DataLatency = 17;

Timing.AccessMode = FSMC_ACCESS_MODE_A;

/* ExtTiming */

if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

/** Disconnect NADV

*/

__HAL_AFIO_FSMCNADV_DISCONNECTED();

}

В дальнейшем в шаблон, сгенерированный STM32CubeMX, пользователь вносит собственный код, относящийся к конкретному приложению.

В сообществе разработчиков нет общего мнения по вопросу использования STM32CubeMX: есть как сторонники, так и противники такого подхода. Тем не менее, нельзя отрицать того факта, что STM32CubeMX значительно упрощает и ускоряет разработку, так как в ряде случаев избавляет от необходимости досконально вычитывать руководство пользователя.

При работе с Motorola 6800 и Intel 8080 сигнал RS задает тип сообщения, поэтому для передачи команды на выводе RS необходимо установить логический ноль, а при передаче данных на RS должна присутствовать логическая единица. Так как сигнал RS использует адресную линию FSMC Ax, с точки зрения программиста это равносильно обмену с разными областями памяти. В листинге 3 для работы с дисплеем используется банк 1, поэтому для передачи команд необходимо обращаться по адресу 0x60000000, а для передачи данных – по адресу 0x60200000.

Листинг 3. Функция инициализации FSMC в main.c

/* LCD подключен к FSMC_Bank1_NOR/SRAM4 */

#define LCD_COMMAND_BASE  ((uint32_t)(0x60000000))

#define LCD_DATA_BASE  ((uint32_t)(0x60200000))

#define LCD_COMMAND     ((uint16_t *) LCD_COMMAND_BASE)

#define LCD_DATA    ((uint16_t *) LCD_DATA_BASE)

void WriteData(uint16 data){LCD_DATA = data;};

uint16 ReadData(){uint16 data = 0; data = LCD_DATA ;return data;};

void WriteCommand(uint16 command){LCD_COMMAND = command;};

В качестве примера использования FSMC для работы с дисплеем можно привести отладочную плату STM3210B-EVAL (рисунок 4). Она построена на базе микроконтроллера STM32F103VBT6, который работает с дисплеем Ampire LCD со встроенным TFT-контроллером ILI9320. Разрешение экрана составляет 240×320. Для обмена используется 16-битный интерфейс Intel 8080. Для получения подробной информации стоит обратиться к соответствующим руководствам [4, 8].

Рис. 4. Внешний вид отладочной платы STM3210B-EVAL с TFT-дисплеем

Рис. 4. Внешний вид отладочной платы STM3210B-EVAL с TFT-дисплеем

FSMC может использоваться и для работы с RGB-дисплеями [5]. Однако эффективность такой работы невысока из-за различных ограничений – постоянной загрузки процессорного ядра, оптимальной разрядности цвета, составляющей всего 16 бит (RGB565), невысокой скорости. Поэтому такой вариант был актуален только до появления микроконтроллеров со встроенным TFT-контролером LTDC. Конечно, существуют модели, в которых нет LTDC, но присутствует Chrom-ART. В них нагрузка на ядро оказывается меньше.

Обзор встроенного TFT-контроллера (LTDC)

Для создания наиболее продвинутых графических приложений с максимальным разрешением экрана следует использовать встроенный TFT-контроллер (LTDC), который присутствует в старших линейках STM32: STM32L4R7, STM32L4S7, STM32L4R9, STM32L4S9, STM32F429/439, STM32F469/479, STM32F7x6, STM32F7x7, STM32F7x8, STM32F7x9, STM32H743, STM32H753 [6].

LTDC имеет следующие особенности:

  • 24/16/8-битный RGB-интерфейс;
  • разрешения до XGA 1024×768;
  • два графических слоя с собственными буферами FIFO 64×32 бит;
  • возможность программирования параметров каждого слоя;
  • программирование размеров и положения отображаемых окон;
  • поддержка 8 форматов цвета;
  • встроенный конвертер форматов цвета;
  • поддержка палитр с числом цветов до 256 (24-битных);
  • возможность смешивания слоев для получения эффекта полупрозрачности (альфа-смешение);
  • поддержка хромакея (Color keying);
  • поддержка псевдослучайного дизеринга (2 бита);
  • четыре вектора прерывания.

Характеристики TFT-контроллеров различных семейств незначительно различаются. Например, в случае с STM32H7 TFT-контроллер подключается к высокоскоростной шине AXI (рисунок 5), в то время как в остальных семействах он работает с шиной AHB. Рассмотрим структурную схему LTDC подробнее.

Рис. 5. Блок-схема TFT-контроллера в семействе STM32H7

Рис. 5. Блок-схема TFT-контроллера в семействе STM32H7

Встроенный TFT-контроллер использует три источника тактирования:

  • HCLK – для обмена данными по шине AXI или AHB;
  • PCLK – для взаимодействия с внутренними регистрами TFT-контроллера;
  • LCD_CLK – для формирования интерфейсных сигналов для связи с дисплеем.

Обмен данными между TFT-контроллером и шинами AXI (или AHB) осуществляется посредством FIFO-буферов 64×32 бит – по одному на каждый экранный слой.

LTDC поддерживает работу с двумя экранными слоями, каждый из которых имеет возможность независимой настройки параметров, например, размеров и положения окна отображения. Это позволяет без проблем создавать такие эффекты, как картинка в картинке.

Максимальная разрядность шины RGB для LTDC составляет 24 бита. Это обеспечивает высокую производительность и оптимальную поддержку 8 различных форматов цвета: ARGB8888, RGB888, RGB565, ARGB1555, ARGB4444, L8, AL44, AL88.

Еще одним полезным аппаратным блоком, входящим в состав LTDC, является микшер (Blending Unit). Он позволяет производить альфа-смешение изображений двух слоев между собой или с постоянным цветом заднего фона (рисунок 6). Если говорить простым языком, то это эффект полупрозрачности. Наличие аппаратного блока смешивания позволяет получать современную картинку без загрузки процессора.

Рис. 6. TFT-контроллер в STM32 имеет аппаратную поддержку смешивания слоев

Рис. 6. TFT-контроллер в STM32 имеет аппаратную поддержку смешивания слоев

Говоря о прозрачности, нельзя не упомянуть о том, что LTDC поддерживает чрезвычайно популярную технологию хромакея (Color keying). Она заключается в том, что один из цветов верхнего слоя «назначается» прозрачным, и вместо пикселей с таким цветом отображается нижний слой. На рисунке 7 показан конкретный пример, в котором зеленый цвет слоя Layer1 заменяется картинкой со слоя Layer2.

Рис. 7. Использование хромакея в STM32

Рис. 7. Использование хромакея в STM32

Еще одним важным достоинством TFT-контроллеров в STM32 является наличие аппаратного дизеринга (2 бита). Этот эффект заключается в возможности смешивания цветов соседних пикселей, что позволяет «сглаживать» резкие переходы (рисунок 8).

Рис. 8. Применение дизеринга для сглаживания

Рис. 8. Применение дизеринга для сглаживания

Чтобы подключить микроконтроллер STM32 к RGB-дисплею, можно либо самостоятельно изучить документацию, либо воспользоваться программой STM32CubeMX или взять за основу готовые проекты, например, отладочные платы. STM32CubeMX помогает быстро выполнить распиновку и настройку TFT-контроллера без значительных затрат времени (рисунок 9). Программа автоматически назначает выводы и генерирует код инициализации.

Рис. 9. Назначение выводов TFT-контроллера в STM32CubeMX

Рис. 9. Назначение выводов TFT-контроллера в STM32CubeMX

Если же за основу решено взять готовый проект, то хорошим вариантом будет использование отладочных наборов производства компании ST (таблица 2). При этом вместе с готовой схемотехникой разработчик получает и набор ПО для конкретного решения.

Таблица 2. Отладочные наборы STM32 с RGB-дисплеями [6]

Отладочный набор Микро-
контроллер
Параметры TFT Встроенная память SRAM, кбайт Внешняя SDRAM, бит Внешняя SRAM, бит
Интерфейс Диагональ, дюйм Разрешение, точек Формат цвета Сенсорный экран
32F429IDISCOVERY STM32F429 DPI 2,4 240×320 RGB666 Резистивный 256 16
STM32439I-EVAL2 STM32F439 DPI 5,7 640×480 RGB666 Емкостной 256 32 16
STM32429I-EVAL1 STM32F429 DPI 4,3 480×272 RGB888 Резистивный 256 32 16
32F469IDISCOVERY STM32F469 MIPI-DSI 4 800×480 RGB888 Емкостной 384 32
STM32469I-EVAL STM32F469 MIPI-DSI 4 800×480 RGB888 Емкостной 384 32 16
32F746GDISCOVERY STM32F746 DPI 4,3 480×272 RGB888 Емкостной 320 32
STM32746G-EVAL STM32F746 DPI 5,7 640×480 RGB666 Емкостной 320 32 16
STM32F769I-DISCO STM32F769 MIPI-DSI 4 800×480 RGB888 Емкостной 512 32
STM32F779I-EVAL STM32F779 MIPI-DSI 4 800×480 RGB888 Емкостной 512 32 16
STM32F769I-EVAL STM32F769 MIPI-DSI 4 800×480 RGB888 Емкостной 512 32 16
STM32H753I-EVAL STM32H753I DPI 5,7 640×480 RGB888 Емкостной 1000 32 16
STM32H743I-EVAL STM32H743I DPI 5,7 640×480 RGB888 Емкостной 1000 32 16

Одним из недостатков RGB-интерфейса является большое число сигнальных линий. Чтобы уменьшить число занятых выводов и сохранить высокое разрешение дисплея, следует рассмотреть возможность использования MIPI-DSI.

DSI хост (DSIHOST) в микроконтроллерах STM32

MIPI-DSI – универсальный интерфейс, позволяющий работать с TFT-дисплеями как при наличии встроенной графической памяти и контроллера, так и без них [7]. Если RGB-интерфейс требует большого числа сигнальных линий, то DSI позволяет обойтись несколькими дифференциальными парами (CLK и DATAn).

Стандарт MIPI-DSI подразумевает наличие двух рабочих режимов:

  • режим команд (Command mode) используется для работы с дисплеями со встроенным контроллером и графической памятью. При этом DSI-хост, как и в случае DBI, производит передачу как данных, так и команд;
  • видеорежим (Video mode) используется для работы с дисплеями без собственной памяти. В этом случае DSI-хост передает изображение в реальном времени (аналогично DPI).

В настоящий момент DSI-хост (DSIHOST) реализован в новых семействах STM32: STM32F469/479, STM32F7x8/x9 и STM32L4R9/S9.

Основная функция DSIHOST заключается в формировании DSI-пакетов из данных, которые поступают от TFT-контроллера LTDC или от других блоков посредством периферийной шины APB. Если данные поступают от LTDC, то DSI-хост может работать как в видеорежиме, так и в режиме команд (Adapted Command mode). Если же работа с DSI-хостом идет через APB, то доступен только режим команд.

Структурная схема DSIHOST в STM32 включает в себя несколько основных блоков (рисунок 10):

Рис. 10. Структурная схема DSI (DSIHOST) в STM32

Рис. 10. Структурная схема DSI (DSIHOST) в STM32

  • DSI-преобразователь (DSI Wrapper) обеспечивает взаимодействие между TFT-контроллером LTDC и ядром DSI. Здесь выполняется преобразование цветов и полярностей сигналов, а также обработка команд в режиме Adapted Command mode. Кроме того, данный блок управляет системой ФАПЧ и некоторыми функциями D-PHY.
  • Интерфейс LTDC принимает сообщения от LTDC и помещает их в FIFO-буфер. Эти данные используются для формирования видеопотока в видеорежиме и формирования команд memory_write_start and memory_write_continue в режиме Adapted Command mode.
  • Преобразователь APB-Generic осуществляет обмен между периферийной шиной APB и ядром DSI. Для этого используется три FIFO-буфера: команд (Command FIFO), записи (Write payload FIFO), чтения (Read payload FIFO).
  • Внутренние регистры необходимы для настройки DSI Host. Взаимодействие с ними идет по периферийной шине APB.
  • Обработчик пакетов (Packet Handler) используется для формирования и обработки DSI-пакетов, контроля ошибок, подсчета контрольных сумм и так далее.
  • Интерфейс D-PHY отвечает за взаимодействие ядра и D-PHY.
  • Блок контроля ошибок следит за ошибками синхронизации, обеспечивает программный сброс и формирование ряда прерываний.
  • Видеогенератор используется для формирования на дисплее вертикальных или горизонтальных прямоугольных полос без участия LTDC.

DSIHOST использует одну дифференциальную линию тактирования (CLK) и до двух линий данных (DATAn) (рисунок 10). Шина данных DATA0 является двунаправленной при работе в режиме команд, а в видеорежиме она может быть как двунаправленной, так и однонаправленной. Шина DATA1 используется только в видеорежиме. Пропускная способность каждой из шин данных составляет 500 Мбит/с (суммарно 1 Гбит/с).

DSIHOST поддерживает все форматы и разрядности, которые поддерживает и LTDC. Говоря о разрешении, стоит отметить, что пропускная способность DSIHOST позволяет создавать графические приложения с разрешением более 800×480.

Чтобы упростить себе жизнь, при подключении DSI-дисплея стоит воспользоваться автоматической генерацией кода в STM32CubeMX.

Из таблицы 2 хорошо видно, что практически в каждой отладочной плате используется внешняя память. Это является неизбежным злом, так как для хранения графики требуется очень много места, и встроенной памяти микроконтроллера хватает не всегда. К счастью микроконтроллеры STM32 имеют на борту множество интерфейсов для подключения внешней памяти.

Расширение ОЗУ в микроконтроллерах STM32

Если дисплей не имеет собственного графического ОЗУ, то для хранения текущих изображений необходимо использовать внешнюю память. Зная разрешение дисплея и формат цвета, несложно посчитать объем требуемой экранной памяти (таблица 3). В то же время максимальный объем встроенной ОЗУ для самых мощных микроконтроллеров STM32 достигает 1 Мбайт. Очевидно, что этого хватает далеко не для всех экранов.

Таблица 3. Объем графической памяти для различных разрешений

Разрешение Число пикселей Объем буфера ОЗУ, кбайт
8-бит 16-бит 24-бит 32-бит
QVGA (320×240) 76800 75 150 225 300
HVGA (480×320) 153600 150 300 450 600
VGA (640×480) 307200 300 600 900 1200
WVGA (800×480) 384000 375 750 1125 1500
SVGA (800×600) 480000 469 938 1407 1875
XGA (1024×768) 786432 768 1536 2304 3072

Как уже говорилось выше, для расширения объема ОЗУ микроконтроллеров STM32 используется встроенный контроллер внешней памяти FSMC или FMC. FSMC-контроллер работает только со статическим ОЗУ. FMC-контроллер присутствует в старших линейках микроконтроллеров и способен работать также и с SDRAM.

FMC-контроллер топовых семейств STM32 включает в себя три полноценных контроллера для следующих типов памяти: NOR/PSRAM, NAND, Synchronous DRAM (SDRAM/Mobile LPSDR SDRAM) (рисунок 11).

Рис. 11. Контроллер внешней памяти FMC в STM32H7

Рис. 11. Контроллер внешней памяти FMC в STM32H7

Для подключения различных типов памяти используются различные наборы сигналов, при этом выводы шины адреса и шины данных оказываются общими. Максимальная разрядность шины адреса составляет 26 бит, а шины данных – 32 бита.

Ключевыми особенностями FMC-контроллера семейства STM32H7 являются:

  • поддержкаразличныхтиповпамяти (SRAM, NOR Flash /OneNAND Flash, PSRAM, NAND Flash, SDRAM (SDRAM/Mobile LPSDR SDRAM);
  • программируемые тайминги для синхронного и асинхронного обмена;
  • 8-/16-/ 32-битная шина данных;
  • до четырех банков памяти;
  • встроенный FIFO-буфер для записи 16×32-бит;
  • FIFO-буфер 6×64-бит для SDRAM.

С точки зрения построения графических приложений именно SDRAM является оптимальным выбором в качестве экранного ОЗУ. При этом чем больше разрядность и скорость обмена – тем выше будет качество и плавность графического интерфейса.

Стоит отметить, что для оптимальной работы с FMC/FSMC-контроллером логично использовать контроллер прямого доступа к памяти DMA, чтобы разгрузить процессор. Речь идет как о DMA общего назначения, так и о специализированном графическом ускорителе Chrom-ART(DMA2D).

Контроллер QSPI-памяти в микроконтроллерах STM32

Если в качестве экранной памяти используется внутреннее или внешнее ОЗУ, то для хранения изображений (битмапов) используют Flash. Так же как и в случае с ОЗУ, встроенной Flash-памяти микроконтроллера хватает далеко не всегда. Наиболее продвинутые контроллеры STM32 имеют до 2 Мбайт Flash на борту. Если этого не достаточно, то изображения можно хранить на карте памяти, например, microSD, и считывать их по интерфейсу SDIO или воспользоваться контроллером внешней памяти Quad-SPI [8].

Quad-SPI – контроллер внешней памяти SPI-Flash, в том числе DUAL и QUAD SPI-Flash (рисунок 12). Если у обычной SPI-Flash есть только один канал для передачи данных, то у микросхем DUAL/QUAD SPI-Flash имеется две/четыре линии данных. Увеличение числа линий позволяет значительно повысить скорость обмена.

Рис. 12. Структурная схема QUADSPI и подключение внешней Flash-памяти

Рис. 12. Структурная схема QUADSPI и подключение внешней Flash-памяти

В простейшем случае Quad-SPI-контроллер способен работать с обычной одноканальной SPI-Flash, но для получения максимальной скорости обмена следует использовать микросхемы QUAD SPI-Flash. При этом допустимо подключение одной (режим Single Flash Mode) или двух (режим Dual Flash Mode) параллельных микросхем.

В режиме Single Flash Mode память подключается с использованием шести линий: CLK, BK_IO [3…0], BK_CS. В таком случае за один такт возможна передача до четырех бит информации, если данные защелкиваются только по фронту или только по срезу (Single Data Rate Mode). Если производить считывание данных и по фронту, и по срезу, то за один такт можно передавать до 8 бит (Double Data Rate Mode).

В режиме Dual Flash Mode используются две микросхемы Flash. При этом они имеют общие линии тактирования CLK и выбора кристалла BK_CS, а линии данных разделены. В таком случае скорость обмена составляет 8/16 битов за такт (Double Data Rate Mode).

Quad-SPI может работать в трех режимах:

  • непрямой обмен (indirectmode) – работа вручную с регистрами Quad-SPI;
  • обмен по прерыванию (statuspollingmode) – периодический опрос статусного регистра внешней Flash;
  • отображение внешней Flashна адресное пространство контроллера (memory-mappedmode).

Последний режим является предпочтительным, так как позволяет автоматизировать обмен с внешней Flash за счет DMA, в том числе – Chrom-ART.

Графический ускоритель Chrom-ART

Самым узким местом при работе с графикой остается пересылка данных. Поэтому, говоря о графических возможностях STM32, нельзя не упомянуть об ускорителе Chrom-ART.

Ускоритель Chrom-ART (DMA2D) представляет собой контроллер прямого доступа к памяти, созданный специально для работы с графическими изображениями [9]. Он способен не только производить пересылку больших объемов данных без участия процессорного ядра, но и выполнять дополнительные потоковые преобразования пересылаемых изображений:

  • заливка исходного изображения (или его части) заданным цветом;
  • копирование исходного изображения (или его части) в заданную область конечного изображения;
  • копирование исходного изображения (или его части) в заданную область конечного изображения с дополнительным преобразованием формата цвета пикселей;
  • смешивание изображений (или их частей) с одинаковыми или различными форматами цветов пикселей и помещение в заданную область конечного изображения с дополнительным преобразованием формата цвета пикселей.

DMA2D является мастером на шине AHB (AXI в случае STM32H7) и способен выполнять следующие виды обмена данными между различными источниками: регистр-память, память-память, память-память с преобразованием формата цвета, память-память со смешиванием и с преобразованием формата цвета. Дополнительную гибкость при построении графических приложений дает возможность использования Chrom-ART не только с внутренней, но и с внешней памятью различных типов.

Дополнительные возможности новых семейств STM32

Компания STMicroelectronics не останавливается на достигнутом и продолжает развивать графические возможности своих микроконтроллеров. Среди наиболее значимых новинок можно отметить Chrom-GRC и JPEG-кодек.

В семействах STM32L4 появился блок оптимизации памяти Chrom-GRC. Он позволяет эффективно размещать графические данные при работе с дисплеями округлой формы [10].

Если видимая область представляет собой прямоугольник, то графические блоки (контроллер LTDC, DMA2D) оптимально используют память. Однако если речь идет о круглых дисплеях, то возникают «слепые» участки, которые никогда не будут отображаться. Chrom-GRC устраняет эти пробелы, позволяя экономить до 20% памяти.

JPEG-кодек – новый блок, появившийся в семействах STM32F7 и STM32H7. В настоящий момент JPEG является наиболее популярным форматом хранения изображений. Наличие аппаратного кодека значительно упрощает жизнь программистам и снижает загрузку процессора при работе с изображениями. Более того, данный кодек позволяет воспроизводить и захватывать видео в формате MJPEG практически без участия процессорного ядра. В сети можно найти примеры уже готовых библиотек.

Заключение

Микроконтроллеры STM32 производства компании STMicroelectronics поддерживают работу практически со всеми популярными интерфейсами TFT-панелей, в том числе – SPI, Motorola 6800, Intel 8080, Parallel RGB, DSI.

Пользователям STM32 предлагается широкий выбор периферийных блоков для взаимодействия с графическими дисплеями:

  • SPI-интерфейсы для работы с SPI-дисплеями;
  • контроллер внешней памяти FSMC для реализации интерфейсов Motorola 6800, Intel 8080;
  • LTDC – специализированный TFT-контроллер для работы с RGB-дисплеями;
  • MIPI-DSI Host – специализированный интерфейс для работы DSI-дисплеями.

В состав многих микроконтроллеров STM32 входят и другие вспомогательные блоки, созданные для оптимизации работы с графикой: графический ускоритель Chrom-ART, блок оптимизации хранения графических данных Chrom-GRC, JPEG-кодек.

Современные графические системы требуют значительных объемов памяти. ОЗУ микроконтроллеров STM32 может быть расширено за счет использования контроллера внешней памяти FSMC/FMC. Для увеличения объема Flash применяется скоростной контроллер Quad-SPI.

Литература

  1. Вячеслав Гавриков. TFT-дисплеи Winstar: новинки, характеристики и особенности подключения. НЭ №11/2017
  2. Артем Дмитриев. STM32 + современный TFT-дисплей: варианты на любой вкус. НЭ №1/2018
  3. Вячеслав Гавриков. Простые бесплатные программные средства разработки ПО для STM32. НЭ №1/2017
  4. AN2790 Application note TFT LCD interfacing with the high-density STM32F10xxx FSMC. ST Microelectronics, 2008
  5. AN3241 Application note QVGA TFT-LCD direct drive using the STM32F10xx FSMC peripheral. ST Microelectronics, 2010
  6. AN4861 Application note LCD-TFT display controller (LTDC) on STM32 MCUs. ST Microelectronics, 2017
  7. Application note. DSI Host on STM32F469/479, STM32F7x8/x9 and STM32L4R9/S9 MCUs. ST Microelectronics, 2017
  8. AN4760 Application note Quad-SPI (QSPI) interface on STM32 microcontrollers. ST Microelectronics, 2016
  9. AN4943. Application note. Using the Chrom-ART Accelerator™ to refresh an LCD-TFT display on STM32L496xx/L4A6xx/L4Rxxx/L4Sxxx microcontrollers. ST Microelectronics, 2017
  10. AN5051 Application note Graphic memory optimization with STM32 Chrom-GRC™™. ST Microelectronics, 2017

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее