Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье). Тут есть один нюанс, на момент написания статьи, ядро не работает на версиях среды разработки свыше 1.6.5, у меня стоит 1.6.5-r5 которую скачал тут.
Visual Code Blocks от мелкософта это просто редактор кода не привязанный к языку программирования. На какой настроишь, тот синтаксис и будет подсвечиваца да плюс канпилятор надо к нему привязать и настроить. Не знаю, что там с intellisence, а в Студии это очень удобная штучка.
ЗЫ. Студия с плагином Микро, практически тот же Code Blocks, то бишь фактически надстройка над набивайкой, которая сама всё вызывает Ардуиновское + intellisence. Я в Студии для десктопа на C# пишу, а на С++ - только под AVR. Попробовал какта на С++ desktop для Windows наваять, дак пил потом 3 дня с горя. Нету у меня диплома доктора философии, к сожалению.
в либе \Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\LiquidCrystal
подсмотрел
void LiquidCrystal::write8bits(uint8 value)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(_data_pins[i], (value >> i) & 0x01);
}
pulseEnable();
}
но это же блядство!
медленным digitalWrite() выводить в цикле 8раз побитово + множественные сдвиги . этож сколько дохрена тактов тратится,
а AVR за 1 такт выдает цельный байт в цельный порт.
как сделать то поуму, как быстро устанавливать пины , и как можно сразу байт на порт положить за 1 такт?
теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).
У вас неправильная теория... отсюда и все беды... Для 103-го... четыре такта без перехода... максимум...
очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц). Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов. Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.
спасибо за советы. ясно и понятно что никак. кроме "четыре такта без перехода... максимум.." , у меня вышло ооочень много тактов.
\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?
Ежели дёргать не бит, а цельный порт то можно ещё быстрее, но это будет не корректно по отношению к тем битам порта, которые не хотят дёргаться :) . Но можно в остальные биты писать ноль например...
очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц). Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов. Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.
спасибо за советы. ясно и понятно что никак. кроме "четыре такта без перехода... максимум.." , у меня вышло ооочень много тактов.
\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?
Нет, ну два такта на переход минимум. Т.е. логический анализатор на 24 МГц уже пропускает импульсы. На AVR такого не может быть в принципе.
По поводу экрана - по моим измерениям заливка экрана одним цветом (цвет 16-разрядный) дисплея с разрешением 320х240 может выполняться со скоростью более 115 fps (почти 18 Мб/с).
о, благодарю за содержательные ответы, то что надо!
действительно, частота дерганья пина теперь стала хорошая.
значит будем все же постигать stm32 :) .
С каморой прям в точку, как раз хотел замутить быстро сохранять картинку с камеры на микросд uhc, чтоб потом выдавать ее на дисплей nextion (понять где он в своей флэш памяти w25q256 сохранил картинки, прочитав флэш на разных по цвету картинках, и одну перезаписывать с помощью stm32 ).
// А то в ITEAD уже как 2 года назад обещали intelligent (advanshion) nextion дисплей , но решили не развиваться дальше, а тупо продавать старое, у которого типа нет и не будет возможности работать с микросд (только копировать прошивку).
А через UART передать картинку будет до 15секунд (хотя год назад они придумали ужать как-то картинку в несколько секунд , но делиться этим не хотят, и форум у них закрытый). Через их GPIO 8байт тож видимо не быстро будет (у Enhanced версий дисплеев).
Подкупает одно в этих HMI дисплеев - это графическая среда для рисования. А у nextion в частности и дешевизна среди всех остальных HMI.
Знаний, полученных от вдумчивого просмотра дизассемблированого кода хватило что б написать свой максимально оптмимизированный код, в цикле крутятся всего 3 команды.
Спасибо dimax. Наконец-то начало доходить то, что писалось мною тут как-то давненько уже. Хороший камень по бросовой цене - не продают. :)
Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)
Ну и ещё, дополню. Отсюдова: частота 48..72Мгц требует 2 такта ожидания, из которых 1 похоже "съеден" конвеером (буфер на 2 команды у СТМ, в отличии от других АРМ). То есть на боевых программах можно ожидать просадку ещё в два раза и в итого .. получаем мегу с каналом ДМА. В недостатке - значительно больший размер программы и данных (32 разряда + выравнивания), что резко снижает достоинство большего флеш и оперативы.. ровно все то, что писал раньше .. зато криков .. :)
Arhat109-2, кстати вот неплохо бы найти такую табличку как у AVR, где расписано какая команда сколько тактов выполняется. Что-то не попадалась она мне... Похоже производители не афишируют эти данные, что-б не пугать покупателей :)
Её не может быть в силу архитектуры. В зависимости от частоты работы - втыкаются такты ожидания, которые сьедаются буфером команд и конвейером предвыборки .. все как у "взрослых" :) Это ещё одна причина, почему такие камни хуже пригодны к ембедед разработке - только грамотное использование периферии по прерываниям, аппаратным возможностям и т.д. Тут "строго таймированный ногодрыг" - фактически запрещен. :)
.. и главная причина почему они не в состоянии вытеснить 8-битники. :)
хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 . хотя ткнувшись на рядом кварц 8.00003МГц кажет . Сколько у вас осцил на кварце 8.000 STM32 кажет?
Мож дело в моей плате в бутлоадере generic_boot20_pc13.bin , заливал по статье https://habr.com/post/395577/ , Разве что IDE1.8.5, и либы stm32 самые последние https://github.com/rogerclarkmelbourne/Arduino_STM32 , в менеджере плат Ard Sam Boards (32b SRM Cortex-M3) 1.6.11 тож последний (на 1.6.8 также).
вот еще быстрый код нашел
исходя из него попробуйте на ассемблерной вставке , не на PC13 посылать, а в нижний бит регистра , к примеру PB0 или PB1 , PA0.
хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 .
Боюсь, что это нормально. Вряд ли компилятор станет менять явный код на асме, значит поменял что-то ещё, что именно трудно понять, нужно очень хорошо ориентироваться в этой кухне..
Попробуйте влить готовую прошивку. Можно будет понять компмилятор это шалит, или что-то ещё. с пина С13 там должно идти 10МГц, а с пина А8 тактовая частота (72МГц). Строчку для программирования можно посмотреть с включённой опцией "показать подробный вывод при загрузке" в ArduinoIDE,
хотя ткнувшись на рядом кварц 8.00003МГц кажет . Сколько у вас осцил на кварце 8.000 STM32 кажет?
Конечно. В МК есть синтезатор частоты, который умееет умножать частоту с кварца. В данном случае умножает на 9.
slider пишет:
исходя из него попробуйте на ассемблерной вставке , не на PC13 посылать, а в нижний бит регистра , к
Без разницы какие биты дёргать, я много эксперементировал, (несколько часов) у меня с любыми вариантами было не более 8Мгц, а только тот ассемблерный код дал больше.
a5021, почему? В единице сигнал находится когда команда , поднимающая бит в BSRR уже отработала, и длительность единицы cоответссно определяться длительностью исполнения команды записи в BRR.
"str R1, [R0,0x10]" // запись в BSRR, сигнал в это время в "0"
"str R1, [R0,0x14]" //запись в BRR сигнал в это время в "1"
"B loop" // состояние в это время в "0"
Теперь понял, что вы имели ввиду. Момент, когда команда уже отработала находится на кончике стрелки. Мое же мнение, которое, впрочем, я никому не навязываю, надписи должны находиться над вертикальными линиями и идти в том порядке, что я предложил.
Спасибо dimax. Наконец-то начало доходить то, что писалось мною тут как-то давненько уже. Хороший камень по бросовой цене - не продают. :)
Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)
"Разы" можно по разному сравнивать. Вот кто и как быстрые преобразования Фурье выполняет (Mapple это и есть stm32duino).
Probelzaelo, ссылку давай
Эти платы в Китае клепают все кому не лень похоже.
... ...
Так что ничего удивительного в том что одна плата работает как и должна, а другая нет.
Платы из разных закупок чтоли?
я даже заказал Китайский "аналог" с как будто запасным функционалом от GD32
ссылку вот на это, на этот аналог от GD32
Платы из разных закупок чтоли?
я ж написал - платы от разных продавцов. Хотя может это и не важно, а просто первая плата - случайный брак.
Платы из разных закупок чтоли?
У меня как минимум из 4 разных магазинов алиэкспресса, и ещё одна у местных продаванов/перекупов за 400 рублей куплена.
я даже заказал Китайский "аналог" с как будто запасным функционалом от GD32
ссылку вот на это, на этот аналог от GD32
Таки забирай GD32F103C8T6 хотя врядли там тебя на ali забанили в поиске. datasheet .
Блаадарю.
Подскажите какой версией IDE лудше пользоваться?
лучше мелкостудию поставить с плагином для Дуино
лучше мелкостудию поставить с плагином для Дуино
Удмуртский букварь. 1898 год. («Букварь для вотскихъ дѣтей»)
не гони тогда стм32 небыло
не гони тогда стм32 небыло
тогда были неграмотные удмурты. О_О
Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье).
Тут есть один нюанс, на момент написания статьи, ядро не работает на версиях среды разработки свыше 1.6.5, у меня стоит 1.6.5-r5 которую скачал тут.Проверенна работоспособность ядра на Arduino IDE версии 1.6.9.
я про это спрашивал
изначально думал что на1.8.5 тоже не работает
но поковырялся и заработало
Visual Studio Community 2015 c плагином Visual Micro. Перед этим любую IDE от Duino
Visual Studio Community 2015 c плагином Visual Micro. Перед этим любую IDE от Duino
что-то я запутался... Visual Studio и Visual Code Studio - это одно и то же? Вроде и то, и другое советуют для разработки. Если разные - то что лучше?
Visual Code Blocks от мелкософта это просто редактор кода не привязанный к языку программирования. На какой настроишь, тот синтаксис и будет подсвечиваца да плюс канпилятор надо к нему привязать и настроить. Не знаю, что там с intellisence, а в Студии это очень удобная штучка.
ЗЫ. Студия с плагином Микро, практически тот же Code Blocks, то бишь фактически надстройка над набивайкой, которая сама всё вызывает Ардуиновское + intellisence. Я в Студии для десктопа на C# пишу, а на С++ - только под AVR. Попробовал какта на С++ desktop для Windows наваять, дак пил потом 3 дня с горя. Нету у меня диплома доктора философии, к сожалению.
Блин... теперь стало еще непонятнее... А что такое Visual Code Studio? https://code.visualstudio.com/
дадада это я перепутал. в моих сообщениях читать вместо Code Blocks - Code Studio
одной командой в сетапе SPI.setModule(2); всё само переключилось..
Сработало, спасибо за подсказку. Единственное что пришлось ещё подправить - явно указать пин CS, вместо
#define PIN_CS SS указал #define PIN_CS PB12. Работает, карту памяти видит, пишет/читает.
Добрый вечер. Подскажите как реализовать ШИМ для управления трехфазным мостовым инвертором (см. изображение).
Где-то читал что можно реализовать трехфазный ШИМ с помошью 1 таймера.
Сам толко только начинаю осваивать програмирование. Но необходимость вынуждает сразу начать с такой задачи.
Сам толко только начинаю осваивать програмирование. Но необходимость вынуждает сразу начать с такой задачи.
если совсем ничего не знаете - обратитесь в раздел "Ищу исполнителя", там сделают за деньги. Разжевывать с нуля вам никто бесплатно не станет.
Мне исполнитель не нужен, т.к. в дальнейшем планируется исследовательская работа и постоянные корректировки СПО. Нужно самому освоить.
Мне исполнитель не нужен, т.к. в дальнейшем планируется исследовательская работа и постоянные корректировки СПО. Нужно самому освоить.
https://www.google.com/search?q=stm32+таймеры
https://www.google.com/search?q=stm32+таймеры+3+фазный
https://www.google.com/search?q=stm32+таймеры+BLDC
прочитайте AN4013 App Note последний раздел. Тамвсё описано.
Вот и я блинк попробовал, бутлоадер залил через STM32-Link
Народ, подскажите по теме
беру blink , убираю delay() ,
на выходе получаю частоту 750КГц , где спрашивается 72МГц ?
теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).
пробовал как в либе gpio_write_bit(PC13,1); gpio_write_bit(33,0); ругается, видимо внутренние функции .
1. где можно посмотреть как выводить в порт быстрее чем digitalWrite() , как это у ардуино: PORTB=B00100000; PORTB=B00000000; ?
2. как выводить в порт целиком 8ми битовый байт byte на PB0..PB7 (PA0..PA7) или на 8..15 пины , и как можно вывести 2байта сразу на 16пинов 0..15 ?
в либе \Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\LiquidCrystal
подсмотрел
но это же блядство!
медленным digitalWrite() выводить в цикле 8раз побитово + множественные сдвиги . этож сколько дохрена тактов тратится,
а AVR за 1 такт выдает цельный байт в цельный порт.
как сделать то поуму, как быстро устанавливать пины , и как можно сразу байт на порт положить за 1 такт?
как сделать то поуму, как быстро устанавливать пины , и как можно сразу байт на порт положить за 1 такт?
Никак... Хотите скорость ногодрыга??? Переходите на ПИКи...
теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).
У вас неправильная теория... отсюда и все беды... Для 103-го... четыре такта без перехода... максимум...
теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).
У вас неправильная теория... отсюда и все беды... Для 103-го... четыре такта без перехода... максимум...
очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц). Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов. Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.
спасибо за советы. ясно и понятно что никак. кроме "четыре такта без перехода... максимум.." , у меня вышло ооочень много тактов.
\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?
slider, ну digitalWrite по скорости конечно далёк от идеала...
В stm-ках удобно ногодрыг делать бит-бендом, особенно учитывая, что автор библы stm32duino уже предусмотрел специальную функцию.
Ежели дёргать не бит, а цельный порт то можно ещё быстрее, но это будет не корректно по отношению к тем битам порта, которые не хотят дёргаться :) . Но можно в остальные биты писать ноль например...
Дизассемблировал вот такую функцию:
Получилось вот это:
Судя по коду
2стр - загрузка в регистр R3 адреса порта со смещением 8
3стр -скопировать в регистр r2 0x2000(13й бит) для записи в порт
4стр - записать 0x2000 в порт с адресом r3 и смещением 16
5стр- записать 0x2000 в порт с адресом r3 и смещением 20
6стр -неведомая хрень, похоже на джамп в начало.
Итого 5 команд, если правильно понял (в асме я разбираюсь на уровне "лампочкоморгатель" :)
Частота получаемая -4,5МГц. Осталось теперь понять как 5 команд выполняются за 16 системных тактов :)
two wait states, if 48 MHz < SYSCLK < 72 MHz
Там время исполнения команд может быть до 4 тактов, тут andriano недавно разбирался с этим вопросом.
очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц). Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов. Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.
спасибо за советы. ясно и понятно что никак. кроме "четыре такта без перехода... максимум.." , у меня вышло ооочень много тактов.
\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?
Нет, ну два такта на переход минимум. Т.е. логический анализатор на 24 МГц уже пропускает импульсы. На AVR такого не может быть в принципе.
По поводу экрана - по моим измерениям заливка экрана одним цветом (цвет 16-разрядный) дисплея с разрешением 320х240 может выполняться со скоростью более 115 fps (почти 18 Мб/с).
http://arduino.ru/forum/proekty/video-na-stm32duino-ov7670-stm32f103c8t6-ili9341#comment-387716
Если можете такое изобразить на AVR - вперед.
о, благодарю за содержательные ответы, то что надо!
действительно, частота дерганья пина теперь стала хорошая.
значит будем все же постигать stm32 :) .
С каморой прям в точку, как раз хотел замутить быстро сохранять картинку с камеры на микросд uhc, чтоб потом выдавать ее на дисплей nextion (понять где он в своей флэш памяти w25q256 сохранил картинки, прочитав флэш на разных по цвету картинках, и одну перезаписывать с помощью stm32 ).
// А то в ITEAD уже как 2 года назад обещали intelligent (advanshion) nextion дисплей , но решили не развиваться дальше, а тупо продавать старое, у которого типа нет и не будет возможности работать с микросд (только копировать прошивку).
А через UART передать картинку будет до 15секунд (хотя год назад они придумали ужать как-то картинку в несколько секунд , но делиться этим не хотят, и форум у них закрытый). Через их GPIO 8байт тож видимо не быстро будет (у Enhanced версий дисплеев).
Подкупает одно в этих HMI дисплеев - это графическая среда для рисования. А у nextion в частности и дешевизна среди всех остальных HMI.
Знаний, полученных от вдумчивого просмотра дизассемблированого кода хватило что б написать свой максимально оптмимизированный код, в цикле крутятся всего 3 команды.
Итоговый ногодрыг 10.264 Mhz при 72 MHz тактовой.
Судя по картинке каждая команда выполняется очень примерно по 30нС
Спасибо dimax. Наконец-то начало доходить то, что писалось мною тут как-то давненько уже. Хороший камень по бросовой цене - не продают. :)
Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)
Ну и ещё, дополню. Отсюдова: частота 48..72Мгц требует 2 такта ожидания, из которых 1 похоже "съеден" конвеером (буфер на 2 команды у СТМ, в отличии от других АРМ). То есть на боевых программах можно ожидать просадку ещё в два раза и в итого .. получаем мегу с каналом ДМА. В недостатке - значительно больший размер программы и данных (32 разряда + выравнивания), что резко снижает достоинство большего флеш и оперативы.. ровно все то, что писал раньше .. зато криков .. :)
Arhat109-2, кстати вот неплохо бы найти такую табличку как у AVR, где расписано какая команда сколько тактов выполняется. Что-то не попадалась она мне... Похоже производители не афишируют эти данные, что-б не пугать покупателей :)
Её не может быть в силу архитектуры. В зависимости от частоты работы - втыкаются такты ожидания, которые сьедаются буфером команд и конвейером предвыборки .. все как у "взрослых" :) Это ещё одна причина, почему такие камни хуже пригодны к ембедед разработке - только грамотное использование периферии по прерываниям, аппаратным возможностям и т.д. Тут "строго таймированный ногодрыг" - фактически запрещен. :)
.. и главная причина почему они не в состоянии вытеснить 8-битники. :)
хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 . хотя ткнувшись на рядом кварц 8.00003МГц кажет . Сколько у вас осцил на кварце 8.000 STM32 кажет?
Мож дело в моей плате в бутлоадере generic_boot20_pc13.bin , заливал по статье https://habr.com/post/395577/ , Разве что IDE1.8.5, и либы stm32 самые последние https://github.com/rogerclarkmelbourne/Arduino_STM32 , в менеджере плат Ard Sam Boards (32b SRM Cortex-M3) 1.6.11 тож последний (на 1.6.8 также).
вот еще быстрый код нашел
исходя из него попробуйте на ассемблерной вставке , не на PC13 посылать, а в нижний бит регистра , к примеру PB0 или PB1 , PA0.
хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 .
Боюсь, что это нормально. Вряд ли компилятор станет менять явный код на асме, значит поменял что-то ещё, что именно трудно понять, нужно очень хорошо ориентироваться в этой кухне..
Попробуйте влить готовую прошивку. Можно будет понять компмилятор это шалит, или что-то ещё. с пина С13 там должно идти 10МГц, а с пина А8 тактовая частота (72МГц). Строчку для программирования можно посмотреть с включённой опцией "показать подробный вывод при загрузке" в ArduinoIDE,
я залил вот так:
"C:\Program Files (x86)\Arduino\hardware\Arduino_STM32/tools/win/maple_upload.bat" COM6 2 1EAF:0003 r:\stm_10MHZ_pc13.bin
Конечно. В МК есть синтезатор частоты, который умееет умножать частоту с кварца. В данном случае умножает на 9.
исходя из него попробуйте на ассемблерной вставке , не на PC13 посылать, а в нижний бит регистра , к
Без разницы какие биты дёргать, я много эксперементировал, (несколько часов) у меня с любыми вариантами было не более 8Мгц, а только тот ассемблерный код дал больше.
Судя по картинке каждая команда выполняется очень примерно по 30нС
Надписи перепутаны. Слева направо они должны идти так: BSRR, BRR, LOOP.
a5021, почему? В единице сигнал находится когда команда , поднимающая бит в BSRR уже отработала, и длительность единицы cоответссно определяться длительностью исполнения команды записи в BRR.
Теперь понял, что вы имели ввиду. Момент, когда команда уже отработала находится на кончике стрелки. Мое же мнение, которое, впрочем, я никому не навязываю, надписи должны находиться над вертикальными линиями и идти в том порядке, что я предложил.
Снизил тактовую до 16МГц, ногодрыг стал очень странным:
Полный цикл чётко чередуется то 4 то 5 тактов МК , не представляю как это можно объяснить, ведь команд по прежнему 3 .. :-\
По хорошему надо вот так сделать: FLASH->ACR = 0; Вышеназванный буфер выключить и число циклов ожидания сократить до нуля.
Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)
"Разы" можно по разному сравнивать. Вот кто и как быстрые преобразования Фурье выполняет (Mapple это и есть stm32duino).
До 65 раз доходит.
Это как раз то, что описал выше и почему невозможно фикс. тактирование команд.