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

Тактирование STM32: PLL, шины и такты ожидания

Выберите линейку STM32, генератор и нужную частоту ядра — калькулятор подберёт множители и делители PLL в пределах справочного руководства, посчитает частоты шин, таймеров, USB и АЦП, такты ожидания флеш-памяти и выдаст значения регистров RCC с кодом инициализации без HAL.

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

Справочное руководство RM0008 Rev 21

МГц
SYSCLK от
МГц

до 72 МГц у этой линейки

USB 48 МГц от PLL

Результат

SYSCLK
72 МГц
HSE ÷ 1 × 9
HCLK (ядро, AHB)
72 МГцSysTick от HCLK/8: 9 МГц
PCLK1 (APB1)
36 МГцтаймеры 72 МГц; предел 36 МГц
PCLK2 (APB2)
72 МГцтаймеры 72 МГц; предел 72 МГц
USB
48 МГцчастота для USB получена точно
ADCCLK
12 МГцPCLK2 ÷ 6, предел 14 МГц
Такты ожидания флеш-памяти
2

Цепочка тактирования

Тактирование STM32F103 (performance line): SYSCLK 72 МГцHSE8 МГцPLLXTPRE ÷ 18 МГцPLL × 972 МГцSYSCLK72 МГцAHB ÷ 172 МГцHCLK, ядроAPB1 ÷ 236 МГцтаймеры 72 МГцUSB ÷ 1,548 МГцдля USB годитсяAPB2 ÷ 172 МГцтаймеры 72 МГцADC ÷ 612 МГцне больше 14 МГц
РегистрЗначениеЧто в нём
RCC_CFGR0x001D8402делители шин, PLL и выбор SYSCLK (SW = 2)
FLASH_ACRLATENCY = 2такты ожидания флеш-памяти

Код на регистрах (CMSIS)

/* STM32F103 (performance line): SYSCLK 72 MHz, HCLK 72 MHz, PCLK1 36 MHz, PCLK2 72 MHz (RM0008 Rev 21) */
void clock_init(void)
{
    RCC->CR |= RCC_CR_HSEON;
    while (!(RCC->CR & RCC_CR_HSERDY)) {}
    /* 2 wait state(s) before raising the clock */
    FLASH->ACR = (FLASH->ACR & ~FLASH_ACR_LATENCY) | FLASH_ACR_PRFTBE | 2U;
    while ((FLASH->ACR & FLASH_ACR_LATENCY) != 2U) {}
    RCC->CFGR = 0x001D8400; /* prescalers and PLL, SYSCLK still HSI */
    RCC->CR |= RCC_CR_PLLON;
    while (!(RCC->CR & RCC_CR_PLLRDY)) {}
    RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | 2U;
    while ((RCC->CFGR & RCC_CFGR_SWS) != 0x00000008) {}
    SystemCoreClock = 72000000U;
}

Функция вызывается в начале main() или из SystemInit(), пока SYSCLK — от HSI после сброса.

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

Тактирование STM32 — цепочка от генератора до ядра и периферии: кварцевый генератор HSE или внутренний HSI, предделитель и умножитель PLL, затем шина AHB с ядром и памятью и шины APB с периферией. Неверный множитель — и ядро работает за пределами допустимой частоты, лишний такт ожидания — и программа медленнее, недостающий — и она падает. Калькулятор проверяет каждую настройку по справочному руководству своей линейки.

Коротко

  • F1: кварц 4–16 МГц, PLL ×2…×16, до 72 МГц; APB1 — до 36 МГц; для USB PLL должен дать 48 или 72 МГц.
  • F4: вход VCO 1–2 МГц (лучше 2 МГц), VCO 100–432 МГц; SYSCLK = VCO / P, USB = VCO / Q; F407 — до 168 МГц, F429 — до 180 МГц.
  • F0 и G0: до 48 и 64 МГц; у G0 SYSCLK берётся с выхода R: VCO / R.
  • Таймеры: при делителе APB больше 1 частота таймеров вдвое выше частоты шины.
  • Флеш-память: число тактов ожидания растёт с частотой, у F4 — ещё и при пониженном питании.

Как пользоваться

  1. Выберите линейку. Пределы частот и устройство PLL у них разные: STM32F103 и STM32F407 считаются по разным руководствам.
  2. Выберите генератор: HSE — кварц на плате (частоту впишите), HSI — внутренний RC-генератор. У STM32F042, F072 и F091 есть ещё HSI48.
  3. Впишите нужную частоту SYSCLK. Калькулятор переберёт все допустимые настройки PLL и покажет ближайшую частоту, а среди равных выберет ту, что даёт 48 МГц для USB и — у F4 — 2 МГц на входе VCO. Другие настройки с той же частотой собраны в таблицу под схемой.
  4. Делители шин по умолчанию — самые маленькие в пределах линейки; их можно задать вручную. У F4 выберите напряжение питания, у G0 — диапазон напряжения ядра.

Справа — частоты ядра, шин, таймеров, USB и АЦП и число тактов ожидания. Ниже — цепочка тактирования, значения регистров RCC и функция инициализации на регистрах с именами из заголовочных файлов CMSIS. Все настройки хранятся в адресе страницы — ссылкой можно поделиться.

Как устроена цепочка тактирования

После сброса STM32 работает от внутреннего генератора HSI. Чтобы разогнать ядро, программа включает кварцевый генератор HSE, настраивает PLL, увеличивает такты ожидания флеш-памяти, ждёт захвата PLL и только потом переключает на него системную частоту SYSCLK. Дальше SYSCLK делится делителем AHB — это частота HCLK ядра, памяти и DMA, — а от HCLK своими делителями тактируются шины APB.

Тактирование STM32F103 (performance line) от HSE 8 МГц: SYSCLK 72 МГцHSE8 МГцPLLXTPRE ÷ 18 МГцPLL × 972 МГцSYSCLK72 МГцAHB ÷ 172 МГцHCLK, ядроAPB1 ÷ 236 МГцтаймеры 72 МГцUSB ÷ 1,548 МГцдля USB годитсяAPB2 ÷ 172 МГцтаймеры 72 МГцADC ÷ 612 МГцне больше 14 МГц
STM32F103 от кварца 8 МГц: PLL ×9 даёт 72 МГц, APB1 делится на 2 и работает на 36 МГц, но её таймеры — на 72 МГц. Снизу — ответвления: USB берёт PLL ÷ 1,5 = 48 МГц, АЦП — PCLK2 ÷ 6 = 12 МГц.

Пределы шин и генераторов у каждой линейки свои:

ЛинейкаSYSCLK, HCLKAPB1APB2HSIКварц HSEPLLДокумент
STM32F030x4/x6/x8до 48 МГцдо 48 МГц—8 МГц4–32 МГц×2…×16RM0360 Rev 5
STM32F030xC, STM32F070до 48 МГцдо 48 МГц—8 МГц4–32 МГц×2…×16RM0360 Rev 5
STM32F031, F038, F051, F058до 48 МГцдо 48 МГц—8 МГц4–32 МГц×2…×16RM0091 Rev 10
STM32F042, F048, F072, F078, F091, F098до 48 МГцдо 48 МГц—8 МГц4–32 МГц×2…×16RM0091 Rev 10
STM32F100 (value line)до 24 МГцдо 24 МГцдо 24 МГц8 МГц4–24 МГц×2…×16RM0041 Rev 6
STM32F101 (access line)до 36 МГцдо 36 МГцдо 36 МГц8 МГц4–16 МГц×2…×16RM0008 Rev 21
STM32F102 (USB access line)до 48 МГцдо 36 МГцдо 48 МГц8 МГц4–16 МГц×2…×16RM0008 Rev 21
STM32F103 (performance line)до 72 МГцдо 36 МГцдо 72 МГц8 МГц4–16 МГц×2…×16RM0008 Rev 21
STM32F105, F107 (connectivity line)до 72 МГцдо 36 МГцдо 72 МГц8 МГц3–25 МГц×4…×9, ×6,5RM0008 Rev 21
STM32F401до 84 МГцдо 42 МГцдо 84 МГц16 МГц4–26 МГц÷M, ×N, ÷P, ÷QRM0368 Rev 6
STM32F405, F407, F415, F417до 168 МГцдо 42 МГцдо 84 МГц16 МГц4–26 МГц÷M, ×N, ÷P, ÷QRM0090 Rev 22
STM32F411до 100 МГцдо 50 МГцдо 100 МГц16 МГц4–26 МГц÷M, ×N, ÷P, ÷QRM0383 Rev 4
STM32F427, F429, F437, F439до 180 МГцдо 45 МГцдо 90 МГц16 МГц4–26 МГц÷M, ×N, ÷P, ÷QRM0090 Rev 22
STM32G031, G041, G051, G061, G071, G081, G0B1, G0C1до 64 МГцдо 64 МГц—16 МГц4–48 МГц÷M, ×N, ÷RRM0444 Rev 6
STM32G030, G050, G070, G0B0до 64 МГцдо 64 МГц—16 МГц4–48 МГц÷M, ×N, ÷RRM0454 Rev 5

PLL STM32F0 и STM32F1: умножитель

У F0 и F1 PLL — умножитель. Частота входа делится предделителем, затем умножается:

fSYSCLK=fвхPREDIV⋅PLLMUL.f_\text{SYSCLK} = \frac{f_\text{вх}}{\text{PREDIV}} \cdot \text{PLLMUL}.

Множитель PLLMUL — от 2 до 16. У STM32F101, F102 и F103 вход PLL — HSI / 2 = 4 МГц или HSE, деленный на 1 или 2 (бит PLLXTPRE), а выход ограничен 72 МГц. У F105 и F107 множители ×4…×9 и ×6,5, а HSE делится предделителем PREDIV1 от 1 до 16. У F0 выход PLL должен быть в пределах 16–48 МГц, у F100 — 16–24 МГц.

USB у STM32F102 и F103 тактируется от PLL через делитель USBPRE: ÷ 1 или ÷ 1,5. Поэтому для USB PLL должен выдавать 48 или 72 МГц — других вариантов нет. Частота АЦП делится от PCLK2 на 2, 4, 6 или 8 и не должна превышать 14 МГц: на 72 МГц наименьший подходящий делитель — 6, это 12 МГц.

PLL STM32F4: делители M, N, P и Q

У F4 PLL устроен как синтезатор частоты: вход делится на M, генератор VCO работает на частоте в N раз выше, а выходы делят её на P и Q.

fVCO=fвхM⋅N,fSYSCLK=fVCOP,fUSB=fVCOQ.f_\text{VCO} = \frac{f_\text{вх}}{M} \cdot N, \qquad f_\text{SYSCLK} = \frac{f_\text{VCO}}{P}, \qquad f_\text{USB} = \frac{f_\text{VCO}}{Q}.

Ограничения RM0090: M — от 2 до 63, а частота на входе VCO — от 1 до 2 МГц, и для меньшего джиттера рекомендовано 2 МГц; N — от 50 до 432, VCO — от 100 до 432 МГц (у F401 — от 192 МГц); P — 2, 4, 6 или 8; Q — от 2 до 15. USB OTG FS требует ровно 48 МГц, SDIO и генератор случайных чисел — не больше 48 МГц.

Тактирование STM32F405, F407, F415, F417 от HSE 8 МГц: SYSCLK 168 МГцHSE8 МГц÷ M = 42 МГцVCO × N = 168336 МГц÷ P = 2168 МГцSYSCLK168 МГцAHB ÷ 1168 МГцHCLK, ядроAPB1 ÷ 442 МГцтаймеры 84 МГц÷ Q = 748 МГцдля USB годитсяAPB2 ÷ 284 МГцтаймеры 168 МГц
STM32F407 от кварца 8 МГц: M = 4 даёт на входе VCO 2 МГц, N = 168 — VCO 336 МГц, P = 2 — SYSCLK 168 МГц, Q = 7 — ровно 48 МГц для USB. Шины: APB1 ÷ 4 = 42 МГц, APB2 ÷ 2 = 84 МГц.

Выше 168 МГц STM32F427 и F429 работают только в режиме over-drive регулятора напряжения: его включают, когда PLL уже настроен, но ещё не выбран системной частотой. STM32F411 выше 84 МГц требует масштаба регулятора scale 1. Калькулятор добавляет эти шаги в код сам.

PLL STM32G0: делители M, N и R

У G0 похожий синтезатор, но системная частота берётся с выхода R:

fPLLRCLK=fвхM⋅NR.f_\text{PLLRCLK} = \frac{f_\text{вх}}{M} \cdot \frac{N}{R}.

M — от 1 до 8, а частота после него — от 2,66 до 16 МГц; N — от 8 до 86; VCO — от 96 до 344 МГц у G0x1 (RM0444) и от 64 до 344 МГц у G0x0 (RM0454); R — от 2 до 8, выход — не больше 64 МГц. От HSI16 максимальные 64 МГц дают M = 1, N = 8, R = 2: VCO на 128 МГц. Выходы P и Q тактируют часть периферии; калькулятор ставит в них допустимые делители, но не включает их. В диапазоне Range 2 — режиме пониженного напряжения ядра — частота системы ограничена 16 МГц, а VCO — 128 МГц.

Шины и таймеры

Делители AHB — 1, 2, 4, 8, 16, 64, 128, 256 и 512, делители APB — 1, 2, 4, 8 и 16. Таймеры получают частоту своей шины APB, если её делитель равен 1, и удвоенную — при любом другом делителе. Поэтому на STM32F407 таймеры шины APB1 работают на 84 МГц при самой шине на 42 МГц, а таймеры APB2 — на 168 МГц. От частоты таймера считают предделитель и период в калькуляторе таймера, от частоты шины — делитель скорости в калькуляторе UART.

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

Флеш-память медленнее ядра: на высокой частоте процессор ждёт её несколько тактов. Число тактов ожидания задаёт поле LATENCY регистра FLASH_ACR. Мало тактов — команды читаются с ошибками, много — ядро простаивает. Таблицы — по справочным руководствам; верхняя граница каждой строки включительно.

STM32F1 (RM0008), STM32F0 (RM0091, RM0360) — от частоты SYSCLK, F100 тактов ожидания не имеет:

Такты ожидания (LATENCY)Частота
0до 24 МГц
124–48 МГц
248–72 МГц

STM32F405 и F407 (RM0090, таблица 11) — от частоты HCLK и напряжения питания:

Такты ожидания (LATENCY)2,7–3,6 В2,4–2,7 В2,1–2,4 В1,8–2,1 В
0до 30 МГцдо 24 МГцдо 22 МГцдо 20 МГц
130–60 МГц24–48 МГц22–44 МГц20–40 МГц
260–90 МГц48–72 МГц44–66 МГц40–60 МГц
390–120 МГц72–96 МГц66–88 МГц60–80 МГц
4120–150 МГц96–120 МГц88–110 МГц80–100 МГц
5150–168 МГц120–144 МГц110–132 МГц100–120 МГц
6—144–168 МГц132–154 МГц120–140 МГц
7——154–168 МГц140–160 МГц

STM32G0x1 (RM0444) — от частоты HCLK и диапазона напряжения ядра:

Такты ожидания (LATENCY)Range 1Range 2
0до 24 МГцдо 8 МГц
124–48 МГц8–16 МГц
248–64 МГц—

Такты ожидания увеличивают до перехода на высокую частоту и уменьшают только после перехода на низкую. При питании STM32F4 ниже 2,1 В буфер предвыборки должен быть выключен — в коде калькулятора он тогда не включается.

Код инициализации

Функция clock_init() повторяет порядок из справочных руководств: включает генератор и ждёт его готовности, ставит такты ожидания, записывает делители и настройки PLL, включает PLL и ждёт захвата, затем переключает SYSCLK и ждёт подтверждения в поле SWS. В конце она записывает новую частоту в переменную SystemCoreClock, от которой считают задержки и скорость интерфейсов библиотеки. Код рассчитан на запуск сразу после сброса, когда SYSCLK — от HSI, а PLL выключен.

Ограничения

  • Второй PLL STM32F105 и F107 (PLL2 и PLL3 для Ethernet и I2S) не моделируется: PREDIV1 тактируется прямо от HSE.
  • STM32F410, F412, F413, F446 и F469 и линейки F2, F3, F7, G4, H7, L0–L5 пока не поддерживаются.
  • Внешний тактовый сигнал вместо кварца (режим bypass) отдельно не рассматривается: пределы частоты HSE взяты для кварца.
  • Частоты периферии с собственным выбором источника (USART, I2C, АЦП у F0 и G0) не считаются: они задаются в регистрах выбора тактирования периферии.
  • Калькулятор не проверяет ограничения корпусов и температурных исполнений — сверяйтесь с даташитом своего микроконтроллера.

Частые вопросы

Как получить 72 МГц на STM32F103 от кварца 8 МГц?

Включите HSE и умножьте его в PLL на 9: PLLSRC = 1 (HSE), PLLXTPRE = 0 (без деления), PLLMUL = 0111. Шина APB1 не может работать быстрее 36 МГц, поэтому её делитель — 2, APB2 остаётся на 72 МГц. Флеш-памяти на 72 МГц нужно два такта ожидания (LATENCY = 2), USB получает 72 / 1,5 = 48 МГц, АЦП — 72 / 6 = 12 МГц. Регистр RCC_CFGR после переключения — 0x001D8402.

Как рассчитать PLL STM32F4 на 168 МГц?

С кварцем 8 МГц: PLLM = 4 даёт на входе VCO рекомендуемые 2 МГц, PLLN = 168 — VCO 336 МГц, PLLP = 2 — SYSCLK 168 МГц, PLLQ = 7 — ровно 48 МГц для USB, SDIO и генератора случайных чисел. APB1 делится на 4 (42 МГц), APB2 — на 2 (84 МГц). При питании 2,7–3,6 В флеш-памяти нужно 5 тактов ожидания. RCC_PLLCFGR = 0x07402A04.

Почему таймеры работают на удвоенной частоте шины APB?

Так устроено тактирование таймеров у STM32F0, F1, F4 и G0: если делитель шины APB равен 1, таймеры получают частоту шины, а при любом другом делителе — удвоенную. На STM32F103 с APB1 ÷ 2 шина работает на 36 МГц, а таймеры TIM2–TIM4 — на 72 МГц. Это нужно учитывать при расчёте предделителя и периода таймера.

Сколько тактов ожидания флеш-памяти ставить?

Это зависит от частоты — у F0 и F1 от SYSCLK, у F4 и G0 от HCLK — и, у STM32F4, от напряжения питания. STM32F1: 0 тактов до 24 МГц, 1 — до 48, 2 — до 72 МГц. STM32F0: 0 до 24 МГц, 1 до 48. STM32F407 при 2,7–3,6 В — по такту на каждые 30 МГц, 5 тактов на 168 МГц. Такты ожидания увеличивают до повышения частоты и уменьшают после её снижения.

Можно ли получить 48 МГц для USB на STM32F429 при 180 МГц?

Нет. Для 180 МГц VCO должен работать на 360 МГц с PLLP = 2 (с PLLP = 4 нужно 720 МГц, а VCO ограничен 432 МГц), а 360 не делится на 48 нацело: PLLQ = 7,5 недопустим. Если нужен USB, выберите 168 МГц: VCO 336 МГц, PLLQ = 7.

Можно ли обойтись без кварца?

Да, если не нужна точная частота: внутренний генератор HSI откалиброван на заводе с погрешностью 1 % при 25 °C, и от него можно запустить PLL. Для USB, CAN и точных интервалов времени нужен кварц. STM32F042, F072 и F091 имеют HSI48, но без подстройки системой CRS его погрешность — около 3 % при 25 °C.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — раздел RCC: кварц 4–16 МГц (3–25 МГц у F105/F107), PLL ×2…×16 с выходом до 72 МГц, AHB и APB2 до 72 МГц, APB1 до 36 МГц, АЦП до 14 МГц, USB — PLL на 48 или 72 МГц и USBPRE, биты RCC_CFGR; раздел флеш-памяти — LATENCY 0/1/2 до 24/48/72 МГц
  2. STMicroelectronics. RM0041 Rev 6. Reference manual: STM32F100xx advanced Arm-based 32-bit MCUs — кварц 4–24 МГц, AHB и обе шины APB до 24 МГц, выход PLL 16–24 МГц, PREDIV1 ÷1…16, флеш без тактов ожидания
  3. STMicroelectronics. RM0360 Rev 5. Reference manual: STM32F030x4/x6/x8/xC and STM32F070x6/xB — кварц 4–32 МГц, выход PLL 16–48 МГц, входы PLL по устройствам (PLLSRC), LATENCY 0/1 до 24/48 МГц
  4. STMicroelectronics. RM0091 Rev 10. Reference manual: STM32F0x1/STM32F0x2/STM32F0x8 — глава 6 RCC: HSI 8 МГц, HSI48 у F04x/F07x/F09x, PREDIV ÷1…16, PLL ×2…×16 с выходом 16–48 МГц, PLLSRC, коды PLLMUL, PPRE и HPRE, удвоение частоты таймеров; глава 3 — такты ожидания флеш-памяти
  5. STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — главы 6 и 7 RCC: кварц 4–26 МГц, HSI 16 МГц, PLLM 2…63 с входом VCO 1–2 МГц, PLLN 50…432, VCO 100–432 МГц, PLLP 2/4/6/8, PLLQ 2…15 для 48 МГц, пределы шин 168/84/42 и 180/90/45 МГц; таблицы 11 и 12 — такты ожидания по напряжению питания; режим over-drive для 180 МГц
  6. STMicroelectronics. RM0368 Rev 6 (STM32F401xB/C/D/E) и RM0383 Rev 4 (STM32F411xC/E) — F401: VCO 192–432 МГц, до 84 МГц, таблица 6 тактов ожидания; F411: до 100 МГц, APB1 до 50 МГц, таблица 5 тактов ожидания, масштаб регулятора VOS
  7. STMicroelectronics. RM0444 Rev 6 (STM32G0x1) и RM0454 Rev 5 (STM32G0x0) — кварц 4–48 МГц, вход PLL после ÷M 2,66–16 МГц, PLLN 8…86, VCO 96–344 МГц (у G0x0 — 64–344 МГц), PLLR 2…8 и PLLRCLK до 64 МГц, таблица 36 — пределы в Range 1 и Range 2, HSIDIV, биты RCC_PLLCFGR, такты ожидания по диапазону
  8. STMicroelectronics. STM32CubeF0, STM32CubeF1, STM32CubeF4, STM32CubeG0: шаблоны проектов (Projects/…/Templates, SystemClock_Config) — второй источник для проверки: F103 от HSI на 64 МГц, F411 на 100 МГц, F429 на 180 МГц с over-drive, F072 от HSI48 на 48 МГц, G071 на 56 МГц — делители, LATENCY и пределы совпадают с расчётом
  9. STMicroelectronics. Заголовочные файлы CMSIS: cmsis_device_f0, cmsis_device_f1, cmsis_device_f4, cmsis_device_g0 — имена регистров и битов в сгенерированном коде: RCC_CR_HSEON, RCC_CFGR_SWS, FLASH_ACR_LATENCY, PWR_CR_ODEN, RCC_PLLCFGR_PLLREN и другие
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/stm32-clock/" title="Тактирование STM32: PLL, шины и такты ожидания" 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-clock/">Тактирование STM32: PLL, шины и такты ожидания</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>

Обновлено .

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