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.8K подписчиков

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

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

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

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

• Выкладывать код прямо в посте - используйте для этого сервисы 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 настройки можешь взять в моем коде, как и настройки всех пинов  и т.д. Если возникнут вопросы, пиши, буду отвечать)

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