Урок 37
Часть 1
Дисплей TFT 240×320 8bit
Сегодня мы к контроллеру STM32 попробуем подключить дисплей TFT разрешением 240×320. Модуль дисплея выполнен на контроллере ILI9341 и подключается посредством 8-разрядной шины и подключать мы его будем, используя технологию FSMC. Это технология, позволяющая работать с контроллером дисплея, как с обычной памятью, не заботясь также о том, какой управляющей ножкой и когда дрыгать.
По данному дисплею у меня есть также урок для контроллера AVR. Советую его также просмотреть. После этого вам станет намного понятнее работа с ним.
Проект создаём из проекта USB_HOST_MSC_FATFS. Назовем его ILI9341. Запустим проект в Cube, отключим вывод PD7 и PD14, иначе мы не включим FSMC.
Включим FSMC следующим образом
Теперь мы видим, к каким ножкам контроллера какие ножки дисплея подключать.
Также у контроллера есть лапка для перезагрузки (LCD_RST). Для управления данной лапкой дисплея включим лапку порта PD6 на выход.
В Configuration в FSMC включим следующие тайминги
Также включим RNG для нормального формирования случайного числа
Сгенерируем проект, откроем его, подключим 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 (вообще также советую посмотреть видеоурок, в нём вы всё это увидите гораздо лучше, ибо здесь в основном объяснение кода)
Как мы видим, у нас ещё подключен дисплей символьный через переходник по шине I2C для мониторинга считанного идентификатора.
Здесь мы также можем посмотреть дисплей с тыльной стороны, к каким ножкам у него подключены провода
Вообщем, практически первоначальные настройки для работы с дисплеем мы завершили. А функции уже мы будем писать, начиная со следующей части занятия.
Предыдущий урок Программирование МК STM32 Следующая часть
Техническая документация на контроллер дисплея
Отладочную плату и дисплей LCD 20×4 можно приобрести здесь:
Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.
Смотреть ВИДЕОУРОК (нажмите на картинку)
непотня как его подключить, шина данных ясно, а вотпин rs wr и rd не ясно, где можно найти эту информацию?
Подробнее рассказано в уроке по avr. Видеоверсия на моём канале есть, а вот текстово-сайтовая вскоре также будет опубликована.
А вообще rs — это переключение вида отправки информации (команда/данные)
wr — запись
rd — чтение
NOE -> RD
NWE -> WR
NE1 -> CS
A16 -> RS
Так обозначает STM в MS Cube.
у Вас на двух чипах HC245 написано? на самом дисплеи?
На матрице ничего не написано, просто стекло с кристаллами. Надписи только на модуле.
на самом дисплеи у меня надпись сзади LMS241GF31 , но выглядит как Ваш один в один
У Вас 100 пудов другой контроллер дисплея.
А получается так тип контроллера не определить? Я отклеил экран, есть надпись HB90615010 и S241GF31, последнее это вроде тип дисплея.
#define ADDR_CMD *(uint8_t*)0x60000000
#define ADDR_DATA *(uint8_t*)0x60010000
Почему именно А18 NE1, если например NE4 в первом банке и A20?
Первое должно быть 0х6С000000 а как вычислить второе?
Или А6
0х6С00007Е для A6 выходит но почему помогите разобраться
Цитатка, которая помогла разобраться:
«Пусть как уже решили подключен 16 бит шины адреса. Берем адрес из доступных FSMC – 0x60000000. Видим, что в этом значении 16 бит равен нулю, а значит, когда мы запишем значение по этому адресу, FSMC подаст дисплею сигнал на запись, также сообщит дисплею, что сейчас будет команда, ну и, конечно же, выдаст на шину сами данные. А если мы запишем значение по адресу 0х60010000 (16 бит — единица!) то FSMC все разрулит и передаст дисплею данные. Вот так все просто )
Кстати, очень важный момент. В 16-битном режиме работы FSMC 16 бит шины адреса соответствует 17-му биту адреса (то есть 0х60020000). Ну естественно, все остальные адреса также смещены на 1 бит в этом режиме.»
День добрый!
С удовольствием смотрю Ваши уроки и пытаюсь разбираться в программировании STM32.
Поскольку 8bit TFT под рукой нет, а есть ili9341 16bit попробовал подключить его. Проект делал с нуля в Cube MX с использованием FSMC. У меня на плате указано A18, что и забил в настройках проекта.
Уперся в получение ID. Получаю 41414141 и не могу понять, в чем проблема. Плата STM32F407VET6-STM32-F4VE-V2.0 и TFT под нее. Все приходит один в один. 32pin разъем проверил. Но продвинуться не могу. Нет ли идеи, в чем может быть ошибка.
Разобрался! При A18 данные начинаются по адресу 0x60080000 (19 bit выставленный в единицу указывает на данные)
Опять затык…. При попытке залить дисплей цветом все заливается… Вот только при сканировании цвета от 0x0000 до 0xFFFF нет красного… ТОлько синий и зеленый в разных комбинациях. Нет ли идеи, где копать?
У меня цвета при заливке отображались также как и у вас. Проблему удалось решить параллельной
передачей данных (16 bit) и подключением дисплея по 16 битной шине.
У меня такая же плата. Для того, чтобы экран заработал с настройками из примера (с А16), я перемкнул на ножках платы выводы соответствующие сигналам А18 И А16 джампером. Но столкнулся с проблемой отображения цветов, — то же, что и у Вас. Не уверен, но думаю, что эти экраны не могут полноценно работать в режиме А16. У Вас же, хоть и выбран режим А18, код в примере написан для режима А16. Тоесть передача данных о цвете идет двумя байтами, а для режима А18 нужно передавать 3 байта, согласно даташита. Фиг его знает, может я и не прав, тогда поправьте меня.
Интересно, есть какие люди, кто кто использует FSMC по прямому назначению?