Флеш-память STM32 медленнее ядра: при высокой частоте чтение команды не успевает за один такт, и контроллер флеш-памяти вставляет такты ожидания. Их число задаёт поле LATENCY регистра FLASH_ACR, а нужное значение берут из таблицы справочного руководства — по частоте и по напряжению питания.
От чего зависит число тактов
У STM32F0 и STM32F1 таблица считается по системной частоте SYSCLK, у STM32F3 (кроме F37x), F4, G0 и L4 — по частоте шины AHB, HCLK. Поэтому у STM32F4 делитель AHB уменьшает число тактов ожидания, а у STM32F1 — нет.
У STM32F4 таблица зависит от напряжения питания: чем оно ниже, тем медленнее флеш-память. У STM32F407 на 168 МГц нужно 5 тактов при 2,7–3,6 В и 7 тактов при 2,1–2,4 В. При питании 1,8–2,1 В таблицы RM0090 требуют выключенную предвыборку. У G0 и L4 вместо напряжения питания важен диапазон напряжения ядра: Range 1 — для высокой частоты, Range 2 — экономичный, у L4+ есть ещё Range 1 boost до 120 МГц.
Предвыборка и кэш
Такты ожидания замедляют линейный код меньше, чем кажется: у STM32F1 буфер предвыборки (PRFTBE) читает флеш-память широкими словами заранее, у STM32F4 ускоритель ART добавляет предвыборку (PRFTEN) и кэши команд и данных (ICEN, DCEN). Калькулятор пишет бит предвыборки вместе с LATENCY так же, как калькулятор тактирования; кэши STM32F4 включают отдельно.
Порядок при разгоне: сначала LATENCY, затем проверка записи, затем переключение частоты. Полную настройку PLL, шин и флеш-памяти сразу считает калькулятор тактирования STM32; поля FLASH_ACR STM32F4 разобраны на странице регистров FLASH.
Частые вопросы
Сколько тактов ожидания нужно STM32F103 на 72 МГц?
Два: по RM0008 LATENCY = 2 нужно, если 48 МГц < SYSCLK ≤ 72 МГц. До 24 МГц тактов ожидания не нужно, от 24 до 48 МГц — один.
Сколько тактов ожидания у STM32F407 на 168 МГц?
При питании 2,7–3,6 В — пять (таблица 11 RM0090), при 2,4–2,7 В — шесть, при 2,1–2,4 В — семь. При 1,8–2,1 В наибольшая частота — 160 МГц и предвыборку нужно выключить.
Когда менять LATENCY — до или после смены частоты?
Перед повышением частоты — сначала увеличить LATENCY и прочитать регистр обратно, чтобы убедиться, что значение записано, и только потом переключать SYSCLK на PLL. При понижении частоты — наоборот: сначала частота, потом LATENCY.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — раздел 3.3.3, регистр FLASH_ACR: 0 тактов до 24 МГц, 1 — до 48 МГц, 2 — до 72 МГц SYSCLK
- STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — таблицы 11 и 12 — такты ожидания по HCLK для четырёх диапазонов питания, у 1,8–2,1 В — «Prefetch OFF»
- STMicroelectronics. RM0368 Rev 6 (STM32F401xB/C/D/E) и RM0383 Rev 4 (STM32F411xC/E) — таблицы тактов ожидания F401 (до 84 МГц) и F411 (до 100 МГц) по питанию
- STMicroelectronics. RM0091 Rev 10 (STM32F0x1/x2/x8) и RM0360 Rev 5 (STM32F030/F070) — LATENCY 0 до 24 МГц и 1 до 48 МГц
- STMicroelectronics. RM0316 Rev 10, RM0365 Rev 8, RM0366 Rev 5, RM0364 Rev 4, RM0313 Rev 7 (STM32F3) — 0, 1, 2 такта до 24, 48, 72 МГц по HCLK; у F37x — по SYSCLK (RM0313)
- STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — такты ожидания в Range 1 и Range 2
- STMicroelectronics. RM0351 Rev 11, RM0394 Rev 5 (STM32L4) и RM0432 Rev 9 (STM32L4+) — такты ожидания по диапазону напряжения ядра: Range 1, Range 2, у L4+ ещё Range 1 boost до 120 МГц
- STMicroelectronics. STM32CubeF1, STM32CubeF4, STM32CubeL4: шаблоны проектов (SystemClock_Config) — второй источник для тестов: FLASH_LATENCY_2 у F103 на 72 МГц, FLASH_LATENCY_5 у F407 на 168 МГц и F429 на 180 МГц, FLASH_LATENCY_3 у F411 на 100 МГц, FLASH_LATENCY_4 у L4 на 80 МГц
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/stm32-flash-latency/" title="Такты ожидания флеш-памяти STM32 (LATENCY)" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/stm32-flash-latency/">Такты ожидания флеш-памяти STM32 (LATENCY)</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?