280 MHz миф или реальность?
На страницах сайта я уже
рассказывал,
как стартануть с нуля. Программа пишется на ассемблере
и заливается во флешку.
Однако!
У камушка есть ОЗУ общего назначения, откуда прекрасно выполняется программный код.
И я вам больше скажу - он выполняется немного быстрее, особенно когда происходит частое обращение
во FLASH за всякими константами.
Но главное не в этом.
Флешка - это хорошо. Но она довольно медленная. И к тому же, подвержена запиливанию.
А представьте, если вам захочется поправить только одну строчку в коде и тут же посмотреть результат?
А если это нужно делать очень часто?
Знаете, если вы будете лить во флешку десятки килобайт кода по нескольку раз в минуту, вам однажды это надоест. Код отлаживать лучше всего
в ОЗУ. Это значительно быстрей. А компиляция и заливка проекта в несколько десятков тысяч строк занимает доли секунд!
Поверьте, это круто, разрабатывать код в таком окружении.
Так давайте же оставим флешку в покое и перейдём полностью на ОЗУ! Кстати, код ARM по своей природе полностью переносимый.
Он не привязан к абсолютным адресам, вся адресация в нём относительная. Вы можете переносить и сдвигать исполняемый код куда угодно.
И это несомненно радует! А теперь о том, как стартануть RAM-проект с нуля! Безусловно, на ассемблере!!
Это просто. Шаг первый. Сконфигурируйте пины BOOT0/BOOT1 в состояние 11. Подтяните их оба к плюсу.
Это заставит камень после сброса стартовать с адреса 0x00000000.
Шаг второй. Возьмите
чистый проект, заточенный под флешку.
Распаковываем. Идём в папочку
exe и открываем на редактирование файл stm32.ld.
Находим в нём строчку:
ROM : ORIGIN = 0x08000000, LENGTH = 1024K
Меняем её на:
ROM : ORIGIN = 0x00000000, LENGTH = 1024K
Итак, что мы сейчас сделали: мы указали компилятору, что наш исполняемый код начинается от адреса 0x00.
Зачем мы это сделали? Только лишь с одной целью: интеловский hex формат теперь будет генерироваться под начальный адрес 0x00,
и когда вы будете заливать код в камень (очевидно, при помощи ST-Link, через командную строку) он автоматически
будет размещён в ОЗУ по адресу 0x00. Камень сбрасывается и начинается выполнение кода! Всё!
Видите, как просто. Можете ещё поправить LENGTH, если не трудно. Хотя....
А теперь сюрприз. Разгоним камень до 280 мгц. Благодаря расположению кода в ОЗУ и возможности отключить флешку,
можно разгонять камень до умопомрачительных частот! Первым делом, вам понадобится стандартный
код инициализации схемы тактирования микроконтроллера.
Этот код выводит МК на штатные 168 мгц. Маловато..
А теперь мы сделаем вот так: строку с конфигурацией PLL заменим на эту:
MOV32 R1, 4 + (280 << 6) + (((2 >> 1) -1) << 16) + RCC_PLLCFGR_PLLSRC_HSE + (7 << 24)
Фрагмент с настройкой instruction cache, data cache и wait state, состоящий из 4 строк, меняем на эти 2 строки
@ Настроить instruction cache, data cache и wait state
CLR R1
STR R1, [R2]
То есть флешку выключаем. На такой частоте, обращение к ней попросту завесит камень, и это не есть гут.
Ну вот и всё. Проверяйте. Каменюка молотит как бешеный! А если виснет, уменьшайте частоту.
Мой экземпляр STM32F407V разгонялся до 300 мгц с периодическим зависанием и на 280 мгц уже работал стабильно.
Конечно этот режим нештатный и его совместимость с периферийными модулями не проверялась.
Но если поднастроить делители системных шин, то почему бы и да?
Периферия заработает, куда она денется!
p.s. в жидкий водород опускать плату не пробовал. Запитывать камень от 4.5 вольт - то же.. И вам не советую!