Урок 60
Часть 2
F769I-DISCO. WB. LCD. SDIO
Продолжаем работу с бесплатной средой программирования System Workbench for STM32.
В прошлой части занятии мы подготовили проект, подготовили и почти подключили файлы BSP.
Сегодня мы продолжим данную тему.
Если проект у нас нормально собирается, то попробуем инициализировать дисплей и закрасить его в какой-нибудь цвет.
В файле main.с подключим нужные файлы библиотеки BSP
/* USER CODE BEGIN Includes */
#include «stm32f769i_discovery.h»
#include «stm32f769i_discovery_lcd.h»
/* USER CODE END Includes */
Объявим буфер в main.c
/* Private variables ———————————————————*/
#define LCD_FRAME_BUFFER SDRAM_DEVICE_ADDR
/* USER CODE END PV */
Напишем код инициализации и закрашивания дисплея в синий цвет в main()
/* USER CODE BEGIN 2 */
BSP_LCD_Init();
BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND);
BSP_LCD_Clear(LCD_COLOR_BLUE);
/* USER CODE END 2 */
Соберём проект.
Если всё нормально собирается, то запустим проект сначала через отладку. Дисплей должен будет окраситься в синий цвет.
Это самое главное. Дисплей работает.
Не забываем отключить оптимизацию
Тепреь подготовим SD-носитель и таким же образом, как и с другим контроллером дисплея, в корень карты положим файлы с рисунками в формате bmp, только из папки «BMP_800x480» Переименуем файл Image.bmp в image02.bmp. У нас получится 5 файлов. Правда я в решил показать заодно вам свои фотографии, и преобразовал их в такое же разрешение с такими же именами. Да и вопросов правовых поменьше будет.
Теперь весь код по подключению FATFS, SDIO, а также по копированию в память рисунка и вывода его на экран мы можем скопировать из одноименного файла прошлого проекта.
Начнем потихоньку
/* USER CODE BEGIN Includes */
#include <stdlib.h>
#include <string.h>
#include «stm32f769i_discovery.h»
— — — — — — — — —
#define LCD_FRAME_BUFFER SDRAM_DEVICE_ADDR
FATFS SDFatFs; /* File system object for SD card logical drive */
FIL MyFile; /* File object */
extern char SD_Path[4]; /* SD logical drive path */
uint8_t sect[4096];
uint32_t bytesread = 0;
uint8_t* bmp1;
/* USER CODE END PV */
— — — — — — — — — — —
/* USER CODE BEGIN 0 */
uint32_t OpenBMP(uint8_t *ptr, const char* fname)
{
uint32_t ind=0,sz=0,i1=0,ind1=0;
static uint32_t bmp_addr;
if(f_open(&MyFile,fname,FA_READ)!=FR_OK)
{
BSP_LCD_Clear(LCD_COLOR_RED);
}
else
{
if(f_read(&MyFile,sect,30,(UINT *)&bytesread)!=FR_OK)
{
Error_Handler();
}
else
{
bmp_addr=(uint32_t)sect;
/*Get bitmap size*/
sz=*(uint16_t*)(bmp_addr + 2);
sz|=(*(uint16_t*)(bmp_addr + 4))<<16;
/*Get bitmap data address offset*/
ind=*(uint16_t*)(bmp_addr + 10);
ind|=(*(uint16_t*)(bmp_addr + 12))<<16;
f_close(&MyFile);
f_open(&MyFile,fname,FA_READ);
ind=0;
do
{
if(sz<4096)
{
i1=sz;
}
else
{
i1=4096;
}
sz-=i1;
f_lseek(&MyFile,ind1);
f_read(&MyFile,sect,i1,(UINT *)&bytesread);
memcpy((void*)(bmp1+ind1),(void*)sect,i1);
ind1+=i1;
}
while(sz>0);
f_close(&MyFile);
}
ind1=0;
}
return 0;
}
/* USER CODE END 0 */
Здесь, конечно, будет адрес другой, так как размер экрана больше, и памяти также нужно больше
/* USER CODE BEGIN 1 */
bmp1 = (uint8_t *)0xC02EE000;
/* USER CODE END 1 */
Теперь код в первой задаче. У нас 5 рисунков
/* USER CODE BEGIN 5 */
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
{
BSP_LCD_Clear(LCD_COLOR_RED);
Error_Handler();
}
/* Infinite loop */
for(;;)
{
OpenBMP((uint8_t *)bmp1,«image01.bmp«);
BSP_LCD_DrawBitmap(0,0,(uint8_t *)bmp1);
osDelay(1000);
OpenBMP((uint8_t *)bmp1,«image02.bmp«);
BSP_LCD_DrawBitmap(0,0,(uint8_t *)bmp1);
o sDelay(1000);
OpenBMP((uint8_t *)bmp1,«image03.bmp«);
BSP_LCD_DrawBitmap(0,0,(uint8_t *)bmp1);
osDelay(1000);
OpenBMP((uint8_t *)bmp1,«image04.bmp«);
BSP_LCD_DrawBitmap(0,0,(uint8_t *)bmp1);
osDelay(1000);
OpenBMP((uint8_t *)bmp1,«image05.bmp«);
BSP_LCD_DrawBitmap(0,0,(uint8_t *)bmp1);
osDelay(1000);
}
Синий здесь поменяем на чёрный
BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER_BACKGROUND);
BSP_LCD_Clear(LCD_COLOR_BLACK);
Соберём код и прошьём контроллер.
Мы должны увидеть 5 рисунков появляющихся по очереди. Вот, например, один из них
Теперь квадратик во второй задаче. Соответственно, координаты будут другие, так как разрешение дисплея другое
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
BSP_LCD_SetTextColor((uint32_t)(LCD_COLOR_TRANSPARENT|((rand()%256)<<16)|((rand()%256)<<8)|(rand()%256)));
BSP_LCD_FillRect(640,240,160,240);
osDelay(10000);
}
/* USER CODE END StartTask02 */
}
Ещё раз соберём и прошьём. Иногда будут появляться вот такие квадратики
Значит FreeRTOS у нас также работает.
Также советую посмотреть видеоурок особенно тем у кого нет такой платы, чтобы увидеть всё воочию.
Предыдущая часть Программирование МК STM32 Следующий урок
Отладочную плату можно приобрести здесь недорого (продавец проверенный) STM32F769I-DISCO
Смотреть ВИДЕОУРОК
Исходный код по ссылке не открывается…
Теперь работает, спасибо за замечание!
вместо arm в пути к файлу написал stm. Бывает…
Здесь, конечно, будет адрес другой, так как размер экрана больше, и памяти также нужно больше
/* USER CODE BEGIN 1 */
bmp1 = (uint8_t *)0xC02EE000;
/* USER CODE END 1 */
Снимаю шапку за то что делаете. Ну очень познавательные уроки. Подскажите пожалуйста, как Вы вычислили адрес? Уже по всякому пробовал. Спасибо
По факту не было смысла выполнять конфигурирование LTDC и DSI Host в первой части т.к. функция BSP_LCD_Init(); выполняет полное переконфигурирование.
Тоже самое относится и к FMC. Из ф-ии BSP_LCD_Init — вызывается BSP_SDRAM_Init, которая устанавливает совою конфигурацию.
Очень неплохие уроки у Вас получаются, для новичков это неплохое подспорье.
Спасибо!
Я в курсе, Это на будущее.
А кто-нибудь пробовал подключить дисплей Raspberry 7" DSI к плате stm32f769-discovery?
Почему возникает ошибка «fatal error: stm32469i_discovery_lcd.h: No such file or directory»? Хотя файл присутствует и открывается.
Извиняюсь. Плохо урок смотрел. Проблему исправил добавив папку в проект в свойствах. Вопрос закрыт.