Микроконтроллеры без TFT-контроллера

TouchGFX можно запускать на MCU, которые не имеют встроенного контроллера TFT. Обычно это означает, что подключенный дисплей имеет свою собственную видеопамять и встроенный контроллер для постоянного обновления дисплея. Когда данные пикселей изменяются, MCU передает это на дисплей, используя SPI / 8080 или аналогичное соединение.

Обратите внимание, что TouchGFX по соображениям производительности не может отображаться непосредственно в видеопамять дисплея. Вам все еще нужно иметь один кадр буфера, помещенный во внутреннюю память SRAM или внешнюю память, в зависимости от которой TouchGFX может визуализировать содержимое экрана и впоследствии передавать соответствующие изменения на дисплей.

Чтобы настроить TouchGFX для такого сценария, вам необходимо сделать следующее

Включить режим буфера одного кадра

Обычно нет никакой пользы от использования двойной буферизации, когда у вас нет контроллера TFT на MCU. Чтобы настроить TouchGFX для режима однокадрового буфера, измените вызов hal.setFrameBufferStartAddress()в вашей BoardConfiguration, чтобы указать значение false в качестве значения useDoubleBufferingаргумента.

Генерация периодического тика

TouchGFX должен периодически отмечаться, чтобы начать обработку кадра. На MCU с контроллером TFT это достигается периодическим уведомлением о прерывании VSYNC. На MCU без контроллера TFT вы можете настроить периодический аппаратный таймер для имитации этого сигнала. Рекомендуемая частота тиков составляет около 60 Гц, поэтому этот таймер прерывает срабатывание прибл. каждые 17 мс. В этом прерывании вы должны вызвать функцию, OSWrappers::signalVSyncчтобы начать обработку кадра:

void HW_Timer_IRQHandler()
{
  OSWrappers::signalVSync(); 
}

Этот метод может привести к разрыву на дисплее, поскольку микроконтроллер может в конечном итоге посылать новые данные пикселей на дисплей в середине сканирования обновления дисплея. Поэтому часто необходимо синхронизировать программный сигнал VSYNC с сигналом с дисплея. На многих дисплеях этот внешний сигнал называется «эффект разрыва».

Отключить блокировку DMA

Поскольку TFT-контроллер отсутствует, операциям DMA не нужно ждать события frontPorchEntered  перед началом рисования. Это противоречит обычному сценарию буфера одного кадра, где вы увидите разрыв на дисплее, если рисование происходит одновременно с обновлениями дисплея. Но так как отображение переносится вручную после рисования, нет риска этой проблемы, поэтому блокировка DMA должна быть отключена в вашей BoardConfiguration:

// Allow DMA transfers to start immediately
hal.lockDMAToFrontPorch(false);

Передача данных кадрового буфера

После того, как TouchGFX завершит рисование кадра, автоматически будет вызвана подключаемая функция в случае изменения содержимого буфера кадра. Эта функция может быть переопределена и изменена для передачи соответствующих частей буфера кадра на дисплей. Точный механизм и протокол для связи с дисплеем зависит от конкретной платформы, поэтому вам придется реализовать это для своего оборудования. 
Функция для реализации есть HAL::flushFrameBuffer(const Rect& rect)Создайте новый подкласс используемой для MCU реализации HAL и предоставьте реализацию в соответствии с приведенным ниже описанием.

class MyHAL : public STM32F4HAL
{
public:
  void flushFrameBuffer(const Rect& rect)
  {
    // Remember to call base implementation
    STM32F4HAL::flushFrameBuffer(rect);

    // platform specific (pseudo code)
    // Tell display which region of the screen is now being updated.
    spi_display_set_region(rect.x, rect.y, rect.width, rect.height);
    // Transfer this region of frame buffer to display.
    spi_transfer_fb(rect);
  }
};

 

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru