STM Урок 64. HAL. LTDC. Часть 2



 

Урок 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 Следующая часть

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК

 

STM32 HAL. LTDC

2 комментария на “STM Урок 64. HAL. LTDC. Часть 2
  1. Стас:

    А можно в данном примере добавить ещё буфер, в какой он памяти будет? SRAM1 и SRAM2 уже заняты. В DTCM можно делать переменные хранить?

  2. Стас:

    У меня данный пример не работает, на экране есть фон, но из буфера ни чего не рисуется, слой не настраивается! Возможно настройку слоя нужно делать после настройки контроллера? Есть ли какая ни будь проверка, того, что контроллер настроен и можно слой настраивать?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*