STM Урок 37. Дисплей TFT 240×320 8bit. Часть 1



Урок 37

Часть 1

 

Дисплей TFT 240×320 8bit

 

Сегодня мы к контроллеру STM32 попробуем подключить дисплей TFT разрешением 240×320. Модуль дисплея выполнен на контроллере ILI9341 и подключается посредством 8-разрядной шины и подключать мы его будем, используя технологию FSMC. Это технология, позволяющая работать с контроллером дисплея, как с обычной памятью, не заботясь также о том, какой управляющей ножкой и когда дрыгать.

По данному дисплею у меня есть также урок для контроллера AVR. Советую его также просмотреть. После этого вам станет намного понятнее работа с ним.

Проект создаём из проекта USB_HOST_MSC_FATFS. Назовем его ILI9341. Запустим проект в Cube, отключим вывод PD7 и PD14, иначе мы не включим FSMC.

 

image01  image03

 

Включим FSMC следующим образом

 

image02

 

Теперь мы видим, к каким ножкам контроллера какие ножки дисплея подключать.

 

 

Также у контроллера есть лапка для перезагрузки (LCD_RST). Для управления данной лапкой дисплея включим лапку порта PD6 на выход.

 

image05

 

В Configuration в FSMC включим следующие тайминги

 

image04

 

Также включим RNG для нормального формирования случайного числа

 

image00

 

Сгенерируем проект, откроем его, подключим lcd.c. Соберем проект и настроим программатор.

Создадим и добавим файлы ili9341.c и ili9341.h в соответствующие директории src и inc

Подключим файл в main.h

#include «lcd.h»

#include «ili9341.h»

 

#endif /* MAIN_H_ */

Его же подключим и в ili9341.c

#include «ili9341.h»

 

 

Стандартным образом заполним данный файл и подключим в него необходимые библиотеки

 

#ifndef ILI9341_H_

#define ILI9341_H_

 

#include <stdlib.h>

#include «stm32f4xx_hal.h»

#include «lcd.h»

#include «fatfs.h»

 

#endif /* ILI9341_H_ */

 

Объявим переменные адресов для данных и команд в файл ili9341.h

 

#include «fatfs.h»

 

#define ADDR_CMD        *(uint8_t*)0x60000000

#define ADDR_DATA        *(uint8_t*)0x60010000

 

Добавим сюда же еще несколько макроподстановок

 

#define ADDR_DATA        *(uint8_t*)0x60010000

 

#define swap(a,b) {int16_t t=a;a=b;b=t;}

#define  RESET_ACTIVE   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET);

#define  RESET_IDLE   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);

 

#define  BLACK 0x0000

#define  BLUE 0x001F

#define  RED 0x0F800

#define  GREEN 0x07E0

#define  CYAN 0x07FF

#define  MAGENTA 0xF81F

#define  YELLOW 0xFFE0

#define  WHITE 0xFFFF

 

Добавим функцию инициализации дисплея в файл ili9341.c

 

#include «ili9341.h»

 

//—————————————————————

void TFT9341_ini(void)

{

}

 

Не забываем добавить прототип в хедер-файл.

Вызовем данную функцию в main.c

 

        LCD_Clear();

        TFT9341_ini();

  /* USER CODE END 2 */

 

В функции FileReadWrite оставим только вот это

 

/* USER CODE BEGIN 0 */

//—————————————————————

void FileReadWrite(void)

{

        if(f_mount(&USBDISKFatFs,(TCHAR const*)USBH_Path,0)!=FR_OK)

        {

                Error_Handler();

        }

        else

        {

        }

}

 

В файл ili9341.c добавим две функции для задержки

 

#include «ili9341.h»

//—————————————————————

void TFT9341_Delay(uint32_t dly)

{        

    uint32_t i;

    for(i = 0; i < dly; i++);

}

//—————————————————————

__STATIC_INLINE void DelayMicro(__IO uint32_t micros)

{

        micros *=(SystemCoreClock / 1000000) / 5;

        while (micros—);

}

//—————————————————————

 

Перед тем, как писать другие функции, давайте посмотрим, как именно у нас подключен дисплей к плате Discovery (вообще также советую посмотреть видеоурок, в нём вы всё это увидите гораздо лучше, ибо здесь в основном объяснение кода)

 

image00_500

 

Как мы видим, у нас ещё подключен дисплей символьный через переходник по шине I2C для мониторинга считанного идентификатора.

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

 

image01

 

Вообщем, практически первоначальные настройки для работы с дисплеем мы завершили. А функции уже мы будем писать, начиная со следующей части занятия.

 

 

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

 

 

Техническая документация на контроллер дисплея

 

 

Отладочную плату и дисплей LCD 20×4 можно приобрести здесь:

STM32F4-DISCOVERY

Дисплей LCD 20×4

Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.

 

 

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

 

STM Дисплей TFT 240x320 8bit

19 комментариев на “STM Урок 37. Дисплей TFT 240×320 8bit. Часть 1
  1. Алексей:

    непотня как его подключить, шина данных ясно, а вотпин rs wr и rd  не ясно, где можно найти эту информацию?

    • Подробнее рассказано в уроке по avr. Видеоверсия на моём канале есть, а вот текстово-сайтовая вскоре также будет опубликована.

      А вообще rs — это переключение вида отправки информации (команда/данные)

      wr — запись

      rd — чтение

       

  2. Алексей:

    NOE -> RD

    NWE -> WR

    NE1 -> CS

    A16 -> RS

  3. Алексей:

    у Вас на двух чипах HC245  написано? на самом дисплеи?

  4. Алексей:

    на самом дисплеи у меня надпись сзади LMS241GF31 , но выглядит как Ваш один в один

     

  5. Алексей:

    А получается так тип контроллера не определить? Я отклеил экран, есть надпись HB90615010 и S241GF31, последнее это вроде тип дисплея.

  6. Артем:

    #define ADDR_CMD *(uint8_t*)0x60000000
    #define ADDR_DATA *(uint8_t*)0x60010000

    Почему именно А18 NE1, если например NE4 в первом банке и A20?
    Первое должно быть 0х6С000000 а как вычислить второе?

  7. Артем:

    0х6С00007Е для A6 выходит но почему помогите разобраться

    • evorontsov:

      Цитатка, которая помогла разобраться:
      «Пусть как уже решили подключен 16 бит шины адреса. Берем адрес из доступных FSMC – 0x60000000. Видим, что в этом значении 16 бит равен нулю, а значит, когда мы запишем значение по этому адресу, FSMC подаст дисплею сигнал на запись, также сообщит дисплею, что сейчас будет команда, ну и, конечно же, выдаст на шину сами данные. А если мы запишем значение по адресу 0х60010000 (16 бит — единица!) то FSMC все разрулит и передаст дисплею данные. Вот так все просто )

      Кстати, очень важный момент. В 16-битном режиме работы FSMC 16 бит шины адреса соответствует 17-му биту адреса (то есть 0х60020000). Ну естественно, все остальные адреса также смещены на 1 бит в этом режиме.»

  8. evorontsov:

    День добрый!
    С удовольствием смотрю Ваши уроки и пытаюсь разбираться в программировании STM32.
    Поскольку 8bit TFT под рукой нет, а есть ili9341 16bit попробовал подключить его. Проект делал с нуля в Cube MX с использованием FSMC. У меня на плате указано A18, что и забил в настройках проекта.

    Уперся в получение ID. Получаю 41414141 и не могу понять, в чем проблема. Плата STM32F407VET6-STM32-F4VE-V2.0 и TFT под нее. Все приходит один в один. 32pin разъем проверил. Но продвинуться не могу. Нет ли идеи, в чем может быть ошибка.

    • evorontsov:

      Разобрался! При A18 данные начинаются по адресу 0x60080000 (19 bit выставленный в единицу указывает на данные)

      • evorontsov:

        Опять затык…. При попытке залить дисплей цветом все заливается… Вот только при сканировании цвета от 0x0000 до 0xFFFF нет красного… ТОлько синий и зеленый в разных комбинациях. Нет ли идеи, где копать?

        • vaek:

          У меня цвета при заливке отображались также как и у вас. Проблему удалось решить параллельной
          передачей данных (16 bit) и подключением дисплея по 16 битной шине.

  9. Русланыч:

    У меня такая же плата. Для того, чтобы экран заработал с настройками из примера (с А16), я перемкнул на ножках платы выводы соответствующие сигналам А18 И А16 джампером. Но столкнулся с проблемой отображения цветов, — то же, что и у Вас. Не уверен, но думаю, что эти экраны не могут полноценно работать в режиме А16. У Вас же, хоть и выбран режим А18, код в примере написан для режима А16. Тоесть передача данных о цвете идет двумя байтами, а для режима А18 нужно передавать 3 байта, согласно даташита. Фиг его знает, может я и не прав, тогда поправьте меня.

  10. BlokNot:

    Интересно, есть какие люди, кто кто использует FSMC по прямому назначению?

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

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

*