25

STM32F429I Discovery + SDRAM + LTDC под Arduino IDE

Сижу на карантине и придумываю себе сложности. Дома валяется STM32F429I Discovery, вот и решил проверить возможности Arduino IDE для программирования STM32 и данной платки в частности.


Для начала нужно поставить STM32 Cores под Arduino IDE. Детально этот процесс расписан тут https://github.com/stm32duino/wiki/wiki/Getting-Started так что не буду повторяться, тут ничего сложного.


Мне немного не повезло, так как именно этой платки нет в этой сборке, но это не проблема. Можно добавить практически любую стандартную отладочную STM32 вручную, так как драйвера есть в комплекте под большое количество чипов. Вот тут лежит инструкция по добавлению новой платы https://github.com/stm32duino/wiki/wiki/Add-a-new-variant-(board) Но я напишу вкратце со своими конфигами:


1) добавить плату в файл boards.txt (у меня он находится тут ...\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.8.0\boards.txt) - тут нужные строки  - https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

2) добавить настройки пинов для платы - в папку ...\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.8.0\variants добавить папку https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/tr...


Теперь в меню выбора плат в Arduino IDE в разделе Discovery появится наша платка.


После добавления платы я проверил все стандартные возможности:

цифровые входы/выходы, аналог, шим, уарт, SPI, I2C, прерывания, freertos и т.д.

В большинстве случаев все отлично работает, но некоторые вещи с дополнительными костылями под stm32


Также отлично завелся гироскоп, который есть на плате через библиотеку Adafruit_L3GD20 (только старую, в которой есть SPI, а не I2C)


После этого всего я дошел до экрана и тут началось веселье. Контроллер экрана здесь стоит ILI9341, поэтому для начала я попробовал завести его через SPI и библиотеку Adafruit_ILI9341. С небольшими допилами это получилось - нужно было добавить вручную инициализацию пинов под SPI:


__GPIOC_CLK_ENABLE();

__GPIOD_CLK_ENABLE();

__GPIOF_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_13;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF5_SPI5;

HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);


Но скорость отрисовки через SPI не порадовала, а с учетом того, что особенностью данной платы есть возможность работы экрана через SDRAM , то начал ковырять все это дело. С драйверами под это все в stm32 cores проблемы, поэтому пришлось делать на регистрах.


Сначала прикрутил SDRAM  https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

командами SDRAM_Read8 и SDRAM_Write8 можно записывать/считывать значение в памяти по адресу.


После этого прикрутил LTDC - для работы экрана через память - https://github.com/levkovigor/stm32f429i-disk1_sdram_ltdc/bl...

команда PutPixel меняет цвет пикселя по координатам x, y


Осталось только перевести экран в соответствующий режим работы, для этого нужно задать набор команда по SPI конроллеру ILI9341 - для этого я использовал все ту же библиотеку Adafruit_ILI9341, в которую дописал функцию begin_ltdc() - доработанные файлы библиотеки также лежат в репозитории.


Ну и видео на котором можно оценить разницу в скорости работы двумя методами: заливка экрана черным > синим > красным с задержкой в одну секунду через SPI и LTDC.

Кстати тачскрин тоже работает, для этого нужна библиотека Adafruit_STMPE610, тут только пини для I2C надо правильные задать.


По идее через LTDC можно подключить любой другой подходящий TFT любого разрешения, только настройки нужно будет выставить соответствующие. По возможности обязательно попробую и проверю по скорости.

Arduino & Pi

1.5K постов20.9K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий

Друг, приветствую! Помоги, пожалуйста. Пытаюсь завести дисплей на такой же плате. Интересно разобраться именно с архитектурой, поэтому пишу на чистом CMSIS. Начал с адаптации этого мануала https://m.habr.com/ru/post/412753/.  Настроил регистры для RCC, GPIO, LTDC. Дисплей не запустился. На сайте st нашел архив с примерами для платы stm32f4discovery, начал дебажить. Там кроме тактирования и ltdc ещё инициализируется spi, и гонятся какие-то хитрые команды в дисплей. Собственно вопросы:

1. Можно ли завести этот дисплей только на ltdc по алгоритму из референс мануала? Или обязательно настройка по spi?

2. Если spi обязательно, как у чувака с хабра запустилась без него?

3. Если spi обязательно, где команды брать? Даташит на конкретный дисплей не нашел, можно смотреть в даташит на контроллер ili9341?

4. Кроме 4 управляющих линий ltdc и шин rgb нужно ли ещё управлять ногой CSX дисплея, и как это правильно делать? В даташите на ILI9341 сказано, что активный low, и можно его всю дорогу так держать.

5. Во время дебага примера обнаружил чудесную вещь: все регистры альтернативных функций AFR записаны значениями 0xe, в то время как в даташите на контроллер некоторые должны быть 0x9. При этом пример работает. Как такое объясняется?


Буду очень признателен за помощь, недавно только начал изучать архитектуру stm32, вот в такой тупичок пока зашёл.

раскрыть ветку (11)
0
Автор поста оценил этот комментарий

SPI нужен, если именно на данной плате с этим дисплеем, так как нужно задать команды для ili9341 для работы через ltdc. Если приколхозить другой дисплей через VSYNC HSYNC и т.д. без контроллера, то тогда spi не нужен. Все SPI настройки можешь взять в моем коде, как и настройки всех пинов  и т.д. Если возникнут вопросы, пиши, буду отвечать)

раскрыть ветку (10)
0
Автор поста оценил этот комментарий

Т.е. получается, что по умолчанию дисплей настроен на прием команд по SPI и управляется внутренним контроллером ili9341. Мы посылаем набор команд, чтобы дисплей мог управляться внешним по отношению к нему ltdc, который внутри stm32.  Правильно? У тебя набор и последовательность этих команд хранятся в массиве static const uint8_t PROGMEM initcmdLTDC[]. Откуда взяты эти команды, чтобы можно было почитать описание? Как-то этот массив выглядит страшно и длинно.

раскрыть ветку (7)
0
Автор поста оценил этот комментарий

ну вобще надо даташит смотреть на ili9341, но я просто взял их из примера в mbed библиотеке и переделал под Adafruit библиотеку. Вот нашел на гите этот файл https://github.com/SimulationEverywhere/RT-Cadmium-DISCO-Dem...

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

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

Тут другая интересная штука нарисовалась, я аж программку для записи с экрана установил. Глобальная переменная в программе переписывается при изменении массива. Причем, если переменная изначально равна 0, то все адекватно, а при любом другом значении модификация массива изменяет переменную, как будто на одну ячейку памяти ссылаются.

Если интересно, глянь видео отладчика. Переменная sec, массив img[].

https://cloud.mail.ru/public/51fX/5CvpSdYe1

Из-за чего такое может быть и как с этим бороться? Пробовал всякие volatile, static, все также.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

может баг дебаггера. Без volatile и static то же самое?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Да то же самое, это я уже потом добавил. В реалтайме это тоже проявляется, не только в дебаггере.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

а если переменную назвать не sec?

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Я понял, че это было! Чудо не произошло, как я и предполагал, косяк моего кода. Причем типичный и поучительный )

0
Автор поста оценил этот комментарий

Не важно как называть. Выяснилось, что такая дичь происходит с переменной, которая объявлена первой. Я в ту папку еще одно видео кинул. Попробую sdram завести.

0
Автор поста оценил этот комментарий

А, все нашел, я затупок )

0
Автор поста оценил этот комментарий

Слушай, не могу понять, где брать твой код. Инициализацию SDRAM вижу, LTDC настройки вижу, SPI не вижу. Ткни носом, плз.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества