Перейти к содержанию

Такты ожидания флеш-памяти STM32 (LATENCY)

Выберите линейку STM32, напряжение питания или диапазон и частоту — калькулятор найдёт число тактов ожидания флеш-памяти по таблице справочного руководства, покажет всю таблицу и выдаст строку для FLASH_ACR.

Исходные данные

RM0090 Rev 22

МГц

Результат

LATENCY
5
5 тактов ожидания: HCLK больше 150 и до 168 МГц
Предел этой строки таблицы
168 МГцHCLK, RM0090 Rev 22
LATENCYHCLK, МГц
0до 30
1больше 30, до 60
2больше 60, до 90
3больше 90, до 120
4больше 120, до 150
5больше 150, до 168

Код на C с именами CMSIS

/* 5 wait state(s): before raising HCLK */
FLASH->ACR = (FLASH->ACR & ~FLASH_ACR_LATENCY) | FLASH_ACR_PRFTEN | 5U;
while ((FLASH->ACR & FLASH_ACR_LATENCY) != 5U) {}

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Флеш-память 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.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — раздел 3.3.3, регистр FLASH_ACR: 0 тактов до 24 МГц, 1 — до 48 МГц, 2 — до 72 МГц SYSCLK
  2. STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — таблицы 11 и 12 — такты ожидания по HCLK для четырёх диапазонов питания, у 1,8–2,1 В — «Prefetch OFF»
  3. STMicroelectronics. RM0368 Rev 6 (STM32F401xB/C/D/E) и RM0383 Rev 4 (STM32F411xC/E) — таблицы тактов ожидания F401 (до 84 МГц) и F411 (до 100 МГц) по питанию
  4. STMicroelectronics. RM0091 Rev 10 (STM32F0x1/x2/x8) и RM0360 Rev 5 (STM32F030/F070) — LATENCY 0 до 24 МГц и 1 до 48 МГц
  5. 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)
  6. STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — такты ожидания в Range 1 и Range 2
  7. STMicroelectronics. RM0351 Rev 11, RM0394 Rev 5 (STM32L4) и RM0432 Rev 9 (STM32L4+) — такты ожидания по диапазону напряжения ядра: Range 1, Range 2, у L4+ ещё Range 1 boost до 120 МГц
  8. 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>

Обновлено .

Нашли ошибку в расчёте?