Разрабатываем устройство с графикой на STM32. Основные возможности периферии
21 июня 2018
Данная статья является третьей в серии публикаций, посвященных построению графических приложений на базе микроконтроллеров 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):
- для 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
Информацию о расположении выводов контроллера FSMC можно взять из документации, но быстрее и проще будет воспользоваться программой STM32CubeMX. Предположим, что при старте проекта STM32CubeMX был выбран микроконтроллер STM32F103ZE (рисунок 1). Тогда для назначения выводов FSMC потребуется всего лишь несколько раз щелкнуть мышкой в окне «Pinout» (рисунок 3).
При настройке 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-дисплеем
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
Встроенный 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 имеет аппаратную поддержку смешивания слоев
Говоря о прозрачности, нельзя не упомянуть о том, что LTDC поддерживает чрезвычайно популярную технологию хромакея (Color keying). Она заключается в том, что один из цветов верхнего слоя «назначается» прозрачным, и вместо пикселей с таким цветом отображается нижний слой. На рисунке 7 показан конкретный пример, в котором зеленый цвет слоя Layer1 заменяется картинкой со слоя Layer2.

Рис. 7. Использование хромакея в STM32
Еще одним важным достоинством TFT-контроллеров в STM32 является наличие аппаратного дизеринга (2 бита). Он может применяться для имитации 24-битного цвета на 18-битном дисплее.
Чтобы подключить микроконтроллер STM32 к RGB-дисплею, можно либо самостоятельно изучить документацию, либо воспользоваться программой STM32CubeMX или взять за основу готовые проекты, например, отладочные платы. STM32CubeMX помогает быстро выполнить распиновку и настройку TFT-контроллера без значительных затрат времени (рисунок 8). Программа автоматически назначает выводы и генерирует код инициализации.
Если же за основу решено взять готовый проект, то хорошим вариантом будет использование отладочных наборов производства компании 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 включает в себя несколько основных блоков (рисунок 9):
- 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) (рисунок 10).

Рис. 10. Контроллер внешней памяти 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 (рисунок 11). Если у обычной SPI-Flash есть только один канал для передачи данных, то у микросхем DUAL/QUAD SPI-Flash имеется две/четыре линии данных. Увеличение числа линий позволяет значительно повысить скорость обмена.

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