Arduino Due и STM32

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016
Добрый день!

Есть устройство в котором используется 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 не хватит выводов, поэтому придется использовать доп. мсх для подключения клавиатуры и\или экрана.

Это общая идея, детали будут уточняться с разработчиком.
fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

могу помочь, от 10тр. fridgetester@mail.ru

b707
Offline
Зарегистрирован: 26.05.2017

вышлите подробное ТЗ на dd собака jwee.ru

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Да еще такой момент. Желательно, чтобы исполнитель был в Питере.

b707
Offline
Зарегистрирован: 26.05.2017

diakin пишет:

Да еще такой момент. Желательно, чтобы исполнитель был в Питере.


я в москве, но за соответствующие подьемные можем обсудить переезд :)

rst
Offline
Зарегистрирован: 25.06.2018

b707 пишет:
я в москве, но за соответствующие подьемные можем обсудить переезд :)
Боюсь "подъёмных" хватит только на переход пешком. С котомкой за плечами.  ;)))

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Какие параметры требуется задать в ТЗ?
 

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Все параметры

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Не все, а все требуемые исполнителю для начала работы.

rkit
Offline
Зарегистрирован: 23.11.2016

Для  начала, нужно русским языком написать, что это такое.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

diakin пишет:

Не все, а все требуемые исполнителю для начала работы.

А все требуемые для исполнителя для ВСЁЙ работы. Как можно оценить работу, не зная что делать? 

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

"Требуется в  устройстве иметь возможность кроме Arduino Due использовать плату семейства STM32 "
То есть требуется доработать кроссплату , чтобы в нее можно было установить или Arduino Due или STM32.
Речь пока идет о схеме электрической, прошивки не касаемся.

"В ардуино задействованы 8 входов ADC , один цифровой вход"
Соответственно и в плате STM будут задействованы 8 входов ADC , один цифровой вход.

К Ардуино подключен экран типа CTE32HR или аналогичный, матричная клавиатура , карман для SD карты."
Значит и к STM должны иметь возможность подключаться дисплей, клавиатура и SD карта.

Вот с дисплеем вопрос. Как его подключить к STM. То же с клавиатурой и картой.
Надо проработать электрическую схему.   

На первом этапе это вся работа, требуется оцениться с ней.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

del
 

 

b707
Offline
Зарегистрирован: 26.05.2017

diakin пишет:

Надо проработать электрическую схему.

На первом этапе это вся работа, требуется оцениться с ней.

"прорабатывать электрическую схему" без хотя бы тестовой прошивки - это, простите, бред. Хотя надо сказать, что этот бред вполне типичный даже для опытных радиолюбителей - сначала разведем плату, а потом начинаем изгалятся в коде, как повесить апаратное прерывание на пин. где прерывания нет... или как запустить в коде софтовый СПи на обычных пинах, хотя на плате есть хардварный... но на других пинах.

Не повторяйте чужих ошибок. Сначала делается прототип, на нем отлаживается код - и только потом можно будет готовить схему и разводить плату, а не наоборот.

b707
Offline
Зарегистрирован: 26.05.2017

diakin, ваша работа должна строится в другом порядке.

 1. В первую очередь - Портировать прошивку системы с Дуе на STMF411 - для чего нужно предоставить исполнителю все исходники текущего проекта и полностью описать работу программы с входными и выходными данными.

2. Разработать схему переходной платы для Дуе и СТМ

3. Развести схему на печатную плату.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Естественно плата разводится в последнюю очередь, когда все отлажено. 
"Нужно на кроссплате развести разъем для установки STM, чтобы можно было воткнуть или Arduino или STM." - это конечная цель.

Прошивка с Due на STM портирована, есть проект для Arduino IDE под STM, правда  только измерение сигналов на аналоговых входах
и передача их в ПК через USB.

Для меня  непонятно подключение дисплея к STM. Подключение SD карты и подача сигналов на аналоговые входы сложности наверное не представляют. И хватит ли пинов для подключения клавиатуры, тоже вопрос. Не придется ли городить что-то такое
http://arduino.ru/forum/programmirovanie/podklyuchenie-matrichnoi-klavia...

 

b707
Offline
Зарегистрирован: 26.05.2017

diakin, вы сами себе противоречите. То пишете что разводка платы - конечная цель, то что "пока нужна только схема".

Если прошивка портирована только на треть - без дисплея и клавиатуры - значит реально никакого портирования нет. Без портирования кода схему разрабатывать рано. Поэтому возвращаемся к моему списку из сообщения #14

1 сначала прошивка

2. потом схема

3 и в конце - плата

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Переформулирую задачу.
Требуется к плате STMicro STM32F411CEU6 Arm Cortex-M4F (Black pill) подключить дисплей CTE32HR или аналогичный (ILI9341 например),  матричную клавиатуру 4х5 и SD карту.
Написать тестовую прошивку - для проверки работоспособности. 
Например -  набираешь на клавиатуре число, оно отображается на экране. Нажимаешь кнопку * - это число записывается на карту. Нажимаешь кнопку # - число из памяти отображается на экране.
Пины ADC и один цифровой пин, на который можно повесить прерывание - не занимать.

В таком виде норм?

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Дисплей 

Клавиатура

Коннектор SD card

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Да, в таком виде норм, но дисплей можно включать только spi, на параллельное включение пинов уже не хватит. Соответственно скорость прорисовки картинки будет существенно ниже, чем на дуе.
И крайне желательно работать с конкретной моделью экрана - точно с той, которая будет у заказчика, потому как совместимость у похожих дисплеев с али зачастую отсутствует.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Да, скорость будет ниже. Но картинки на весь экран там не выводить, только надписи, линии и т.п.
Хотя будет очистка экрана и отдельных областей. 
Конкретную модель экрана указать не получится ( ,потому что сегодня смогли купить такие, а завтра другие. Главное чтобы они по конструктиву подходили.  Если не будет совместимости будем допиливать под конкретную модель.. за отдельные деньги.
Пример подключения
https://istarik.ru/blog/stm32/149.html

b707
Offline
Зарегистрирован: 26.05.2017

diakin пишет:

Пример подключения
https://istarik.ru/blog/stm32/149.html

этот пример рождает следующий вопрос - вам под какой тулчейн СТМ32 нужен код? - даже для ардуино их два - родной от СТМ и тулчейн Роджера Кларка. А еще можно писать вообще вне экосистемы ардуино - тогда выбор еще больше.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Тот который Arduino_STM32, то есть использовать Arduino IDE. 

Arduino_STM32

b707
Offline
Зарегистрирован: 26.05.2017

Ок. я пас

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:
Конкретную модель экрана указать не получится
Вы хотя-бы разрешение экрана указали бы. Нигде не нашёл упоминания.

Если экран 320x240 на ILI9341, то и на SPI вполне достижимо ~36 FPS при тактовой CPU=180МГц. При обновлении всего экрана каждый кадр. И не надо кучу проводков тащить.

Для многих задач этого более чем достаточно.

Можно даже видео крутить, если где-то распакованный видеопоток брать.  ;)

 

PS: Кроме разрешения также не указаны требования по минимальному количеству цветов планируемого GUI. Сколько максимально одновременных цветов требуется в картинке на экране? От этого считаются требования по размеру видеопамяти.

b707
Offline
Зарегистрирован: 26.05.2017

rst пишет:

~36 FPS при тактовой CPU=180МГц

blackpill F411 CPU = 96 MHz

rst
Offline
Зарегистрирован: 25.06.2018

b707 пишет:
blackpill F411 CPU = 96 MHz
Пускай в 2 раза меньше. Для GUI - обычно вполне достаточно.

 

2ТС: Аналогично - клавиатура. Как по картинке прикажете угадывать её интерфейс подключения?

b707
Offline
Зарегистрирован: 26.05.2017

rst пишет:

клавиатура. Как по картинке прикажете угадывать её интерфейс подключения?

Черезчур усложняете... Думаю, обычная матрица.

4х5 - 4 ряда и 5 колонок, всего 9 пин. Если присмотреться, на картинке в соединителе как раз 9 пин и есть.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Дисплей 3.2"  480x320

Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.

 

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

По клавиатуре - да, матричная 9 pin.  Там с одновременным нажатием кнопок бывает какая-то бодяга, надо диоды ставить?
Кстати с клавиатурой не получится такой финт провернуть? Клавиатура подключается к 9 пинам - 4 столбца и 5 строк.  На каждый пин из 9-ти повесить прерывание по фронту например. В момент нажатия фронт приходит на пин строки и пин столбца. В обработчике запоминается номер пина, на который прерывание пришло.
Но если фронт приходит на два пина одновременно, обработается два  прерывания или одно?  
Если два, то сразу получаем номер строки и номер столбца. 
Или отмапить эти пины на регистр и по прерыванию читать состояние этого регистра.

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:

Дисплей 3.2"  480x320

Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.

Многовато...

Скорости можно достичь думаю: 320*480*2/(100e6/4/8) = ~0.1 сек - полное обновление экрана.

Но дело тут не в скорости. Сколько нужно цветов??? Так и не сказали. Секрет?

Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. Даже немного больше. А у вас всего 128 КБ внутренней ОЗУ. Или ставить внешнюю ОЗУ или придётся сильно экономить по ОЗУ в остальных задачах.

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:
По клавиатуре - да, матричная 9 pin.  Там с одновременным нажатием кнопок бывает какая-то бодяга, надо диоды ставить?
Не на том внимание заостряете. Думать надо о экране и его подключении. Здесь у вас будет узкое место.

А клавиатуру можно как угодно подключить. Это не проблема. Возможно её можно даже частично по пинам совместить с другой периферией. Для экономии.

rst
Offline
Зарегистрирован: 25.06.2018

76800 при 16-цветном режиме - это если иметь ОЗУ только на одну страницу. Тогда сперва - всё рисуем, потом - выводим. Но тогда общее время обновления будет ещё больше >0.1c.

Если работать в 2-страничном режиме (рисуем одну страницу, выводим - предыдущую), то можно достичь времени обновления всего экрана почти ~0.1 сек. Но ОЗУ нужно 76800*2.

b707
Offline
Зарегистрирован: 26.05.2017

судя по тому, что экраны 240х320 работают и на меге с ее жалкими 8к ОЗУ - видимо программный экранный буфер не обязателен

mixail844
Offline
Зарегистрирован: 30.04.2012

rst пишет:

diakin пишет:

Дисплей 3.2"  480x320

Видео крутить не требуется. Скорость обновления экрана не критична, влияет только на эстетику.
0.5 сек - это не эстетично.

Многовато...

Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. Даже немного больше. А у вас всего 128 КБ внутренней ОЗУ. Или ставить внешнюю ОЗУ или придётся сильно экономить по ОЗУ в остальных задачах.

не совсем верно , если надо выводить примитивы : линии , треугольники , цифры , буквы и прочее  , то будет достаточно и намного меншего буфера - порядка сотен байт
кажется ,даже для вывода картинок-графики  , STemWin не требует полноэкранного буфера - надо в манулае  смотреть
rst
Offline
Зарегистрирован: 25.06.2018

b707 пишет:
судя по тому, что экраны 240х320 работают и на меге с ее жалкими 8к ОЗУ - видимо программный экранный буфер не обязателен
Не обязателен если одно из двух:

1) Подключение по параллельной шине. При таком подключении ILI9341 позволяет чтение своего видео-ОЗУ. При последовательном подключении - не позволяет. По-крайней мере мой экземпляр ILI9341 - точно.

Но даже при наличии чтения, оно само существенно замедлит работу экрана.

2) Все стирать, а потом формировать изображение во внутреннем ОЗУ ILI9341 записью отдельных прямоугольных областей. Это во-первых - снижение общей скорости обновления экрана (два обращения: стирание, потом новая запись); во-вторых - ограничение возможностей GUI и его усложнение: никаких наложений картинок и пр. - так как не доступно чтение видео-ОЗУ.

Чем таким мазохизмом заниматься, так лучше дополнительное внешнее ОЗУ поставить.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

>Даже если предположить 16-цветный режим, то потребуется 320*480*.5=76800 байт только на видеобуфер. 

Ну а как оно в Due работает?
Для вывода на экран используются
myGLCD.drawLine, myGLCD.print итд
По расходу ОЗУ там что-то такое создается массив на 128 кб и туда пишутся данные с АЦП.
 

1#include <UTFT.h>
2UTFT myGLCD(CTE32HR, 38, 39, 40, 41); // инициализация TFT (старого)
3int TFTW = 480, TFTH = 320; // разрешение экранчика (старого)
4uint16_t *SummP; //Указатель на массив
5int  NPnt = 8192;
6...
7SummP = new uint16_t[NPnt * 8]; ..это 2 байта *64 - итого 128 kb.. Хм 96 КБ ОЗУ в Due
    
 

 

rst
Offline
Зарегистрирован: 25.06.2018

mixail844 пишет:
не совсем верно , если надо выводить примитивы : линии , треугольники , цифры , буквы и прочее  , то будет достаточно и намного меншего буфера - порядка сотен байт
Расскажите нам пожалуйста, как вывести линию (прямую) диагональную из верхнего левого угла в нижний правый имея буфер всего в "несколько сотен байт"? Да так чтобы рисование не заняло несколько секунд из-за необходимости рисовать маленькими кусочками, по кусочкам читая внутреннюю видео-ОЗУ ILI9341. А если подключение по SPI - так чтение и вообще невозможно.

Алгоритм в студию, плиз!  ;)

 

PS: А например у меня в GUI кое-где есть вращающиеся 5-конечные звёзды. Почти на весь экран. Или стрелочные часы с разноцветными треугольными стрелками, накладывающимися одна на другую. Также - на весь экран.

Расскажите как такое нарисовать имея буфер всего "в несколько сотен байт". И чтобы юзер не умер, ожидая завершения рисования одного примитива.  ;)))

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:
Ну а как оно в Due работает?
Параллельная шина.

Вам это ни о чём не говорит?

b707
Offline
Зарегистрирован: 26.05.2017

ну да, отсутсвие параллельной шины тут сильно все портит... тут согласен с rst

Вместо Дуе тут подошла бы плата с STM32F407VE, но она стоит примерно тех же денег, как дуе

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

rst пишет:

diakin пишет:
Ну а как оно в Due работает?
Параллельная шина.

Вам это ни о чём не говорит?

Речь идет об ОЗУ, которое полностью занято под буфер данных.

b707
Offline
Зарегистрирован: 26.05.2017

если требуется буфер 128к только под данные, с F411 ловить нечего

UPD - или ставить внешние SPI EEPROM типа w25q - на F411 даже место на плате под них выделено

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Картинка примерно такая.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

rst пишет:

..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).



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

 

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Ну собственно ОЗУ контроллера не используется (не расходуется) для вывода на экран.

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
 

mixail844
Offline
Зарегистрирован: 30.04.2012

rst пишет:

Расскажите нам пожалуйста, как вывести линию (прямую) диагональную из верхнего левого угла в нижний правый имея буфер всего в "несколько сотен байт"?

Алгоритм в студию, плиз!  ;)

1.подключить и правильно настроить библиотеку STemWin . судя по странице 8 из документа поттдеживаемых драйверов , это возможно :

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

2. вызвать библиотечную функцию( стр. 347)

1void GUI_DrawLine(int x0, int y0, int x1, int y1);
как это делается на уровне библиотеки ?  полагаю есть простой цикл типа  : 
 for(uint16_t x = x0 ; x < x1 ; x++):
  y[x] = ((y1-y0)/(x1-x0)) * x + C // C - константа
 
а библиотека , используя графический буфер ILI9341 , пишет в ту область памяти которая еще скрыта от пользователя , а потом ее показывает. 
да , возможно прийдеться адаптировать работу библиотеки для работы по интерфейсу SPI.
 

 

rst пишет:

Да так чтобы рисование не заняло несколько секунд из-за необходимости рисовать маленькими кусочками, по кусочкам читая внутреннюю видео-ОЗУ ILI9341. А если подключение по SPI - так чтение и вообще невозможно.

и судя по стр. 36 и стр. 63, докуманта на ILI9341 , читать по серийному интерфейсу , всеже можно 

 

 

 

 

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:

Картинка примерно такая.

Рисовать такую собрались?

Такую только по параллельной шине. Если рисовать сразу в видео-память ILI9341, без видео-буфера в памяти МК.

А если же по SPI: то большой буфер в ОЗУ МК, в нём нарисовать, а потом готовую - выплюнуть в SPI. И на такую картинку (с множеством цветов) надо не 76800 байт, а намного больше. Возьмите калькулятор да посчитайте. Нужна внешняя SDRAM на такую картинку.

Только так.

rst
Offline
Зарегистрирован: 25.06.2018

diakin пишет:
Ну собственно ОЗУ контроллера не используется (не расходуется) для вывода на экран.
Ещё раз: так (сразу в памяти ILI9341) можно рисовать только по параллельной шине.

diakin пишет:
вы получите точку на дисплее. 
Если будете рисовать по точкам, то рисование одного кадра будет длиться до 2-го пришествия.

promavto
promavto аватар
Offline
Зарегистрирован: 30.04.2013

Привет всем!

Что то все усложнили задачу. 

Замечание первое - подключать на разъемы модули DUE или STM32 типа Black pill не очень хорошее решение. Слишком много контактов - искать который не контачит очень стремно. Я прошел через это - клиенты замучают почему не работает или почему прибор периодически отключается. Надежнее и проще разработать две печатные платы с установкой микроконтроллеров SAM3X8E (DUE) или STM32XXX. Все равно на плате нужно будет устанавливать различные компоненты. Стоимость изготовления плат в Китае не очень большая. При этом изделие будет монолитное, что увеличит надежность работы.

Замечание второе - дисплей нормально будет работать с обеими микроконтроллерами. Про размеры ОЗУ можно забыть - что микроконтроллер отправит на дисплей то и отобразится. Конечно если не нужно будет "крутить кино". Библиотека STemWin, конечно классная, но в среде Ардуино работать не будет. В крайнем случае несколько лет назад я пытался ее адаптировать в среду Ардуино но не получилось.  Дисплей с микроконтроллером STM32 можно подключить на шину FSMC - быстродействие отличное. У SAM3X8E подключение по SPI не очень удачное решение. Можно попробовать подключить на параллельную шину.

Что бы не быть голословным - я разработал контроллеры теплицы на микроконтроллерах SAM3X8E и STM32F407. Адаптация программ состояла в индивидуальной инициализации дисплеев для каждого микроконтроллера. Основное тело программы больших изменений не требовало. Для работы STM32 в среде Ардуино лучше применить STM32GENERIC  https://github.com/danieleff/STM32GENERIC

С клавиатурой вообще проблем не должно быть - задача простая.

Мои варианты плат контроллера теплицы.

 

rst
Offline
Зарегистрирован: 25.06.2018

mixail844 пишет:
как это делается на уровне библиотеки ?  полагаю есть простой цикл типа  :
Вы сначала попробуйте, а потом полагайте. Если "так" будете что-то рисовать, будете очень долго ждать.  ;)

mixail844 пишет:
и судя по стр. 36 и стр. 63, докуманта на ILI9341 , читать по серийному интерфейсу , всеже можно
Во-первых: зависит от конкретной платы и сначала попробуйте.

Во-вторых: даже если чтение работает, это ничего вам не даст. 

Калькулятор в руки и считать сколько займёт ваше рисование по SPI. Особенно - таким образом.

 

PS: Все расчёты я привёл выше.

rst
Offline
Зарегистрирован: 25.06.2018

promavto пишет:
Дисплей с микроконтроллером STM32 можно подключить на шину FSMC - быстродействие отличное.
В выбранном автором STM32F411 нет FSMC. Если верить даташиту.

А так да - если бы у бабушки был *ер, то она была бы дедушкой.  ;)