Arduino Due и STM32
- Войдите на сайт для отправки комментариев
Вс, 20/03/2022 - 11:20
Добрый день!
Есть устройство в котором используется Arduino Due.
Требуется в этом устройстве иметь возможность кроме Arduino Due использовать плату семейства STM32
Например
STMicro STM32F411CEU6 Arm Cortex-M4F (Black pill) MCU с тактовой частотой 100 МГц и флэш-памятью 512 Кб, SRAM 128 Кб
вместо Arduino Due частота процессора (CPU) 84 МГц. 96 КБ ОЗУ 512 КБ флеш-памяти для хранения программ.
В ардуино задействованы 8 входов ADC , один цифровой вход
К Ардуино подключен экран типа CTE32HR или аналогичный, матричная клавиатура , карман для SD карты.
Конструктивно Arduino Due и экран устанавливаются на кроссплате - ардуино с одной стороны, экран с другой
Предполагается доработка кроссплаты, чтобы на ней можно было устанавливать или плату Due или плату STM32.
Возможно на STM32 не хватит выводов, поэтому придется использовать доп. мсх для подключения клавиатуры и\или экрана.
Это общая идея, детали будут уточняться с разработчиком.
могу помочь, от 10тр. fridgetester@mail.ru
вышлите подробное ТЗ на dd собака jwee.ru
Да еще такой момент. Желательно, чтобы исполнитель был в Питере.
Да еще такой момент. Желательно, чтобы исполнитель был в Питере.
я в москве, но за соответствующие подьемные можем обсудить переезд :)
Какие параметры требуется задать в ТЗ?
Все параметры
Не все, а все требуемые исполнителю для начала работы.
Для начала, нужно русским языком написать, что это такое.
Не все, а все требуемые исполнителю для начала работы.
А все требуемые для исполнителя для ВСЁЙ работы. Как можно оценить работу, не зная что делать?
"Требуется в устройстве иметь возможность кроме Arduino Due использовать плату семейства STM32 "
То есть требуется доработать кроссплату , чтобы в нее можно было установить или Arduino Due или STM32.
Речь пока идет о схеме электрической, прошивки не касаемся.
"В ардуино задействованы 8 входов ADC , один цифровой вход"
Соответственно и в плате STM будут задействованы 8 входов ADC , один цифровой вход.
К Ардуино подключен экран типа CTE32HR или аналогичный, матричная клавиатура , карман для SD карты."
Значит и к STM должны иметь возможность подключаться дисплей, клавиатура и SD карта.
Вот с дисплеем вопрос. Как его подключить к STM. То же с клавиатурой и картой.
Надо проработать электрическую схему.
На первом этапе это вся работа, требуется оцениться с ней.
del
Надо проработать электрическую схему.
На первом этапе это вся работа, требуется оцениться с ней.
"прорабатывать электрическую схему" без хотя бы тестовой прошивки - это, простите, бред. Хотя надо сказать, что этот бред вполне типичный даже для опытных радиолюбителей - сначала разведем плату, а потом начинаем изгалятся в коде, как повесить апаратное прерывание на пин. где прерывания нет... или как запустить в коде софтовый СПи на обычных пинах, хотя на плате есть хардварный... но на других пинах.
Не повторяйте чужих ошибок. Сначала делается прототип, на нем отлаживается код - и только потом можно будет готовить схему и разводить плату, а не наоборот.
diakin, ваша работа должна строится в другом порядке.
1. В первую очередь - Портировать прошивку системы с Дуе на STMF411 - для чего нужно предоставить исполнителю все исходники текущего проекта и полностью описать работу программы с входными и выходными данными.
2. Разработать схему переходной платы для Дуе и СТМ
3. Развести схему на печатную плату.
Естественно плата разводится в последнюю очередь, когда все отлажено.
"Нужно на кроссплате развести разъем для установки STM, чтобы можно было воткнуть или Arduino или STM." - это конечная цель.
Прошивка с Due на STM портирована, есть проект для Arduino IDE под STM, правда только измерение сигналов на аналоговых входах
и передача их в ПК через USB.
Для меня непонятно подключение дисплея к STM. Подключение SD карты и подача сигналов на аналоговые входы сложности наверное не представляют. И хватит ли пинов для подключения клавиатуры, тоже вопрос. Не придется ли городить что-то такое
http://arduino.ru/forum/programmirovanie/podklyuchenie-matrichnoi-klavia...
diakin, вы сами себе противоречите. То пишете что разводка платы - конечная цель, то что "пока нужна только схема".
Если прошивка портирована только на треть - без дисплея и клавиатуры - значит реально никакого портирования нет. Без портирования кода схему разрабатывать рано. Поэтому возвращаемся к моему списку из сообщения #14
1 сначала прошивка
2. потом схема
3 и в конце - плата
Переформулирую задачу.
Требуется к плате STMicro STM32F411CEU6 Arm Cortex-M4F (Black pill) подключить дисплей CTE32HR или аналогичный (ILI9341 например), матричную клавиатуру 4х5 и SD карту.
Написать тестовую прошивку - для проверки работоспособности.
Например - набираешь на клавиатуре число, оно отображается на экране. Нажимаешь кнопку * - это число записывается на карту. Нажимаешь кнопку # - число из памяти отображается на экране.
Пины ADC и один цифровой пин, на который можно повесить прерывание - не занимать.
В таком виде норм?
Дисплей
Клавиатура

Коннектор SD card

Да, в таком виде норм, но дисплей можно включать только spi, на параллельное включение пинов уже не хватит. Соответственно скорость прорисовки картинки будет существенно ниже, чем на дуе.
И крайне желательно работать с конкретной моделью экрана - точно с той, которая будет у заказчика, потому как совместимость у похожих дисплеев с али зачастую отсутствует.
Да, скорость будет ниже. Но картинки на весь экран там не выводить, только надписи, линии и т.п.
Хотя будет очистка экрана и отдельных областей.
Конкретную модель экрана указать не получится ( ,потому что сегодня смогли купить такие, а завтра другие. Главное чтобы они по конструктиву подходили. Если не будет совместимости будем допиливать под конкретную модель.. за отдельные деньги.
Пример подключения
https://istarik.ru/blog/stm32/149.html
Пример подключения
https://istarik.ru/blog/stm32/149.html
этот пример рождает следующий вопрос - вам под какой тулчейн СТМ32 нужен код? - даже для ардуино их два - родной от СТМ и тулчейн Роджера Кларка. А еще можно писать вообще вне экосистемы ардуино - тогда выбор еще больше.
Тот который Arduino_STM32, то есть использовать Arduino IDE.
Arduino_STM32
Ок. я пас
Если экран 320x240 на ILI9341, то и на SPI вполне достижимо ~36 FPS при тактовой CPU=180МГц. При обновлении всего экрана каждый кадр. И не надо кучу проводков тащить.
Для многих задач этого более чем достаточно.
Можно даже видео крутить, если где-то распакованный видеопоток брать. ;)
PS: Кроме разрешения также не указаны требования по минимальному количеству цветов планируемого GUI. Сколько максимально одновременных цветов требуется в картинке на экране? От этого считаются требования по размеру видеопамяти.
~36 FPS при тактовой CPU=180МГц
blackpill F411 CPU = 96 MHz
2ТС: Аналогично - клавиатура. Как по картинке прикажете угадывать её интерфейс подключения?
клавиатура. Как по картинке прикажете угадывать её интерфейс подключения?
Черезчур усложняете... Думаю, обычная матрица.
4х5 - 4 ряда и 5 колонок, всего 9 пин. Если присмотреться, на картинке в соединителе как раз 9 пин и есть.
Дисплей 3.2" 480x320
Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.
По клавиатуре - да, матричная 9 pin. Там с одновременным нажатием кнопок бывает какая-то бодяга, надо диоды ставить?
Кстати с клавиатурой не получится такой финт провернуть? Клавиатура подключается к 9 пинам - 4 столбца и 5 строк. На каждый пин из 9-ти повесить прерывание по фронту например. В момент нажатия фронт приходит на пин строки и пин столбца. В обработчике запоминается номер пина, на который прерывание пришло.
Но если фронт приходит на два пина одновременно, обработается два прерывания или одно?
Если два, то сразу получаем номер строки и номер столбца.
Или отмапить эти пины на регистр и по прерыванию читать состояние этого регистра.
Дисплей 3.2" 480x320
Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.
Скорости можно достичь думаю: 320*480*2/(100e6/4/8) = ~0.1 сек - полное обновление экрана.
Но дело тут не в скорости. Сколько нужно цветов??? Так и не сказали. Секрет?
Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. Даже немного больше. А у вас всего 128 КБ внутренней ОЗУ. Или ставить внешнюю ОЗУ или придётся сильно экономить по ОЗУ в остальных задачах.
А клавиатуру можно как угодно подключить. Это не проблема. Возможно её можно даже частично по пинам совместить с другой периферией. Для экономии.
76800 при 16-цветном режиме - это если иметь ОЗУ только на одну страницу. Тогда сперва - всё рисуем, потом - выводим. Но тогда общее время обновления будет ещё больше >0.1c.
Если работать в 2-страничном режиме (рисуем одну страницу, выводим - предыдущую), то можно достичь времени обновления всего экрана почти ~0.1 сек. Но ОЗУ нужно 76800*2.
судя по тому, что экраны 240х320 работают и на меге с ее жалкими 8к ОЗУ - видимо программный экранный буфер не обязателен
Дисплей 3.2" 480x320
Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.
Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. Даже немного больше. А у вас всего 128 КБ внутренней ОЗУ. Или ставить внешнюю ОЗУ или придётся сильно экономить по ОЗУ в остальных задачах.
1) Подключение по параллельной шине. При таком подключении ILI9341 позволяет чтение своего видео-ОЗУ. При последовательном подключении - не позволяет. По-крайней мере мой экземпляр ILI9341 - точно.
Но даже при наличии чтения, оно само существенно замедлит работу экрана.
2) Все стирать, а потом формировать изображение во внутреннем ОЗУ ILI9341 записью отдельных прямоугольных областей. Это во-первых - снижение общей скорости обновления экрана (два обращения: стирание, потом новая запись); во-вторых - ограничение возможностей GUI и его усложнение: никаких наложений картинок и пр. - так как не доступно чтение видео-ОЗУ.
Чем таким мазохизмом заниматься, так лучше дополнительное внешнее ОЗУ поставить.
>Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер.
Ну а как оно в Due работает?
Для вывода на экран используются
myGLCD.drawLine, myGLCD.print итд
По расходу ОЗУ там что-то такое создается массив на 128 кб и туда пишутся данные с АЦП.
1
#include <UTFT.h>
2
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
// инициализация TFT (старого)
3
int
TFTW = 480, TFTH = 320;
// разрешение экранчика (старого)
4
uint16_t *SummP;
//Указатель на массив
5
int
NPnt = 8192;
6
...
7
SummP =
new
uint16_t[NPnt * 8]; ..это 2 байта *64 - итого 128 kb.. Хм 96 КБ ОЗУ в Due
Алгоритм в студию, плиз! ;)
PS: А например у меня в GUI кое-где есть вращающиеся 5-конечные звёзды. Почти на весь экран. Или стрелочные часы с разноцветными треугольными стрелками, накладывающимися одна на другую. Также - на весь экран.
Расскажите как такое нарисовать имея буфер всего "в несколько сотен байт". И чтобы юзер не умер, ожидая завершения рисования одного примитива. ;)))
Вам это ни о чём не говорит?
ну да, отсутсвие параллельной шины тут сильно все портит... тут согласен с rst
Вместо Дуе тут подошла бы плата с STM32F407VE, но она стоит примерно тех же денег, как дуе
Вам это ни о чём не говорит?
Речь идет об ОЗУ, которое полностью занято под буфер данных.
если требуется буфер 128к только под данные, с F411 ловить нечего
UPD - или ставить внешние SPI EEPROM типа w25q - на F411 даже место на плате под них выделено
Картинка примерно такая.
..cut
Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. Даже немного больше. А у вас всего 128 КБ внутренней ОЗУ. Или ставить внешнюю ОЗУ или придётся сильно экономить по ОЗУ в остальных задачах.
Ну там есть видеопамять.
ILI9341 has an integrated 240x320x18-bit graphic type static RAM. This 172,800-byte memory allows storing a
240xRGBx320 image with an 18-bit resolution (262K-color).
Вообще, не разбирался, как дисплей работает. Надо бы почитать. Но потому и хочу эту работу отдать на сторону, что сам не разбираюсь.
Ну собственно ОЗУ контроллера не используется (не расходуется) для вывода на экран.
Memory Write (код – 0x2C) – запись в ОЗУ, а по сути – вывод изображения на экран. Если контроллер выведен из состояния сна и дисплей подключен к ОЗУ, т.е. исполнены две предыдущие команды, то отправив последовательность
ili9341_write_command(0x2C); ili9341_write_data(color);
вы получите точку на дисплее.
Ну и
>Расскажите нам пожалуйста, как вывести линию (прямую) диагональную из верхнего левого угла в нижний правый имея буфер всего в > "несколько сотен байт"?
Повторяются команды, как выше и видеопамять пишутся данные. Никакого буфера в ОЗУ контроллера в этом случае не требуется.
Это не готовая картинка, которая где-то должна храниться.
зы. Вот тут информация по работе дисплея https://datagor.ru/microcontrollers/microcontrollers-code-library/2924-vizualizaciya-dlya-mikrokontrollera-chast-3-tft-displey-28-240h320-na-ili9341.html#hmenu-1
Расскажите нам пожалуйста, как вывести линию (прямую) диагональную из верхнего левого угла в нижний правый имея буфер всего в "несколько сотен байт"?
Алгоритм в студию, плиз! ;)
1.подключить и правильно настроить библиотеку STemWin . судя по странице 8 из документа поттдеживаемых драйверов , это возможно :

а судя по документу requirements библиотеки со страницы 73 , сотен байт должно хватить :

2. вызвать библиотечную функцию( стр. 347)
1
void
GUI_DrawLine(
int
x0,
int
y0,
int
x1,
int
y1);
Да так чтобы рисование не заняло несколько секунд из-за необходимости рисовать маленькими кусочками, по кусочкам читая внутреннюю видео-ОЗУ ILI9341. А если подключение по SPI - так чтение и вообще невозможно.
и судя по стр. 36 и стр. 63, докуманта на ILI9341 , читать по серийному интерфейсу , всеже можно

Картинка примерно такая.
Такую только по параллельной шине. Если рисовать сразу в видео-память ILI9341, без видео-буфера в памяти МК.
А если же по SPI: то большой буфер в ОЗУ МК, в нём нарисовать, а потом готовую - выплюнуть в SPI. И на такую картинку (с множеством цветов) надо не 76800 байт, а намного больше. Возьмите калькулятор да посчитайте. Нужна внешняя SDRAM на такую картинку.
Только так.
Привет всем!
Что то все усложнили задачу.
Замечание первое - подключать на разъемы модули DUE или STM32 типа Black pill не очень хорошее решение. Слишком много контактов - искать который не контачит очень стремно. Я прошел через это - клиенты замучают почему не работает или почему прибор периодически отключается. Надежнее и проще разработать две печатные платы с установкой микроконтроллеров SAM3X8E (DUE) или STM32XXX. Все равно на плате нужно будет устанавливать различные компоненты. Стоимость изготовления плат в Китае не очень большая. При этом изделие будет монолитное, что увеличит надежность работы.
Замечание второе - дисплей нормально будет работать с обеими микроконтроллерами. Про размеры ОЗУ можно забыть - что микроконтроллер отправит на дисплей то и отобразится. Конечно если не нужно будет "крутить кино". Библиотека STemWin, конечно классная, но в среде Ардуино работать не будет. В крайнем случае несколько лет назад я пытался ее адаптировать в среду Ардуино но не получилось. Дисплей с микроконтроллером STM32 можно подключить на шину FSMC - быстродействие отличное. У SAM3X8E подключение по SPI не очень удачное решение. Можно попробовать подключить на параллельную шину.
Что бы не быть голословным - я разработал контроллеры теплицы на микроконтроллерах SAM3X8E и STM32F407. Адаптация программ состояла в индивидуальной инициализации дисплеев для каждого микроконтроллера. Основное тело программы больших изменений не требовало. Для работы STM32 в среде Ардуино лучше применить STM32GENERIC https://github.com/danieleff/STM32GENERIC
С клавиатурой вообще проблем не должно быть - задача простая.
Мои варианты плат контроллера теплицы.
Во-вторых: даже если чтение работает, это ничего вам не даст.
Калькулятор в руки и считать сколько займёт ваше рисование по SPI. Особенно - таким образом.
PS: Все расчёты я привёл выше.
А так да - если бы у бабушки был *ер, то она была бы дедушкой. ;)