Разгоняем микроконтроллер. Как я выжал 620 МГц из совместимой с Arduino платы

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

Решившись на разгон, ты тут же столкнешься с двумя основными проблемами. Во-первых, нужно как-то вывести железо за штатный режим работы и при этом сохранить стабильность. Во-вторых, полученный прирост производительности предстоит еще чем-то замерить, чтобы оценить реальную пользу от всех ухищрений.

Конечно, если речь идет о разгоне игрового ПК, то зачастую все тривиально. Многие производители процессоров и видеокарт выпускают собственные утилиты для повышения напряжения и тактовых частот, так что в итоге все сводится к перемещению ползунков в окошке программы. После чего остается только запустить встроенный в игру бенчмарк и наблюдать рост циферок (FPS имеет значение, ага).

Но задумывался ли ты, как это все работает на самом деле? И что нужно знать, чтобы достичь по-настоящему выдающихся результатов? Попробую продемонстрировать на примере.

Аппаратная часть

Низкоуровневый разгон железа проще всего будет показать на обычном микроконтроллере. Наверняка ты знаком с Arduino — эта крохотная плата перевернула мир мейкеров, хакеров и всех сопричастных. В ней минимум компонентов: кварцевый резонатор, микросхема ATmega328P и регулятор питания. И все же это почти компьютер. А значит, ее тоже можно разогнать!

Однако сегодня я настроен на максимальный результат, и какие-то жалкие 16 МГц тактовой частоты меня совершенно не интересуют. Отложим Arduino в сторонку и возьмем плату Nucleo-144 на основе STM32H743.

Если пытаться подобрать подходящую аналогию из мира персональных компьютеров, то перед нами Core i9, вне всяких сомнений. Ядро ARM (Cortex-M7) тут работает на ошеломительной частоте 480 МГц — это ровно в 15 раз быстрее оригинальной Arduino Uno. Мало того, здесь размещено два мегабайта постоянной флеш-памяти и целый мегабайт ОЗУ. Производительности добавляет кеш программ и кеш данных (по 16 Кбайт), а также встроенный ускоритель исполнения кода ART.

Сегодня существуют две версии такой отладочной платы. Изначально в модельной линейке Nucleo-144 появилась H743ZI с программатором ST-Link V2-1 и микроконтроллером ревизии Y. Она поддерживала штатную работу «всего лишь» на 400 МГц. Но уже через несколько месяцев производитель сумел оптимизировать схему кристалла и начал выпускать микроконтроллеры Н7 новой ревизии V с базовой частотой в 480 МГц. Именно они легли в основу платы H743ZI2. Кроме того, обновили и программатор — теперь это ST-Link V3E с возможностью внутрисхемной эмуляции.


Так что, если будешь выбирать себе такую же плату, будь предельно внимателен, внешне они очень похожи и выполнены на одинаково белом текстолите. Да и по другим параметрам особых отличий нет: разъемы Arduino, Morpho, Ethernet и интерфейс USB присутствуют на обеих платах.

Новая IDE

Даже очень хорошее железо может оказаться бесполезным, если для него не будет подходящего ПО. К счастью, это понимают и в компании ST Microelectronics, поэтому сравнительно недавно там сделали собственную CubeIDE. Однако совсем новой ее назвать трудно. По сути, это надстройка над Eclipse, что может обрадовать пользователей, знакомых со средами Atollic TrueStudio и AC6 Workbench.

Интегрированная среда разработки не только бесплатна и доступна на всех основных платформах (поддерживаются Windows, Linux и macOS), но еще и позволяет «из коробки» пользоваться современными средствами отладки и трассировки (OpenOCD, GDB), а также настраивать периферию микроконтроллера буквально в пару кликов мыши.

WARNING

При попытке отладки приложения на H743ZI2 среда будет настойчиво требовать обновить ST-Link до «актуальной версии». Делать этого ни в коем случае не стоит, по крайней мере если не хочешь откатить прошивку самого программатора до доисторической версии. Действительно актуальное обновление ты сможешь накатить только при помощи ST-Link Utility.

После установки и настройки тулчейна можно переходить к тестированию. Нам предстоит портировать исходные коды бенчмарков на нашу архитектуру и реализовать пару платформенно зависимых функций. Так как операционная система в данном случае совершенно не обязательна, нужно будет переопределить функцию printf для вывода отладочной информации и функцию текущего времени — для расчета результата тестов.

WWW

Если тебе больше по душе Arduino IDE, ты можешь сделать проект в ней. Начиная с версии 1.6.0 в пакет stm32duino была добавлена поддержка платы H743ZI2. Зайди на GitHub разработчиков и далее следуй инструкциям в описании, чтобы добавить ссылку для менеджера пакетов.

Настраиваем проект

После создания проекта для отладочной платы Nucleo-H743ZI2 нам нужно изменить несколько настроек по умолчанию.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Александр Бурага: Инженер-конструктор радиоэлектронной техники. С вниманием следит за прогрессом IoT и носимой электроники.

Комментарии (3)

  • Здравствуйте! После прочтения статьи возникло несколько вопросов.

    Во-первых, почему не стали выводить SYSCLK напрямую наружу через MCO2? Можно было бы оценить есть там 620 МГц или нет.
    А во-вторых, частоту работы периферии тоже разгоняли или оставили в разрешенных рамках? Какие значения получились на HPRE и APB1 peripheral clock (да, я знаю что нужна частота не APB1, а та что идёт с неё на таймеры)? Просто в статье не приведены значения HPRE Prescaler и D2PPRE2 и не понятно от какой частоты в итоге работал TIM2. Если предположить, что таймер TIM2 реально отсчитывал по одной микросекунде, то тогда оба эти делителя должны были равны быть 2. И получается 310 МГц на HPRE и 155 МГц на APB1 при разрешённой "120 MHz (max)". Периферии то не плохело? И как быть если действительно надо будет работать с периферией на APB1 (uart-ы, spi, и в особенности ацп/цап)?

    • Спасибо за вопросы!
      Постараюсь коротко ответить.

      1. Выход тактовой частоты ядра, действительно, можно было сделать через MCO2, однако под рукой не было измерительных приборов, способных работать на такой частоте (логический анализатор рассчитан максимум на 400 МГц). Корректность настроек периода таймера TIM2 (который использовался для замера временных интервалов выполнения тестов) проверялась косвенно (перед настройкой каждого коэффициента PLL прогонялась тестовая программа, обеспечивающая мерцание светодиода с частотой 1 Гц, отклонение от номинала в данном случае составляло доли процента). Кроме того, изначально планировалось дублировать измерение времени встроенным RTC, тактирующимся внутренне (увеличив количество тестов испытаний), однако его разрешение по времени меня не устроило.

      2. Т.к. в целом интересовал разгон непосредственно ядра (периферия никак не влияет на скорость выполнения тестов), делительно HPRE = 4, делитель APB для таймера был равен 2, т.е. частоты по шинам периферии не выходили за разрешенный диапазон. (Хотя в рамках тестовых прогонов осуществлялась проверка и с HPRE = 2, принципиальной разницы не обнаружено).
      Методически наиболее верным был бы замер времени сторонним устройством (с термокомпенсацией и высокого класса точности). В целом, интересовали скорее относительные результаты по приросту "количества попугаев" в бенчмарках.

      Более того, скорее всего есть возможность получить еще немного более высокие результаты в тестах, при использовании внешнего напряжения питания ядра Vcore = 1.4V (максимально разрешенное по спецификации) и использовании микроконтроллеров в корпусе BGA (в связи с меньшей длиной межсоединений внутри корпуса).

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

    • Поправочка. На APB1 есть только ЦАП