Доброго времени суток, Хабровчане, сегодня речь пойдет о весьма не бюджетной мощной отладочной плате – Arduino Portenta H7. Статья будет обзорной и будет включать в себя описание платы и ее фич, возможные области применения, ну а в конце напишем пару примеров под этого монстра.
Покупка
Началось все с того, что в один прекрасный зимний вечер от начальства мне поступило задание: «Необходимо приобрести вооот такую отладочную плату
Не задавая лишних вопросов (т. к. это очередная новая игрушка для меня), полез на просторы интернета искать место, где можно бы заказать сие чудо. Первым делом, пошел на официальный сайт ардуины, где данная плата стоит около 100$, однако при попытке заказа в РФ, сайт выдает ошибку, мол «нельзя, извини, браток». Расстраиваться было рано, поэтому полез искать магазины-партнеры, однако и каждый партнер отказывался осуществлять доставку в Россию. Наконец, я вышел на три российских компании, у которых огромными буквами было написано, что они могут доставить в Россию, однако, цена была уже не такой приветливой: (вместо 100$ с официального сайта ~ 7000 руб., российские конторы предлагали купить за ~ 12000). Деньги казённые, так что экономить не имело смысла, и я сразу написал всем трем фирмам. При этом две из них сразу предложили оплатить заказ, но что-то меня предостерегло от этой глупости…. Ибо через неделю все три компании ответили, что «данный товар закончился», и они ничем мне не могут помочь. Однако, спустя еще неделю, представитель одной из компаний написал, что у них есть коллеги, у которых есть еще коллеги, у которых данный товар имеется в наличии (т. е. вы понимаете, как это звучит: «у меня есть друг, у которого есть друг, который знает одного человечка…»). При этом напрямую с этими людьми мне не давали связаться вплоть до момента оплаты. В конечном итоге, плату Arduino Portenta H7 я получил за 17000 руб. (цена весьма неплохого смартфона). На этом самая комичная часть статьи закончена, переходим к более серьезным вещам.
Краткое описание платы
Portenta H7 - пионер в семействе Portenta, предназначенная в основном для промышленного использования, однако, открытый исходный код и удобство использования Arduino позволяет применять ее где угодно.
Модель H7 оснащена двухъядерным процессором Arm Cortex ST, на котором "стоит" Mbed ОС. Mbed ОС - встроенная операционная система реального времени (RTOS), разработанная специально для микроконтроллеров, применяемых в IoT проектах.
Процессор
Особенность Arduino Portenta H7 заключается в одновременном выполнении как высокоуровневого кода с использованием Mbed API, так и поддержании работы с задачами в реальном времени. Т. к. оба ядра имеют полный доступ ко всей периферии, данная плата может спокойно выполнять:
Arduino-скетчи
Нативные приложения для Mbed ОС
Интерпретировать MicroPython и JavaScript
Код TensorFlow Lite
Параллельность выполнения процессов обеспечивают двухъядерный процессор STM32H747, состоящий из ядра Cortex-M7, которое работает при 480 МГц и ядра M4, работающее при 240 МГц. Такая особенность реализует реальную параллельность выполнения программ, к примеру, выполнение Arduino-скетча и программы, написанной на MicroPython. При этом оба ядра свободно "общаются друг с другом" для обмена информацией.
Более того, H7 может работать и как простой встраиваемый микроконтроллер, и может быть использована в качестве главного процессора встраиваемого персонального компьютера.
Различные режимы энергосбережения платы позволяют моментально переключаться в наиболее оптимальные режимы работы для данного момента времени, что значительно снизит энергопотребление устройства.
Machine Learning
На H7 могут быть запущены проекты, написанные с использованием TensorFlow Lite, что реализует возможность запуска алгоритмов машинного обучения на микроконтроллере! При этом одно из ядер может взять на себя функции вычислительного ядра для TensorFlow Lite, в то время как второе будет управлять, например мотором, или производить передачу данных.
GPU
Да, все верно, STM32H747 содержит встроенный GPU(Chrom-ART Accelerator), который реализует, пожалуй, самую впечатляющую особенность Portnenta H7 - подключение внешнего монитора для создания встраиваемого персонального компьютера с графическим интерфейсом пользователя. Более того, чип плата содержит встроенный JPEG энкодер и декодер.
Протоколы передачи данных
Беспроводной модуль Murata 1DX позволяет одновременно управлять WiFi и Bluetooth подключениями, при этом WiFi может работать в режиме точки доступа, в режиме станции, а также в сдвоенном режиме, представляющем собой совокупность двух предыдущих. А скорость передачи данных может достигать 65 Мбит/с.
Bluetooth интерфейс поддерживает как BLE, так и Bluetooth Classic, что позволит применить данное чудо техники в IoT проектах. Про такие протоколы как UART, I2C, SPI, Ethernet, я думаю, говорить смысла нет: H7 поддерживает каждый из них.
Память
Внутренняя память состоит из 2 Мб флэш-памяти , и 1 Мб ОЗУ, разделенной следующим образом:
192 кБ строго отведены для критических по длительности процедур
64 кБ для инструкций
128 кБ для хранения данных
864 кБ пользовательской SRAM
4 кБ для резервной копии SRAM
Также к данной модели можно присоединять дополнительную внешнюю SDRAM и QSPI Flash. Объем подключаемой SDRAM может достигать 64 Мб, напрямую отображаемых в адресном пространстве. QSPI Flash позволяет добавлять до 128 Мб, которые могут быть использованы для хранения данных или кода программы.
Шифрование данных
"На борту" H7 расположены два крипто-чипа: ATECC608A производства Microchip, и SE050C2 от компании NXP.
Ethernet Phy
Дополнительный физический интерфейс 10/100 Ethernet напрямую подключается к внутреннему MAC- адресу платы, обеспечивая полнодуплексную связь с автоматической поддержкой MDIX. А внешнее прерывание по Lan значительно снижает энергопотребление устройства в режиме ожидания.
На борту
Итак, по умолчанию Arduino Portenta H7 имеет в наличии:
Двухъядерный микроконтроллер STM32H747 (Cortex-M7, работающий при 480 МГц / M4, работающий при 240 МГц)
Графический аппаратный ускоритель Chrom-ART
Блок вычисления CRC
Встроенный JPEG кодек
Оперативная память - 8-64 Мб SDRAM
2-128 Мб NOR Flash
4 DMA контроллера, для облегчения "жизни" основного процессора
1 высокоскоростной контроллер прямого доступа к памяти
Поддержка сетевых протоколов 10/100 Phy
Встроенный беспроводной модуль с поддержкой беспроводных протоколов BT5.0 и WiFi 802.11
Встроенный DisplayPort
USB type C
Антенна 2.4/5 ГГц
22 таймера и watchdog-ов
4 I2C интерфейса
4 USART/UART - интерфейсов
6 SPI
8-ми битный интерфейс камеры
3 16-ти битных АЦП, с поддержкой до 36 каналов, с поддержкой макс. скорости до 3.6 MSPS
96-ти битный уникальный ID
и т.д.
Более того, плата может быть кастомизирована строго под ваш бюджет и нужды.
Набор всех фич просто не перечислить... Для более подробной информации можете ознакомиться с официальным сайтом Arduino.
Внешнее описание
Плата приходит в небольшой коробочке, задняя часть которой частично дублирует информацию из даташита.
Внешний вид коробки
Человеку, который за всю жизнь видел пока только китайские копии Arduino nano, и голые камни ATmega, мне было весьма приятно подержать в руках такое устройство.
Внешний вид платы Arduino Portenta H7
Внешний вид платы с официального сайта
Физические размеры составляют: 66 х 25 мм.
Области применения
Если говорить о моей работе, то данный агрегат покупался для научно-исследовательских целей (если заинтересует наша деятельность - дайте знать, может в дальнейшем напишу статью о том, что именно мы делали).
Помимо научно-исследовательских целей, плата может найти широкое применение в качестве достаточно компактной системы с машинным обучением, например, вы захотели сделать систему распознавания лиц и приделать ее к домофону. В таком случае Portenta H7 - идеальный вариант.
Также, широкое распространение может получить прецизионное оборудование, в основу которого ляжет данная плата.
И в дополнение к вышесказанному, H7 может использоваться в очень ответственных устройствах, в качестве контроллеров для робототехники, а также в качестве вычислительного процессора для встраиваемых компьютеров. Ну, а основной задачей, согласно сайту является применение платы в производственных целях.
В общем - областей применения - тьма, тут уже кто на что горазд.
Написание классического blink
Вот мы и подходим к концу. Если вам не интересна эта часть, можете смело переходить к заключению. Или ко второму примеру, в котором мы будем работать с WiFi.
Здесь же мы подготовим полностью среду разработки Arduino IDE к работе с Arduino Portenta H7, и напишем классический пример мигания светодиодом (куда уж без этого всего), однако для этого задействуем оба ядра отладочной платы.
Итак, приступим.
Настройка IDE
Первым делом, нам необходимо подгрузить все библиотеки для работы с Portenta, для этого в IDE мы нажимаем Инструменты -> Плата -> Менеджер плат (Tools->Board->Board Manager)
Менеджер плат
В поисковике менеджера плат вбиваем "portenta", и затем выбираем "Arduino mbed-enabled Boards", выбираем необходимую версию (на момент моей работы это была версия 1.30), и скачиваем.
Скачивание ядра
Далее, после окончания загрузки можно переходить к программированию устройства.
Программирование Portenta H7
Писать мы будем классический blink, однако попробуем реализовать его на каждом из ядер по отдельности: т.е., к примеру раз в полсекунды светодиод будет моргать красным цветом, а раз в 200 мс - зеленым, при этом за другой цвет будет отвечать второе ядро.
Особенность Portenta H7 заключается в том, что код для каждого ядра можно написать в отдельном файле, а затем загрузить для каждого из ядер по отдельности (однако, если хочется, вместо "двухфайловой" прошивки можно сделать однофайловую). примеры обоих вариантов будут представлены ниже.
M7Blink
void setup() {
// initialize digital pin LEDR as an output.
bootM4(); //Waking up the M4 core
pinMode(LEDR, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LEDR, LOW); // turn the red LED on (LOW is the voltage level)
delay(500); // wait for 500 milliseconds
digitalWrite(LEDR, HIGH); // turn the LED off by making the voltage HIGH
delay(500); // wait for 500 milliseconds
}
Код для моргания красным светодиодом на ядре M7
Вас может смутить, 4 строчка кода (bootM4()) (хотя по названию, в принципе, можно догадаться). Смысл этой строчки становится ясным после того, как мы узнаем каким образом происходит запуск микроконтроллера.
После подачи напряжения, стартует лишь ядро M7, в то время как M4 - спит. Следовательно, для того, чтобы код, написанный для M4 выполнялся, ядро M4 следует принудительно пнуть. Это собственно и достигается командой bootM4().
Далее нам следует написать код для второго ядра "M4Blink":
M4Blink
void setup() {
// initialize digital pin LEDG as an output.
pinMode(LEDG, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LEDG, LOW); // turn the LED on (LOW is the voltage level)
delay(200); // wait for 200ms
digitalWrite(LEDG, HIGH); // turn the LED off by making the voltage HIGH
delay(200); // wait for 200ms
}
Код для моргания зеленым светодиодом на ядре M4
Далее, для загрузки обоих файлов в память МК нам необходимо подключить плату к компьютеру, далее пройтись по цепочке: Инструменты -> Плата -> Arduino Mbed OS Boards, и выбирать вначале M7 core.
Выбор ядра для загрузки прошивки
Далее, выбираем COM порт, к которому подключена наша плата, и нажимаем "загрузить".
Выбор порта для загрузки проишвки
После успешной загрузки, необходимо повторить операцию для ядра M4, однако в цепочке Инструменты -> Плата -> Arduino Mbed OS Boards необходимо выбрать уже M4 core. При этом цепочка для выбора порта остается такой же, как и в предыдущем случае.
Выбор второго ядра для загрузки прошивки
Если все сделано правильно, то встроенный светодиод на плате начнет моргать зеленым раз в 200 мс, а красным - раз в 500 мс. При наложении цветов, мы получим желтый цвет.
"Однофайловая" прошивка
Далее, приведу пример "однофайловой прошивки", которая не потребует раздельных файлов для разных ядер. Для такой прошивки используются директивы #ifdef, однако ими не стоит злоупотреблять, и большой код все-таки лучше разбить на два файла.
"Однофайловая прошивка"
int myLED;
void setup() {
randomSeed(analogRead(0));
#ifdef CORE_CM7
bootM4();
myLED = LEDR; // built-in blue LED10 #endif11
#endif
#ifdef CORE_CM4
myLED = LEDG; // built-in greeen LED
#endif
pinMode(myLED, OUTPUT);
}
void loop() {
digitalWrite(myLED, LOW); // turn the LED on
delay(200);
digitalWrite(myLED, HIGH); // turn the LED off
delay( rand() % 2000 + 1000); // wait for a random amount of time between 1 and 3 seconds.
}
Данный код стоит загрузить по отдельности в каждое из ядер платы. Встроенный светодиод будет мигать разными цветами в промежутке времени от 1 до 3 секунд, где время срабатывания определяется функцией рандомных чисел.
Использовать такую плату для моргания светодиодами, ну как то неправильно что ли.... Если тема будет интересна, то в дальнейшем, напишем уже нормальные примеры для параллельных процессов.
Далее, будет приведен еще один пример, взятый с оф. сайта Arduino: мы превратим нашу Portenta H7 в WiFi точку доступа.
WiFi Hotspot
В данном примере мы напишем программу, которая сделает из нашей платы WiFi точку доступа, которая будет работать в качестве сервера, выдающего HTML страничку, содержащую три кнопки, по нажатию на которые, будет изменяться свет встроенного в плату светодиода. Итак, приступим.
Код
WiFiServer
#include <WiFi.h>
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80); //Server port = 80
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Access Point Web Server");
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
pinMode(LEDB,OUTPUT);
// by default the local IP address of will be 192.168.3.1
// you can override it with the following:
// WiFi.config(IPAddress(10, 0, 0, 1));
if(strlen(pass) < 8){
Serial.println("Creating access point failed");
Serial.println("The Wi-Fi password must be at least 8 characters long");
// don't continue
while(true);
}
// print the network name (SSID);
Serial.print("Creating access point named: ");
Serial.println(ssid);
//Create the Access point
status = WiFi.beginAP(ssid,pass);
if(status != WL_AP_LISTENING){
Serial.println("Creating access point failed");
// don't continue
while (true);
}
// wait 10 seconds for connection:
delay(10000);
// start the web server on port 80
server.begin();
// you're connected now, so print out the status
printWiFiStatus();
}
void loop() {
// compare the previous status to the current status
if (status != WiFi.status()) {
// it has changed update the variable
status = WiFi.status();
if (status == WL_AP_CONNECTED) {
// a device has connected to the AP
Serial.println("Device connected to AP");
} else {
// a device has disconnected from the AP, and we are back in listening mode
Serial.println("Device disconnected from AP");
}
}
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
Serial.println("new client"); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("<html><head>");
client.print("<style>");
client.print("* { font-family: sans-serif;}");
client.print("body { padding: 2em; font-size: 2em; text-align: center;}");
client.print("a { -webkit-appearance: button;-moz-appearance: button;appearance: button;text-decoration: none;color: initial; padding: 25px;} #red{color:red;} #green{color:green;} #blue{color:blue;}");
client.print("</style></head>");
client.print("<body><h1> LED CONTROLS </h1>");
client.print("<h2><span id=\"red\">RED </span> LED </h2>");
client.print("<a href=\"/Hr\">ON</a> <a href=\"/Lr\">OFF</a>");
client.print("<h2> <span id=\"green\">GREEN</span> LED </h2>");
client.print("<a href=\"/Hg\">ON</a> <a href=\"/Lg\">OFF</a>");
client.print("<h2> <span id=\"blue\">BLUE</span> LED </h2>");
client.print("<a href=\"/Hb\">ON</a> <a href=\"/Lb\">OFF</a>");
client.print("</body></html>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /Hr")) {
digitalWrite(LEDR, LOW); // GET /Hr turns the Red LED on
}
if (currentLine.endsWith("GET /Lr")) {
digitalWrite(LEDR, HIGH); // GET /Lr turns the Red LED off
}
if (currentLine.endsWith("GET /Hg")){
digitalWrite(LEDG, LOW); // GET /Hg turns the Green LED on
}
if (currentLine.endsWith("GET /Lg")){
digitalWrite(LEDG, HIGH); // GET /Hg turns the Green LED on
}
if (currentLine.endsWith("GET /Hb")){
digitalWrite(LEDB, LOW); // GET /Hg turns the Green LED on
}
if (currentLine.endsWith("GET /Lb")){
digitalWrite(LEDB, HIGH); // GET /Hg turns the Green LED on
}
}
}
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
void printWiFiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your Wi-Fi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print where to go in a browser:
Serial.print("To see this page in action, open a browser to http://");
Serial.println(ip);
}
Код достаточно простой и легко читается, однако все оригинальные комментарии сохранены.
А работает он по следующему принципу: после нажатия на определенную кнопку, телефон посылает Get запрос на сервер, в сообщение указываются параметры H/L (High/Low), R/G/B (Red/Green/Blue), после получения всей последовательности, сервер (Portenta H7) включает/выключает необходимый светодиод и переходит в режим ожидания следующего сообщения.
Создатели кода рекомендуют хранить SSID и пароль точки доступа в отдельном файле. Для этого необходимо нажать на стрелочку под порт монитором в Arduino IDE. Ввести имя файла "arduino_secrets.h".
Создание нового файла
А в сам файл стоит добавить следующие две строчки, которые будут содержать SSID и пароль точки доступа.
# define SECRET_SSID "PortentaAccessPoint" //You could put your own SSID
# define SECRET_PASS "123Qwerty" //And password
Ну а далее остается лишь зашить прошивку в плату. Заливать прошивку стоит также как и в предыдущем примере, а в качестве ядра выбрать M7.
Ошибки
Ошибка создания точки доступа
Для устранения такой ошибки надо зайти в Файл -> Примеры -> отлистать до Arduno Portenta -> WiFi -> PortentaWiFiFirmwareUpdater, и загрузить выбранный файл в микроконтроллер.
После успешного обновления, необходимо опять загрузить нашу прошивку для сервера на Portenta H7.
Подключение к точке доступа
После успешной прошивки, следует открыть порт монитор, и дождаться сообщения о готовности токи доступа.
Сообщение о готовности точки доступа
Далее, после подключения устройства (в моем случае - это смартфон) необходимо в строке браузера выполнить подключение (отправку Get запроса) к нашему серверу по его ip адресу.
HTML страница нашего сервера
А для управления светодиодами, стоит нажимать на кнопки on/of у соответствующих цветов. При этом на Portenta H7 будут приходить сообщения, которые будут также отображаться в порт мониторе.
Отправка запросов на сервер
Собственно на этом, данный пример завершен.
Заключение
В общем то и все. В данной статье я провел обзор новой платы производства Arduino, рассмотрел некоторые из ее особенностей, привел области применения такого устройства, и познакомил читателя с настройкой IDE для работы с данной платой.
Если данная тема понравится, то в дальнейшем могу разобрать более детально некоторые из фич платы, а плюсом и написать более интересные программы. Да и к тому же, сам хотел бы более подробно разобраться с этим девайсом (раз уж дали такую игрушку). В общем, жду ваших комментариев.
Всем спасибо, до новых встреч!
Комментарии (28)
dcoder_mm
15.07.2021 13:49+1встроенный GPU(Chrom-ART Accelerator), который реализует, пожалуй, самую впечатляющую особенность Portnenta H7 - подключение внешнего монитора
Chrom-ART Accelerator который даже ST скромно называют DMA2D это именно что DMA предназначенный для работы с двухмерными массивами. Фичи типа pixel format conversion и альфа-блендинга там есть, но и только.
Внешние дисплеи, чтобы с ними мог работать DMA2D подключаются либо через LTDC либо через FMC, и то и то требует кучи пинов (LTDC - порядка двух десятков для режима RGB565)
rcepro
15.07.2021 14:11+3ардуина...посредственность...не достанешь в РФ...да ещё только за большие деньги....
смысл во всём этом? это просто какая-то реклама, а не топик.
производители, в своих изделиях - не станут тратить свои деньги на такой контроллер - т.к. им важно, чтоб было дёшево и чтоб было всегда возможно купить. А рядовые пользователи - тем более - 17тыс руб за такой "шедевр"?... Что он им даст в профессиональном плане? Что они покажут в своём резюме? - как спустили деньги на посредственную отладочную плату?
что касается, что это мол - выбор начальства - купить эту плату и всё тут...:
не знаю - так ли это на самом деле - или это просто выдумки автора но,
контроллер (и отладочная плата) выбирается под задачу. Есть задача. есть поставленные и обусловленные ей технические рамки, - выбирается контроллер. Причём, при выборе - идёт грызня за каждую копейку, потому что конкуренция.dcoder_mm
15.07.2021 14:19+1Ну люди всё же покупают ардуину чтобы с ней играться и по-быстрому собирать какие-нибудь глупости, а не добавлять в резюме
DanilinS
15.07.2021 14:40+1Такие люди обычно берут STM32H747I-DISCO, которое уже имеет экран и кучу обвеса на борту.
А если берут для "интегрированных мозгов" — покупают что-то типа https://aliexpress.ru/item/1005001722246541.htmlИ в догонку — на али эта плата стоит около 9 т.р. https://aliexpress.ru/item/1005002741201377.html
Osiris74 Автор
15.07.2021 14:43Насчет STM32H747I-DISCO ни разу не слышал, спасибо за ссылку, почитаю на досуге про него.
А при попытке заказать с Ali, также возникает проблема при оплате: оплата проходит, а через несколько дней приходит сообщение о том, что в РФ они доставить ее не могут, и начинается длительный процесс ожидания возврата средств.
dcoder_mm
15.07.2021 14:58+2Насчет STM32H747I-DISCO ни разу не слышал
Вам тогда возможно будет интересно что у ST есть еще серия очень дешевых плат Nucleo с МК и минимальной обвязкой. Это самый дешевый способ купить плату с STM32 и ethernet PHY например
Osiris74 Автор
15.07.2021 14:37+1Реклама чего?
Я лично ничего не рекламирую в данном посте.
В вводной части я лишь пытался рассказать о том, что данную плату в РФ доставить весьма проблематично.Дешево будет в том случае, если заказывать через официальный сайт Ардуины (на данный момент плата стоит 70 с лишним долларов), что уже весьма неплохая цена. Остальные наценки идут из-за российских компаний импортеров.
Насчет резюме, опять же ни слова не было сказано, я упомянул о возможных областях применения устройства (оно в основном должно применяться для производственных целей, а не для "профессионального плана" любителей).
Выбор начальства пал именно на эту плату, из-за того что наш коллега из-за рубежа написал рабочее ПО именно для этого устройства. Моей задачей было разобраться со всем этим делом, а далее уже обеспечить экономическую выгоду от сего устройства.
Т.е. моя задача - создать устройство, которое в дальнейшем можно будет поставить на производство. При этом, отладочная плата используется именно для отладки, для понимания необходимых от нее функций. Далее идет процесс создания печатной платы готового устройства с использованием всех необходимых модулей, стоящих на отладочной плате. После создания платы идет процесс создания корпуса изделия, лицензирование ПО, и выпуск в свет. Если коротко, то вот главная цель
И на момент моего первого знакомства с Portenta H7 меня мало интересовала его экономическая выгода.
Надеюсь, я смог дать Вам пояснения по каждому из пунктов.
rcepro
15.07.2021 14:41+1"Выбор начальства пал именно на эту плату, из-за того что наш коллега из-за рубежа написал рабочее ПО именно для этого устройства. Моей задачей было разобраться со всем этим делом, а далее уже обеспечить экономическую выгоду от сего устройства. "
когда девайс создают под ПО - тут просто уже, как говорится, - нет слов...
Osiris74 Автор
15.07.2021 14:45+1Вы не поняли.
Коллега собрал у себя работающее устройство, затем написал под него ПО. Т.к. коллега не может приехать в РФ, была поставлена задача повторить его устройство, точнее скачать его ПО, прошить МК, подпаять все необходимые компоненты к плате. А далее начать оптимизировать данное устройство.
DanilinS
15.07.2021 14:48"рабочее ПО именно для этого устройства " — имеется в виду что софт заточен под что-то распаянное на плате? Если используется крипточип или WiFi/BT Module то брать имеет смысл. Иначе взять любую отладочную плату на чипе этой серии и прошить ардуино-загрузчик.
Teplo_Kota
15.07.2021 14:47+1А надо было просто завести аккаунт в одной из служб пересылки, и они бы вам купили в первом магазине и привезли. В сумме в 120$ уложились бы и без левых контор.
DanilinS
15.07.2021 15:42Это не совсем законно. Скорее всего плата попадает по экспортные ограничения ( по криптографии?).
При сертификации и лицензировании может всплыть и стать причиной кучи проблемм.Osiris74 Автор
15.07.2021 18:11Насчет этого не знаю, я связал проблемы с доставкой с возможными санкциями...
Хотя здесь ничего утверждать не могу
Albert2009ru
15.07.2021 16:49Добрый день!
Что-то сильно усложнили написание скетчей. Насколько я понял, даже скетч "два в одном" нужно грузить два раза... Геморрой какой-то, а если я ADC начну опрашивать? А он только на одном из ядер. Тема как-то не раскрыта :(
Osiris74 Автор
15.07.2021 18:10Да, все верно, скетч необходимо грузить дважды в МК, чтобы каждое ядро могло прочитать свои инструкции. ИМХО есть какая то лазейка по запихиванию данных из М7 в М4, но этим пока не занимался
dcoder_mm
15.07.2021 19:30В каком смысле ADC только на одном из ядер? Он же на AHB висит а она должна быть доступна для всех
Albert2009ru
15.07.2021 20:47+1:) Я даже не знаю о чем Вы... На Atmega328P это так работает ADCSRA конфигурируется на включение ADC и выбор частоты замера + "муксится" канал ADC на конкретный пин проца.
Далее ADCSRA единицу в ADSC, затем ждем пока он вновь в ноль не перейдет, снова единицу туда же (читайте эррату, они в Atmega этот косяк так и не исправили) и затем, результатом замера будет значение ADC в 16 битах, либо можно в ADCH и ADCL они "побайтные".
И всё это в одной единственной Atmege, соответственно в "Ардуине".
Не поленился слазить в даташит на Atmeg'у (мало ли, вдруг чего-то реально не знал), там тоже ничего про AHB нет. Дайте ссылку на этот AHB, надо развивать эрудицию.
зы Я в "кишках" процессоров не разбираюсь, что в даташите написано и в примерах приведено, тем и пользуюсь.
dcoder_mm
15.07.2021 21:09+1На Atmega328P это так работает
Oh, sweet summer child...
AHB это одна из внутренних шин в МК на которой висит разная периферия (в том числе и ADC). Оба ядра имеют доступ к ней. Посмотрите блок-схему МК в даташите на стр 19. ADC справа сверху, ядра Cortex-M4 и Cortex-M7 слева сверху. Легко видеть (я не удержался, простите), что оба ядра имеют доступ к ADC через разные промежуточные шины.
А еще вам наверное будет интересно почитать как устроены ADC в этом МК (reference manual, стр 961) и сравнить с атмегой.
Дайте ссылку на этот AHB, надо развивать эрудицию.
Я могу вам дать ссылки на две брошюрки об этом МК:
Одна поменьше (даташит): https://www.st.com/resource/en/datasheet/stm32h747xi.pdf
Вторая чуть побольше (reference manual): https://www.st.com/resource/en/reference_manual/dm00176879-stm32h745755-and-stm32h747757-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
Albert2009ru
15.07.2021 22:09+2Супер, клёво. Для ознакомления, самое то... Как начну юзать системы, подобные этой, то уже будет полегче, хотя бы с точки зрения восприятия.
Спасибо, ещё раз, за ссылки!
aliday
17.07.2021 10:19+1Чем оно лучше esp32 за 1000₽ с али ещё и с экраном? А без - так за 500! Выглядит оверпрайсово, выгода вообще не очевидна, даже если взять две штуки для многопоточности
DanilinS
Давайте уточним, что из перечисленного имеет отношение к Arduino Portenta H7 а что к STM32H747. А то у вас все в кучу.
Osiris74 Автор
Да, в перечисленном списке, элементы имеют отношение как с Portenta H7, так и к STM32H747. И мне не особо ясен смысл разбиения отдельно на фичи МК и того, что содержится на плате. Я постарался вынести самые впечатляющие особенности и того и другого в список.
KivApple
Ну то что имеет сам STM32H747 можно получить путём заказа какой-нибудь другой dev-платы, а больший выбор означает и ниже цену и больше поставщиков (конкретно я как физлицо вижу вообще вариант на AliExpress за 47$, но юрлицу может быть неудобно оплачивать).
Так что разделять какие плюшки даёт просто сам МК и какие плюшки даёт конкретная dev-плата (предустановленная периферия и т. д., ардуиновский бутлоадер сам по себе обычно можно залить на любую плату с совместимым МК, так что софтовая часть не считается) вполне имеет смысл.
DanilinS
На плате чип один. ATECC608A или SE050C2 на выбор.