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



 

Урок 66

 

Часть 2

 

HAL. LTDC. SDRAM

 

В предыдущей части нашего занятия мы настроили проект в MS Cube, сгенерировали проект для Keil и начали писать исходный код.

 

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

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

 

/* USER CODE BEGIN 3 */
for(i=0;i<50;i++)
{
   TFT_FillScreen(HAL_RNG_GetRandomNumber(&hrng)|0xFF000000);
   HAL_Delay(200);
}
TFT_FillScreen(0);
HAL_Delay(1000);

 

Проверим работу кода, собрав код и прошив контроллер. Всё у нас окрашивается без тормозов.

 

 

В ltdc.c напишем функцию отрисовки закрашенных прямоугольников

 

//————————————————-
void TFT_FillRectangle(uint16_t x1, uint16_t y1,
        uint16_t x2, uint16_t y2, uint32_t color)
{
 uint32_t xpos, ypos;
 if(x1>x2) swap(x1,x2);
 if(y1>y2) swap(y1,y2);
 for(ypos=y1;ypos<=y2;ypos++)
 {
  for(xpos=x1;xpos<=x2;xpos++)
  {
   *(__IO uint32_t*) (hltdc.LayerCfg[0].FBStartAdress + (4*(ypos*hltdc.LayerCfg[0].ImageWidth + xpos))) = color;
  }
 } 
}
//————————————————-

 

Напишем для данной функции прототип и раскомментируем ещё часть кода в бесконечном цикле в функции main(), также добавив маскирование в цвет

 

  HAL_Delay(1000);
  for(i=0;i<1000;i++)
  {
   TFT_FillRectangle(HAL_RNG_GetRandomNumber(&hrng)%480,
            HAL_RNG_GetRandomNumber(&hrng)%272,
            HAL_RNG_GetRandomNumber(&hrng)%480,
            HAL_RNG_GetRandomNumber(&hrng)%272,
            HAL_RNG_GetRandomNumber(&hrng)|0xFF000000);
   HAL_Delay(10);
  }
  TFT_FillScreen(0);
  HAL_Delay(1000);

 

Проверим данный код на практике

 

image07

 

Раскомментируем следующий участок кода в бесконечном цикле по выводу точек, внеся также коррективы в случайный цвет и убирая преобразование типов

 

  HAL_Delay(1000);
  for(i=0;i<10000;i++)
  {
   for(j=0;j<100;j++)
   {
     TFT_DrawPixel(HAL_RNG_GetRandomNumber(&hrng)%480,
          HAL_RNG_GetRandomNumber(&hrng)%272,0);
   }
   TFT_DrawPixel(HAL_RNG_GetRandomNumber(&hrng)%480,
          HAL_RNG_GetRandomNumber(&hrng)%272,
          (uint16_t)HAL_RNG_GetRandomNumber(&hrng)|0xFF000000);
   HAL_Delay(1);
  }
  TFT_FillScreen(0);
  HAL_Delay(1000);

 

 

Соберём код, прошьём контроллер и проверим результат

 

image08

 

В функции отрисовки прямых линий изменим тип переменной цвета на 32-разрядный, и в файле реализации функций и в хедере

 

//————————————————-
void TFT_DrawLine(uint16_t x1, uint16_t y1,
        uint16_t x2, uint16_t y2, uint32_t color)

 

Раскомментируем оставшийся код в бесконечном цикле, внося такие же корректировки

 

    HAL_Delay(1000);
    for(i=0;i<1000;i++)
    {    
      TFT_DrawLine(HAL_RNG_GetRandomNumber(&hrng)%480,
              HAL_RNG_GetRandomNumber(&hrng)%272,
              HAL_RNG_GetRandomNumber(&hrng)%480,
              HAL_RNG_GetRandomNumber(&hrng)%272,
              HAL_RNG_GetRandomNumber(&hrng)|0xFF000000);
     HAL_Delay(10);
    }
    TFT_FillScreen(0);
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */

 

Соберём проект, прошьём контроллер и посмотрим результат на нашем дисплее

 

image09

 

Таким образом, мы всё-таки смогли назначить в качестве видеопамяти часть памяти SDRAM, отвязав в очередной раз код от использования библиотеки BSP.

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

 

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

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM HAL. LTDC. SDRAM

Один комментарий на “STM Урок 66. HAL. LTDC. SDRAM. Часть 2
  1. Георгий:

    Если я не ошибся, ошибка в функции drawLine  так и осталась в ваших файлах. Тут вы ее исправили а в библиотеке нет. Сори если ошибся.

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

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

*