STM Урок 60. F769I-DISCO. WB. LCD. SDIO. Часть 2



Урок 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 */

Соберём проект.

Если всё нормально собирается, то запустим проект сначала через отладку. Дисплей должен будет окраситься в синий цвет.

Это самое главное. Дисплей работает.

Не забываем отключить оптимизацию

image27

Тепреь подготовим 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 */

— — — — — — — — — — —

OpenBMP

/* 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 рисунков появляющихся по очереди. Вот, например, один из них

image29

Теперь квадратик во второй задаче. Соответственно, координаты будут другие, так как разрешение дисплея другое

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 */

}

Ещё раз соберём и прошьём. Иногда будут появляться вот такие квадратики

image30

Значит FreeRTOS у нас также работает.

Также советую посмотреть видеоурок особенно тем у кого нет такой платы, чтобы увидеть всё воочию.

 

 

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

 

Исходный код

 

Отладочную плату можно приобрести здесь недорого (продавец проверенный) STM32F769I-DISCO

 

 

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

STM32 F769I-DISCO. WB. LCD. SDIO

8 комментариев на “STM Урок 60. F769I-DISCO. WB. LCD. SDIO. Часть 2
  1. ОлегМ:

    Исходный код по ссылке не открывается…

  2. Андрей:

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

    /* USER CODE BEGIN 1 */

    bmp1 = (uint8_t *)0xC02EE000;

    /* USER CODE END 1 */

    Снимаю шапку за то что делаете. Ну очень познавательные уроки. Подскажите пожалуйста, как Вы вычислили адрес? Уже по всякому пробовал. Спасибо

  3. Александр:

    По факту не было смысла выполнять конфигурирование LTDC и DSI Host в первой части т.к. функция BSP_LCD_Init(); выполняет полное переконфигурирование. 

    Тоже самое относится и к FMC. Из ф-ии BSP_LCD_Init — вызывается   BSP_SDRAM_Init, которая устанавливает совою конфигурацию.

    Очень неплохие уроки у Вас получаются, для новичков это неплохое подспорье.

     

  4. Alex:

    А кто-нибудь пробовал подключить дисплей Raspberry 7" DSI к плате stm32f769-discovery?

  5. Антон:

    Почему возникает ошибка «fatal error: stm32469i_discovery_lcd.h: No such file or directory»? Хотя файл присутствует и открывается.

  6. Антон:

    Извиняюсь. Плохо урок смотрел. Проблему исправил добавив папку в проект в свойствах. Вопрос закрыт.

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

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

*