Arduino IDE + аддон от stm32
- Войдите на сайт для отправки комментариев
Втр, 22/10/2019 - 14:51
Предлагаю тут пообсуждать аддон от STM, и всё, что так или иначе с ним связано: глюки, особенности, сравнение с другими аддонами, примеры использования, итд итп.
Для тех кто совсем не в курсе, но хочет понять о чём тут речь -
Arduino IDE "из коробки" не поддерживает микроконтроллеры STM32
Несколько энтузиастов сделали варианты дополнения, благодаря которому такая поддержка
появилась. Самый известный вариант сейчас -аддон от Роджера Кларка. https://github.com/rogerclarkmelbourne/Arduino_STM32
Это усовершенствованный вариант от компании Лифлабс, который та давным давно забросила.
Но теперь и этот аддон оказался заброошен, а сайт stm32duino.com лежит уже несколько месяцев.
Дополнено: сайт поднялся, аддон развивается дальше.
Наиболее перспективный на мой взгляд аддон от самих STM (судя по всему пока неофициальный) https://github.com/stm32duino/Arduino_Core_STM32
Он развивается, пополняется, в общем заслуживает внимания.
Список поддерживаемых плат и контроллеров https://github.com/stm32duino/Arduino_Core_STM32#boards-available
Установка https://github.com/stm32duino/wiki/wiki/Getting-Started
Замеченные мной баги:
-может глюковать при компиляции если системная временная папка у вас находится где-то на виртуальном рам-диске.
-аддон может не устанавливаться с сообщением Error downloading и.т.д. как лечить написано тут
https://github.com/stm32duino/BoardManagerFiles/issues/15
-может глюковать если в IDE уже установлен аддон от Роджера Кларка.
Отличия этого аддона от варианта Роджера Кларка:
- (самое главное) больше поддерживаемых МК
- тот основан на библиотеке Libmaple, а этот на CMSIS & HAL.
- есть выбор в меню платы создавать USBCDC или нет.
- использует собственный компилятор (а не компилятор от Due как было в том)
Варианты загрузки прошивки, которые есть в аддоне:
-STM32CubeProgrammer(SWD)
обычная загрузка через программатор. Если у вас Stlink версии 2.0, то он не поддерживается, нужно 2.1
Можно переделать ваш 2.0 в 2.1 по этой статье. https://habr.com/ru/post/442290/
Или сделать программатор из блюпилл по этой статье. https://istarik.ru/blog/stm32/107.html
Я переделал свой, теперь в програматоре и комп-порт появился, очень удобно.
Так же нужно дополнительно установить STM32CubeProg https://www.st.com/en/development-tools/stm32cubeprog.html
-STM32CubeProgrammer(Serial)
Видимо заливка через аппаратный сериал, не проверял.
-STM32CubeProgrammer(DFU)
заливка через заводской загрузчик. В 103 серии его нет. В F401
нужно нажать кнопку boot, а потом кнопку reset, и пойдёт загрузка.
-BMP (Black Magic Probe)
заливка через одноимённый программатор (не проверял)
-Hid Bootloader 2.2
Существует только для F103 и F407 https://github.com/Serasidis/STM32_HID_Bootloader
Проверил, довольно удобная штука. Но я планирую эксперементировать на F401, так что использовать не смогу.
Убедительная просьба не нажимать кнопку цитировать, иначе у меня не будет возможности дополнять этот пост
Собссно переход на этот аддон был вынужденный, из-за этой платки
О которой недавно писал a5021 в теме "интересное на Али" При цене 230 рублей и параметрах 84MHz 64кб ram 256кб rom неплохой конкурент народному блюпилу на F103. Но меня меня эта плата интересовала в основном наличием двух 32-битных таймеров. Как выяснилось по части регистров в ней довольно много отличий от F103, GPIO и DMA прямо существенно переделаны.
Идею первого примера взял отсюда http://www.cyberforum.ru/blogs/204791/blog5169.html
Это мигалка светодиодом через DMA, практической ценности никакой, но одним махом можно проверить
связку таймера, дма и gpio. Выяснилось что теребить биты в портах gpio может только DMA2. И единственный таймер, под такты которого это можно делать -таймер1.
Кратко принцип работы:
Таймер раз в секунду делает update, и это событие отлавливает дма2, который в свою очередь
бёрет поочередно байты из массива, и суёт их в регистр управления битами порта.
И светодиод мигает :)
насчет загрузчика - а бутлоадер Кларка (https://github.com/rogerclarkmelbourne/STM32duino-bootloader) это какой. через DFU? И, кстати, нельзя использовать этот бут с новым аддоном?
В переходе от аддона Кларка на аддон СТМ меня останавливает несколько реализованных проектов на старом аддоне. И, если не ошибаюсь, куда более глубокая поддержка железа у Кларка. В частности, в аддоне от СТМ нет ДМА, а у Кларка есть...
b707, бутлоадер Кларка это почти тот же HID bootloader, только с жестко привязанным к нему USBCDC. Т.е. формально его HID уже нельзя назвать :)
С поддержкой DMA всё в порядке, я же привёл пример. Можно писать на HAL, тут уж кому как нравится. Я предпочитаю CMSIS
С поддержкой DMA всё в порядке, я же привёл пример. Можно писать на HAL, тут уж кому как нравится. Я предпочитаю CMSIS
Спасибо, когда отвечал, Вашего примера еще не было. Поизучаю
Я имел в виду, что у Кларка были готовые методы верзнего уровня для использования ДМА, такие как SPI_DMA_Transfer() и тп. А тут их "ручками" придется писать :)
b707, про SPI не знаю, я пока только светодиодом научился мигать :-)))
В HAL есть все готовые стартеры верхнего уровня. Гораздо больше чем у Кларка, да и управление оборудованием шире. Уже нарывался на таймеры. Без CMSIS было не сделать на Кларковских.
да, тоже сначала изучал аддон от Кларка, после как dimax дал ссылку на этот
https://github.com/rogerclarkmelbourne/Arduino_STM32
решил его пощупать, тут функционал побогаче, ну блин времени - хрен.
подпишусь
описание платки от китайцев 401 чип
https://yadi.sk/d/98m6jZl7zPgwiQ
и 411
https://yadi.sk/d/bSAlrNf0HAh4ag
описание платки от китайцев 401 чип
Схема к сожалению не от нашей платы.
Кто нить опознал что за элемент стоит около кварца (название a748n) две ноги которого приходят на пины PC15,PC14 Кварц на 32768?
описание платки от китайцев 401 чип
https://yadi.sk/d/98m6jZl7zPgwiQ
и 411
https://yadi.sk/d/bSAlrNf0HAh4ag
И от меня категорическое спасибо!
Первая сложность -не могу объявить прерывание таймера средствами CMSIS.
По идее должно быть так:
void TIM2_IRQHandler(void) { }
но программа виснет, т.к. компилится оно с другим именем. (Компилятор С++ так работает)
Меняю на extern "C" void TIM2_IRQHandler(void) { } -ругается:
HardwareTimer.cpp:(.text.TIM2_IRQHandler+0x0): multiple definition of `TIM2_IRQHandler';
Оказывается ардуиновский драйвер таймера уже занял все эти имена !!! :((
Вычищать его и системы как то слишком топорно.. нужно какое-то красивое решение. Но какое?
Не так много вычищать, мне недавно понадобился таймер-2 для энкодера на моей Ф446рэ, просто замаркировал в ардуиновском timer.c
И декларировать:
Таймеры если прерывания не нужны сразу смис понимают, сложнее запустить дуал - трипле - квадро АЦП и ЦАП, там ардуина вцепилась зубами и ломать не хотелось пост-иниты, по лени как-нить аналогРид шмыгнуть. Короче пришлось переписать СМИС, вместо ХАЛ_ май_ХАЛ_
Волшебник, спасибо, интересный вариант.
Вчера попробовал организовать прерывание по "правилам ардуины". Мигалка светодиодом в прерывании (для stm32f401). Что удобно на 32-битном таймере -это его огромный диапазон счёта. Без всяких прескалеров можно считать до почти минуты ( 2^32/F_CPU ) с разрешением 12nS Описание: таймер отсчитывает 84 мульёна тиков и сбрасывается в ноль поднимая флажок прерывания. В прерывании инвертируется состояние пина PC13, на котором висит светодиод.
Очередной примерчик для stm32F401. Преобразователь напряжение -> PWM
Напряжение 0..3,3в приходит на ADC8(PB0), в конце оцифровки DMA по отмашке АЦП подхватывает полученное значение, и кидает его в регистр сравнения таймера 4. С ноги PB6 снимается PWM сигнал частотой примерно 1кГц
На 1 кГц, и ДМА? Эдак мегагерца 3+, понятно было бы. А ШИМ на 3-х каналах, 12-битку разбить на 3-и 4-х битки и "барстом" их по дма закатать в три канала.
Я как раз сейчас мудрю такой дэдээс генератор, на 446ре хоть и есть цап, но он шумный собака, а мне -100 дБси надо. Вобщем заработало, но с прерываниями опять 25-ть какой-то. Если халовскую HAL_TIM_DMABurst_WriteStart пихаю, прерываниям кирдык,
Я таки поинтересуюсь, зачем макрос F в принтах? Какой смысл он имеет в STM? Пространство адресов линейно и не зависит от типа памяти.
Волшебник, может там в прерывании какой флажок снять надо? Я ещё прерывания DMA не пробовал. Кстати зачем оно в вашем конкретном случае?
Я ещё прерывания DMA не пробовал. Кстати зачем оно в вашем конкретном случае?
наверно банальщину скажу - но прерывания DMA в первую очередь нужны, чтобы знать, что асинхронный DMA_Transfer закончился... вот и у Волшебника тут какой-то буфер куда-то передается...
Так ента штука и должна все флаги пробить, HAL_DMA_IRQHandler(&hdma_tim1);
А вообще прерывания по дма у меня при работе с ацп, полный буфер, наполовину - какую часть буффера хапать, в реал-тайм. Ну и цап-ом тож самое, апдейтить цаповский буффер при переходе блока через "0" - глитчев избегать.
В том примере выяснилось что прерывания там ни к чему, сначала думал будет одно на блок данных, в блоке триплеты байтов для шимов - подробнее в главе 5 AN4776 Application note General-purpose timer cookbook
а оказалось что прерывания сыпятся не на уровне блока, и даже не триплета, а каждого сэмпла - идиотский таймер на каждый дма рэквест их генерит, ну стм как всегда напутала, не понятно чего.
А вообще дэдээс получился, но параметры по шумам хуже чем у встроенного цапа, проводки 20 см дюпоны как антенны, всё на ушах стоит.
а можно в Arduino IDE для stm32 как то сохранить скетч в HEX а не в BIN ?
AlexZR, обсуждаемый аддон сохраняет оба варианта.
Настройка VSCode:
Результат компиляции: undefined reference to `Serial2'
По-умолчанию объявлен только Serial1, надо объявить остальные:
Новость: сайт www.stm32duino.com поднялся.
Ну и заодно продолжу тему парочкой своих скетчей из соседнего топика.
Частотометр на stm32f030f4p6. Программа использует недокументированный 32-битный таймер.
Следующий пример для stm32f103c8t6 Генерация 4-х разных частот одним таймером. Зачем это нужно не знаю, но интересна сама возможность.
Обнаружил проблему при работе через SPI с дисплеем ST7735 .
Загружаю один и тот-же проверочный скетч в одной и той же версии ARDUINO IDE с кларковским аддоном - время вывода на дисплей через SPI -72 миллисекунды. А с STM-овским аддоном - 890 миллисекунд и хоть ты тресни, ничего не помогает :((
Дополнено: по умолчанию частота клоков дисплея в stm-овском аддоне была 2,5МГц против 18МГц в кларковском. Сделал тоже 18МГц строчкой настройки дисплея tft.setSPISpeed(18000000); стало быстрей, но всё равно раза в 3 медленней чем скорость вывода в кларковском аддоне. Оказывается на этот счёт были вопросы на гитхабе и форуме, вот например. В ответ Фредерик (автор stm-мовской библы) честно признался, цитата "Ядро Роджера является лучшим по производительности для F1 (использование DMA,...) Может быть, когда-нибудь это ядро окажется на том же уровне" Эта фраза написана в феврале 19-года, так что видимо устранение этой проблемы если и есть в его планах, то явно не в ближайших.
А тем временем аддон Роджера Кларка оказывается тоже не стоит на месте, обновляется, и что важно появилась поддержка новой платы F401ccu6 о которой говорилось во #2 посте. Так что теперь большой вопрос -стоит ли переходить на stm-овский аддон окончательно и бесповоротно? :)
Подниму тему. В тему предыдущего сообщения. Димакс, не приходилось сравнивать скорость прямой записи в порт а двух аддонах?
Экспериментально измерил, что выполнение прямой записи в регистр в кларковском аддоне:
GPIOA->regs->BRR = BIT6
занимает 10 тактов контроллера. Не могу понять, много это или нет? В СТМовском аддоне не прикидывали?
10 тактов, мне покажись, многовато, но вряд ли тут от адонов зависит. Скорее от компилятора и уровня оптимизации. Еще конвейер (prefetch unit) может свою лепту вносить.
b707, похоже на правду, не сравнивал. Но думаю что разницы не будет. Аналогичное обсуждение кстати было в теме stm32 & Arduino IDE, я там даже ассемблером ноги дёргал для эксперимента #237 там полный цикл ногодрыга прогонялся за 7 тактов МК, но это ещё без учёта предзагрузки рабочих регистров.
Какие 10 тактов?
Два такта:
Какие 10 тактов?
Два такта:
какой аддон? СТМ?
Простите, а при чем здесь аддон? Аддоны можно посравнивать когда верхние операторы используются типа ditalRead, а когда прямо пишем в порты на всех аддонах должно получиться одно и то же.
Простите, а при чем здесь аддон? Аддоны можно посравнивать когда верхние операторы используются типа ditalRead, а когда прямо пишем в порты на всех аддонах должно получиться одно и то же.
при том, что ни запись
ни вот эта
прямой записью в порт не являются. это все макросы разной степени кривизны
nik182 а вы посмотрите во что на AVR выливается команда прямой записи в порт DDRB=0 ...
Это оба варианта для аддона Кларка :) У stm-ного короче: GPIOB->BRR=
ps: Andriano не учитывал накладные расходы - запись в рабочие регистры адреса порта, и значений портов. А это как минимум ещё 3 команды по 2 такта каждая :)
ps: Andriano не учитывал накладные расходы - запись в рабочие регистры адреса порта, и значений портов. А это как минимум ещё 3 команды по 2 такта каждая :)
тогда непонятно, как у него получилось 18 МГц - выше, насколько я понимаю, дергать GPIO невозможно даже теоретически. с учетом того что частота тактирования шины freq/4
при том, что ни запись
ни вот эта
прямой записью в порт не являются. это все макросы разной степени кривизны
Вот тут Вы глубоко заблуждаетесь. Эти макросы описывают одно и тоже. Адрес регистра BRR. Как бы Вы не писали в ассемблере получите одно и тоже число, по адресу которого и будет отправлено BIT6 или 0x00001000; причём атомарно - т.е. за 1 такт:
9.1.2 Atomic bit set or reset
Эти макросы описывают одно и тоже. Адрес регистра BRR. Как бы Вы не писали в ассемблере получите одно и тоже число, по адресу которого и будет отправлено BIT6 или 0x00001000; причём атомарно - т.е. за 1 такт:
что я имел в виду - макросы могут раскрыватся как непосредственно в адрес регистра, так и в некую конструкцию, вычисляющую его значение. Как пример, макрос BIT6 и 0x00100000 это, вообще говоря. не одно и то же, поскольку BIT6 в аддоне Кларка раскрывается в конструкцию (1 << 6) . которая сама по себе требует нескольких тактов для вычисления (в отсутсвии оптимизации, конечно)
поэтому разные макросы в разных аддонах могут требовать разное число тактов...
1 << 6 это константа скорее всего ...
1 << 6 это константа скорее всего ...
это как пример
b707, ну про шину Nic182 уже сказал. Так что и выходит: 2 такта поднять лапу, 2 опустить - 72e6/4= 18MHz, но это без учёта цикла. Если он нужен, то это плюс ещё 3 такта. Ну и накладные расходы на загрузку нужных данных в рабочие регистры. По идее если нужно просто поднять лапу, то надо дать всего три команды:
По 2 такта каждая, исходя из этого да, 10 тактов многовато.
На самом деле получается медленнее, потому есть ещё такты ожидания чтения флеша процессора. Вот если цикл программы загнать в оперативную память и работать из неё то получим максимальную скорость.
спасибо всем. Сделал для себя вывод. что на самом деле 10 тактов это совсем неплохо. Ведь я проверял не дерганье ногой в цикле, а одинарное переключение пина среди другого кода, то есть все подготовительные операции занесения значений в регистры включены в этот тайминг
Пролистнул тему немного выше и, похоже, речь идет о том, с чем я столкнулся буквально на днях (т.е. почти месяцем позже, чем это было написано)
Обнаружил проблему при работе через SPI с дисплеем ST7735 .
Загружаю один и тот-же проверочный скетч в одной и той же версии ARDUINO IDE с кларковским аддоном - время вывода на дисплей через SPI -72 миллисекунды. А с STM-овским аддоном - 890 миллисекунд и хоть ты тресни, ничего не помогает :((
Если я правильно понял, речь идет не о прямой записи в порты, а об SPI, т.е. той прокладке, которая была написана для совместимости со стандартной ардуиновской библиотекой SPI. Я, правда, работал не с дисплеем, а с памятью (разрекламированной Петровичем PSRAM) и SD-картой.
Ну с картой там много всего, сектор читается что-то порядка 2.5 мс, т.е. по 5 мкс на байт, что на мой взгляд многовато. А с памятью - более прозрачно, там я взаимодействую не с драйвером SD, а напрямую с библиотекой SPI, которая, вроде бы, настроена на частоту 36 МГц, но реально работает так, как если бы было около 7 МГц. Т.е. один байт пишет/читает более 1 мкс.
Судя по логическому анализатору передача осуществляется побайтно с большим интервалом между байтами. Но это разобрать 24-МГц анализатором уже невозможно.
Собственно, я для себя сделал вывод, что нужно будет самостоятельно разбираться с STM-овским SPI, не надеясь на ардуиновскую реализацию.
Судя по логическому анализатору передача осуществляется побайтно с большим интервалом между байтами. Но это разобрать 24-МГц анализатором уже невозможно.
Я тоже смотрел spi-клоки осциллографом , и именно это наблюдал -огромные интервалы между пачками. В результате пришлось вернуться обратно на кларковский аддон..
Я все-таки придерживаюсь точки зрения, что нужно отказываться от ардуиновской библиотеки и делать обмен по SPI ручками по дэйташиту. Вполне вероятно, что при наличии DMA побайтовый обмен сделан неоптимально на уровне железа, т.к. никому не нужен при наличии DMA. Ну, точнее, скорость от него не требуется.
Кстати, на мой взгляд, SPI не так уж сложно программируется по дэйташиту, так что думаю, именно это оптимальный путь - отказ от совместимости с ардуиновской библиотекой.
Господа, расскажите кто что использует и для чего, какие успехи. Так сказать отчетик, чтобы понять куда двигаться новичку.
Если сплошные подводные камни, то может чисто под STM пытаться писать? Заранее признателен!
Господа, расскажите кто что использует и для чего, какие успехи. Так сказать отчетик, чтобы понять куда двигаться новичку.
"отчетики" я начальству пишу, а вам с какой стати? :)
тема как раз создана для сравнения аддонов - и в ней всего чуть более 50 сообщений, читайте