Урок 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);
Проверим данный код на практике
Раскомментируем следующий участок кода в бесконечном цикле по выводу точек, внеся также коррективы в случайный цвет и убирая преобразование типов
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);
Соберём код, прошьём контроллер и проверим результат
В функции отрисовки прямых линий изменим тип переменной цвета на 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 */
Соберём проект, прошьём контроллер и посмотрим результат на нашем дисплее
Таким образом, мы всё-таки смогли назначить в качестве видеопамяти часть памяти SDRAM, отвязав в очередной раз код от использования библиотеки BSP.
Предыдущая часть Программирование МК STM32 Следующий урок
Отладочную плату можно приобрести здесь 32F746G-DISCOVERY
Смотреть ВИДЕОУРОК (нажмите на картинку)
Если я не ошибся, ошибка в функции drawLine так и осталась в ваших файлах. Тут вы ее исправили а в библиотеке нет. Сори если ошибся.