Урок 64
HAL. LTDC
Часть 1
Сегодня мы попробуем поработать непосредственно с интерфейсом LTDC. Это, как мы уже знаем из нашего занятия по LCD, который мы программировали в уроке 58, параллельный интерфейс для управления жидкокристаллическим дисплеем. В сегодняшнем занятии мы также будем работать с тем же дисплеем, который находится на плате STM32F746G-DISCO. Только с интерфейсом LTDC, посредством которого подключен дисплей, мы уже будем работать не с помощью библиотеки BSP, а будем уже писать свою библиотеку со своими функциями, исключительно пользуясь только функциями библиотеки HAL.
Дисплей на данной плате у нас установлен RK043FN48H-CT672B. Даташит именно на такой дисплей я не нашел, по ссылкам попадал на многие аналоги, и поэтому за основу был взят дисплей AM-480272H3TMQW-T01H,
Вообщем, наша задача на сегодняшний день — отвязать управление данным дисплеем от библиотеки BSP, так как она нас приковывает к определённой отладочной плате и не даёт нам простора в программировании впоследствии других дисплеев с другими контроллерами. Ну и, конечно, тем самым мы уже плотно познакомимся с интерфейсом LTDC и не будем его бояться в дальнейшем.
Посмотрим подключение дисплея в схеме нашей отладочной платы (нажмите на картинку для увеличения изображения)
В глаза бросается сразу то, что очень здесь много информационных ножек. Но это не так. Их ровно сколько нужно. Так как интерфейс у нас параллельный, и работает он по протоколу RGB888, то как раз по 8 ножек на каждый цвет, то есть у нас идёт три байта на пиксель. Также мы видим здесь две ножки для управления тачскрином с помощью I2C, пока мы тачскрин в рамках данного занятия не рассматриваем.
Дальше идём слева сверху вниз.
SLK — ножка подачи тактовых импульсов.
LCD_HSYNC — ножка синхронизации по горизонтали.
LCD_VSYNC — ножка синхронизации по вертикали.
LCD_DE (Data Enable) — ножка включения передачи данных. Включаем, только когда непосредственно нужно передавать данные.
LCD_DISP — ножка режима. Если 1 — то режим нормальный, если 0 — то дежурный режим.
LCD_BL_A — ножка анода подсветки.
LCD_BL_K — ножка катода подсведки.
LCD_INT — ножка для управления по прерываниям.
LCD_RST — ножка для перезагрузки.
Ну и снизу ножка питания и несколько ножек для общего провода.
Управление подсветкой происходит с помощью специализированного драйвера подсветки собственного производства компании ST Microelectronics STLD40D.
Ну и вроде бы и всё со схемой.
Также скажу то, что нам не придется вообще как-то самим управлять с помощью нашего кода непосредственно данными ножками. Данную функцию возьмёт на себя библиотека HAL.
Пора теперь заняться проектом. Создадим пустой проект, выбрав наш контроллер STM32F746NGx.
Как всегда, сначала включим тактирование кварцевым резонатором
Также включим RNG — генератор случайных чисел
Включим интерфейс для ST-Link — SWD
Ну и, собственно, LTDC
Теперь перейдём в Clock Configuration и настроим там делители и умножители. Сначалам можно согласиться с автонастройкой
Теперь нам необходимо проверить, правильные ли ножки у нас включились у интерфейса LTDC. Как правило, оно не всегда так.
Для этого обратимся к таблице в технической документации на отладочную плату и увидим что ножки наши значительно различаются. Поэтому составим вот такую вот таблицу специально для нашего интерфейса, выделив красным цветом те ножки, которые прийдётся ремапить (переназначать)
Pin No |
Pin Name |
Signal or Label |
A1 |
PE4 |
LTDC_B0 |
B9 |
PJ13 |
LTDC_B1 |
C4 |
PK7 |
LTDC_DE |
C5 |
PK6 |
LTDC_B7 |
C6 |
PK5 |
LTDC_B6 |
C7 |
PG12 |
LTDC_B4 |
C9 |
PJ14 |
LTDC_B2 |
D5 |
PI10 |
LTDC_HSYNC |
D7 |
PK4 |
LTDC_B5 |
D10 |
PJ15 |
LTDC_B3 |
E4 |
PI9 |
LTDC_VSYNC |
F12 |
PK1 |
LTDC_G6 |
F13 |
PK2 |
LTDC_G7 |
G4 |
PI15 |
LTDC_R0 |
G12 |
PJ11 |
LTDC_G4 |
G13 |
PK0 |
LTDC_G5 |
H3 |
PI14 |
LTDC_CLK |
H12 |
PJ8 |
LTDC_G1 |
H13 |
PJ10 |
LTDC_G3 |
J12 |
PJ7 |
LTDC_G0 |
J13 |
PJ9 |
LTDC_G2 |
K12 |
PJ6 |
LTDC_R7 |
M9 |
PJ4 |
LTDC_R5 |
M14 |
PJ5 |
LTDC_R6 |
N8 |
PJ3 |
LTDC_R4 |
P7 |
PJ2 |
LTDC_R3 |
R6 |
PJ0 |
LTDC_R1 |
R7 |
PJ1 |
LTDC_R2 |
По сравнению с FMC, в которой ремапить пришлось всего одну ножку, здесь наоборот ремапятся почти все, а остаются без переноса всего 6 ножек. Ну ничего, нам к труднстям не привыкать. Поэтому следует переключить в Pinout все ножки, которые в таблице обозначены красным цветом.
Также включим ножку PI1, отвечающую за зелёный светодиод, на выход
Кроме непосредственно ножек LTDC есть ещё 2 служебные:
D8 PK3 LCD_BL_CTRL
E3 PI12 LCD_DISP
Назначение данных ножек мы уже знаем. Поэтому включим их на выход и настроим в Configuration скорость в High, а также установим на них высокий уровень при старте
Также установим высокую скорость для всех остальных ножек LTDC. Для этого здесь же зайдём на вкладку LTDC, встанем на любую строку и нажмём комбинацию Ctrl+A, чтобы всё выделилиось и после этого Maximum output speed выставим в High
Теперь перейдём в Configuration и настроим там Cortex_M7 следующим образом (нажмите на картинку для увеличения изображения)
Если не настроить регионы, то кэш работать не будет. Проверено.
Теперь непосредственно настройка LTDC. Здесь я всё настроил, подглядев в настройки в пример, а также поглядывая в datashit на тот дисплей, который я нашел, найти вы данный даташит сможете без проблем. Показать не могу, так как во все страницы стоит заставка «Не для копирования»
Также перейдём в закладку слоёв, включим там 1 слой и настроим его
Как вы видите, мы выбрали режим 16 бит на пиксель, так как у нас будет ограничено количество памяти. LTDC не предусматривает контроллер с памятью, поэтому память мы видеопамять мы должны предоставить сами. Для этого и впаяна микросхема SDRAM на нашей платы. Но мы сегодня попробуем обойтись без неё ибо всему своё время. Мы попробуем для дисплея использовать участок оперативной памяти. Конечно, это не есть хорошо, но для учебных целей очень даже поучительно. Соответственно графический ускоритель мы также не используем. Его время тоже ещё не настало.
Ну вот вроде и всё, засиделись мы что-то в Cube-MX, руки уже чешутся писать код.
Поэтому зайдём в настройки проекта и настроим всё вот так, назвав проект LTDC001 и также добавив кучу и стек
Сгенерируем проект, откроем его в Keil, а остальную работу над проектом мы продолжим в следующей части нашего урока.
Предыдущий урок Программирование МК STM32 Следующая часть
Отладочную плату можно приобрести здесь 32F746G-DISCOVERY
Смотреть ВИДЕОУРОК
По дисплею навскидку: https://github.com/cnoviello/stm32-discof7/blob/master/stm32-discof7-lcdtest/system/include/Components/rk043fn48h/rk043fn48h.h
Днями направлю DS на этот специально адаптированный для ST дисплей.
Там BSP, так что не по теме.
Это лишь один файл с таймингами, речь шла только о них. Впрочем, раз не по теме, то не по теме…
А, понятно, гляну всё равно. Хотя тайминги есть и в примерах репозитория Cube MX
Здравствуйте, не пробовали ли Вы, подключить к плате STM32F746G-DISCO — EmWin ? Никак не получается, да и примера подходящего не нашел. Вообще плата прекрасная и EmWIn это как раз для нее. А если еще и с BSP — вообще будет супер.
Кстати, здесь http://www.digikey.com/products/en?keywords=STM32F746G-DISCO она за 50,00 $.
К этому и движемся, только сначала необходимо будет отвязаться от BSP и написать свою библиотеку
Если я правильно Вас понял, Вы хотите сделать универсальную библиотеку, с помощью которой можно будет работать с EmWin с любой платформой, так как BSP привязанна к конкретной плате. Если это так, мне кажется, что это трудно осуществимая задача, так как сам Egger делает различия для разных платформ. Возможно я Вас просто неправильно понял, но желание отвязаться от BSP ничем другим не могу объяснить. Я останусь при своем мнении — есть конкретная плата, есть библиотека для нее и надо выполнить локальную задачу — привязаться к EmWin. Если долго мучиться…