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 вольт - то же.. И вам не советую!