Урок 64
HAL. LTDC
Часть 2
В прошлой части нашего занятия мы познакомились со схемой подключения дисплея, создали полностью новый проект в MS Cube, настроили его и сгенерирволали проект для Keil.
Откроем наш проект, настроим программатор на авторезет и подключим ещё два файла для будущей библиотеки ltdc.c и ltdc.h.
Соберём проект и подключим файл ltdc.h в файлах main.c
/* USER CODE BEGIN Includes */
#include «ltdc.h»
/* USER CODE END Includes */
и ltdc.c
#include «ltdc.h»
//————————————————-
Файл ltdc.h у нас будет иметь вот такое вот содержание
#ifndef __LTDC_H
#define __LTDC_H
#include «stm32f7xx_hal.h»
#include <string.h>
#include <stdlib.h>
//———————————————
//———————————————
#endif /* __LTDC_H */
Добавим переменную в файле main.c
/* USER CODE BEGIN PV */
/* Private variables ———————————————————*/
volatile uint32_t RGB565_480x272[65280] = {0x00000000};
/* USER CODE END PV */
Вот это и будет у нас место в оперативной памяти, отведённое под видеопамять. Получается у нас здесь как раз 261120 байтов, сколько и необходимо для нашего дисплея, работающего в режиме формате пикселя RGB565.
Вызовем следующую функцию в main()
/* USER CODE BEGIN 2 */
HAL_LTDC_SetAddress(&hltdc,(uint32_t) &RGB565_480x272,0);
/* USER CODE END 2 */
Данная фукнция и привяжет отведённое место в памяти к нашему интерфейсу LTDC, к его первому слою. Слои считаются от 0.
Теперь попробуем что-нибудь отобразить на дисплее, хотя бы закрасить его в какой-нибудь цвет.
Для этого зайдём в файл ltdc.c и добавим там фукнцию для заливки экрана определённым цветом
//————————————————-
void TFT_FillScreen(uint32_t color)
{
}
//————————————————-
Добавим здесь прототип в хедер-файле (я не буду здесь постить прототипы, так как это уже все умеют делать давным давно).
void TFT_FillScreen(uint32_t color)
{
uint32_t i;
Теперь подключим в этом же файле две переменных из главного модуля — указатель на массив памяти и указатель на LTDC
#include «ltdc.h»
//————————————————-
extern volatile uint32_t RGB565_480x272[65280];
extern LTDC_HandleTypeDef hltdc;
Продолжим нашу функцию.
Рассчитаем количество памяти для заливки
uint32_t i;
uint32_t n = hltdc.LayerCfg[0].ImageHeight*hltdc.LayerCfg[0].ImageWidth;
Ну и, соответственно, зальём весь участок памяти, начиная со стартового адреса, определённым цветом. Заливаем сразу по 2 байта, так как у нас 2 байта на пискесль (16 бит)
uint32_t n = hltdc.LayerCfg[0].ImageHeight*hltdc.LayerCfg[0].ImageWidth;
for(i=0;i<n;i++)
{
*(__IO uint16_t*) (hltdc.LayerCfg[0].FBStartAdress + (i*2)) = (uint16_t) color;
}
}
Вернёмся в функцию main() и попробуем залить экран, например зелёным цветом
HAL_LTDC_SetAddress(&hltdc,(uint32_t) &RGB565_480x272,0);
TFT_FillScreen((uint32_t)0x07E0);
Если всё правильно, то после сборки и прошивки экран должен засветиться зелёным цветом.
Исправим данную строку на заливку экрана чёрным цветом. Так мы будем очищать экран
TFT_FillScreen(0);
Теперь давайте, используя генератор случайных чисел, попробуем позаливать экран в различные случайные цвета.
Для этого сначала добавим две локальных переменных в main().
/* USER CODE BEGIN 1 */
uint16_t i,j;
/* USER CODE END 1 */
Вторая потребуется позже для других интересных тестов.
Добавим обычный цикл в наш бесконечный цикл, а по окончанию очистим экран и добавим задержку перед следующим тестом
/* USER CODE BEGIN 3 */
for(i=0;i<100;i++)
{
TFT_FillScreen((uint16_t)HAL_RNG_GetRandomNumber(&hrng));
HAL_Delay(100);
}
TFT_FillScreen(0);
HAL_Delay(1000);
Прошьём контроллер и проверим. Должно всё 10 раз в секунду заливаться разными случайными цветами.
В следующей части нашего занятия мы напишем ещё несколько функций и тестов по проверке дисплея.
Предыдущая часть Программирование МК STM32 Следующая часть
Отладочную плату можно приобрести здесь STM32F746G-DISCOVERY
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
А можно в данном примере добавить ещё буфер, в какой он памяти будет? SRAM1 и SRAM2 уже заняты. В DTCM можно делать переменные хранить?
У меня данный пример не работает, на экране есть фон, но из буфера ни чего не рисуется, слой не настраивается! Возможно настройку слоя нужно делать после настройки контроллера? Есть ли какая ни будь проверка, того, что контроллер настроен и можно слой настраивать?