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
DELETED
Автор поста оценил этот комментарий
а можно примеры контроллеров? точнее сказать, тех контроллеров, которых нет на есп32.
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Ну например SDRAM и LTDC у Вас врядли получится реализовать на esp32, также если вам нужно больше 3 UART или 2 SPI, то проще взять другой контроллер, да и по количеству выходов/входов или аналогов могут быть проблемы. Я не против ESP32, это хороший контроллер и не дорогой и с wifi/ble, но в данный момент у меня проект, где wifi не нужен, но есть очень много периферии и скорость должна быть хорошая, поэтому я выбрал stm32.

А есть проект, где отлично подходит esp32, но нужно 10 UART, тут я сделал связку esp32 и FPGA, который преобразует 10 уартов в один, чтоб не лепить с кучи контроллеров

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

нет понятия круче, есть понятие целесообразности и возможностей. В некоторых проектах я вообще attiny ставлю, так как нет смысла ставить что-то другое. У стм32 очень большой ряд контроллеров с разными возможностями

показать ответы
0
Автор поста оценил этот комментарий
Извиняюсь заранее за нескромные вопросы. Вы в сфере программирования МК-ров работаете или чисто хобби? Есть ли необходимость в программистах МК-ров сейчас, какой уровень зарплат?(я могу, конечно, сам открыть хедхантер и почекать, но информация от других людей тоже не помешает) Сам баловался с стмками и ардуинками развлечения ради, как о профессии не думал, но вот что-то пришло в голову сейчас, что можно доучиться и работать программистом. В чём смысл arduino ide для stm32?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Было хобби, стало работой, теперь свой компания. Смысл arduino ide для stm32 такой же, как и mbed, keil, iar, eclipse, блокнот и все остальное. Для меня просто привычней и при правильном использовании ничем не уступает другим ide, по крайней мере я пока не нашел недостатков.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

показать ответы
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, вот в такой тупичок пока зашёл.

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

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

показать ответы

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества