Часы реального времени STM32 считают время от отдельного генератора: часового кварца LSE на 32 768 Гц, внутреннего RC-генератора LSI или делённой частоты HSE. Чтобы календарь получил ровно 1 Гц, частоту RTCCLK делят двумя делителями, а ошибку кварца исправляют цифровой калибровкой. У STM32F1 устройство другое — 20-битный делитель PRL и 32-битный счётчик секунд, — калькулятор умеет и его.
Коротко
- Новый RTC: ck_spre = f_RTCCLK / ((PREDIV_A + 1)(PREDIV_S + 1)); PREDIV_A 7 бит, PREDIV_S 15 бит (у F2 и L1 кат. 1 — 13 бит).
- По умолчанию: 127 и 255, RTC_PRER = 0x007F00FF — 1 Гц от LSE 32 768 Гц.
- Гладкая калибровка: от −487,1 до +488,5 ppm шагом 0,954 ppm, регистр RTC_CALR (CALP, CALM, окно 32/16/8 с).
- STM32F1: f = f_RTCCLK / (PRL + 1), PRL = 0x7FFF; калибровка CAL только замедляет, 0…121 ppm.
- Уход: 1 ppm — 86,4 мс в сутки, 2,59 с в месяц.
Как считаются делители
Асинхронный делитель на 1…128 тактирует счётчик долей секунды RTC_SSR, синхронный на 1…32 768 делает из этого 1 Гц для календаря (RM0090, раздел 26.3.1; RM0444, раздел 30.3.4):
Общий коэффициент — от 1 до 2²², поэтому на вход годится частота до 4,19 МГц. Справочные руководства советуют брать PREDIV_A как можно больше: синхронный делитель тогда тактируется медленнее и часы потребляют меньше. Калькулятор перебирает все PREDIV_A от 127 вниз и ставит первой точную пару с наибольшим PREDIV_A, но не меньше 3. Если такой нет — например, у измеренной частоты LSI 32 003 Гц, — он оставляет большой PREDIV_A (127/249, ошибка +93,75 ppm) и сразу даёт CALP/CALM, которые эту ошибку уберут. Пары с PREDIV_A меньше 3 — у любой целой частоты до 32 768 Гц есть «точная» пара 0/(f − 1) — показываются только как варианты: они дороже по потреблению, и при них не работает бит CALP.
Шаг долей секунды равен 1/(PREDIV_S + 1) секунды: 3,9 мс при 127/255 и 30,52 мкс при PREDIV_S = 0x7FFF (RM0444, раздел 30.3.11). Значение RTC_PRER = (PREDIV_A << 16) | PREDIV_S пишут в режиме инициализации двумя записями: сначала PREDIV_S, затем PREDIV_A — так требует RM0090 и так делает HAL_RTC_Init.
Пример: кварц 32 768 Гц
32 768 = 2¹⁵, точные пары — 127/255, 63/511, 31/1023 и так далее до 0/32767. Первая даёт ck_apre = 256 Гц и шаг долей секунды 3,9 мс, последняя — 32 768 Гц и 30,5 мкс ценой большего потребления.
Типичные значения для 1 Гц
| RTCCLK | PREDIV_A | PREDIV_S | RTC_PRER | Источник |
|---|---|---|---|---|
| LSE 32 768 Гц | 127 | 255 | 0x007F00FF | AN3371 табл. 3, AN4759 табл. 7 |
| HSE_RTC 1 МГц | 124 | 7999 | 0x007C1F3F | там же |
| LSI 32 кГц (F4; G0 — 32 кГц ±5 %) | 127 | 249 | 0x007F00F9 | там же |
| LSI 37 кГц (L1) | 124 | 295 | 0x007C0127 | там же |
| LSI 40 кГц (F0, F3) | 124 | 319 | 0x007C013F | расчёт: 125 × 320 = 40 000 |
В таблице 7 AN4759 для LSI 40 кГц напечатано 127/311, но 128 × 312 = 39 936: календарь с такими делителями спешит на 1602 ppm, на 2,3 минуты в сутки. Точная пара — 124/319.
Источник RTCCLK выбирают поля RTCSEL в RCC; выбор нельзя поменять без сброса резервного домена. Делитель HSE у серий разный: у STM32F1 — ÷128, у STM32G0 — ÷32, у STM32F4 — RTCPRE от 2 до 31, и RM0090 требует, чтобы на RTC приходил ровно 1 МГц. Частоту ядра и шин считает калькулятор тактирования STM32.
Гладкая калибровка
Кварц на 32 768 Гц обычно ошибается на ±10…20 ppm, к тому же частота зависит от температуры и нагрузочных конденсаторов (их подбирает калькулятор ёмкостей кварца). Гладкая калибровка исправляет ошибку цифровым способом: за цикл из 2²⁰ тактов (32 с при 32 768 Гц) она маскирует CALM импульсов и, если установлен CALP, добавляет 512. Частота после калибровки (RM0090, раздел 26.3.11):
Отсюда обратная задача: если часы спешат на ε, нужно 512·CALP − CALM = −ε · 2²⁰. Пределы: CALP = 1, CALM = 0 — +488,5 ppm; CALP = 0, CALM = 511 — −487,1 ppm; шаг — 0,954 ppm. Окна 16 и 8 с ускоряют проверку, но огрубляют шаг: при CALW16 бит CALM[0] всегда 0, при CALW8 — биты CALM[1:0], и остаток ошибки растёт с 0,477 до 0,954 и 1,907 ppm. Чуть сужается и диапазон: при окне 8 с CALM не больше 508, и спешащие часы исправляются до +486,4 ppm вместо +487,8 ppm при окне 32 с.
Пример: часы спешат на 20 ppm
ε · 2²⁰ = 20 × 1,048576 = 20,97, значит CALP = 0, CALM = 21, RTC_CALR = 0x00000015. Поправка −20,03 ppm, остаток −0,03 ppm — вместо ухода на 1,73 с в сутки часы ошибаются на 2 мс. Если часы отстают на 20 ppm: CALP = 1, CALM = 512 − 21 = 491, RTC_CALR = 0x000081EB.
Ошибку измеряют на выходе CALIB: 512 Гц — это RTCCLK/64 при PREDIV_A = 127, 1 Гц — ck_spre. Какой из них показывает результат гладкой калибровки, зависит от серии (AN3371, раздел 1.4.2), поэтому исходную ошибку надёжнее мерить при RTC_CALR = 0. Чтобы погрешность измерения не превысила половины шага, 1 Гц меряют ровно 32 с — длину цикла калибровки (RM0090). У STM32F2 и STM32L1 категории 1 выхода 1 Гц нет (AN4759, таблица 4). Можно и проще: заметить, на сколько секунд часы убежали за несколько суток, — калькулятор пересчитает это в ppm. RTC_CALR меняют на ходу: дождаться RECALPF = 0 и записать регистр одной записью — следующая запись, пока RECALPF = 1, не пройдёт.
Бит CALP работает только при PREDIV_A ≥ 3. При меньшем PREDIV_A RM0090 советует укоротить секунду на 8 тактов (PREDIV_S = 16379 вместо 16383 при PREDIV_A = 1, 32759 вместо 32767 при PREDIV_A = 0) и калибровать одним CALM, где CALM = 256 означает нулевую поправку. Гладкой калибровки нет у STM32F2 и STM32L1 категории 1 (AN4759, таблица 4) — у них только грубая RTC_CALIBR с шагом +4 и −2 ppm, которая есть ещё у F4 и L1.
RTC STM32F1
У STM32F1 RTC — 32-битный счётчик RTC_CNT, который увеличивается с частотой TR_CLK (RM0008, раздел 18.4):
Для кварца 32 768 Гц PRL = 0x7FFF, для LSI 40 кГц — 39 999, для HSE 8 МГц / 128 = 62 500 Гц — 62 499. PRL записывают в регистры RTC_PRLH и RTC_PRLL в режиме настройки: дождаться RTOFF = 1, установить CNF, записать, сбросить CNF и снова дождаться RTOFF. Назначение битов — на странице регистров RTC и BKP STM32F1.
Калибровка — поле CAL[6:0] регистра BKP_RTCCR: из каждых 2²⁰ тактов выбрасывается CAL, частота падает на CAL × 0,954 ppm, до 121 ppm. Ускорить часы так нельзя, поэтому для медленного кварца калькулятор, как советует AN2604, уменьшает PRL — часы начинают немного спешить — и подбирает CAL уже для них.
Пример из AN2604
На выводе TAMPER измерено 511,982 Гц при номинале 511,968 Гц (делитель 32 766): ошибка 27,35 ppm. AN2604 берёт CAL = 28 по таблице, округлённой до целых ppm, и остаётся 0,65 ppm — около 1,7 с в месяц. По точному шагу ближе CAL = 29: остаток −0,31 ppm. Заметим, что точный номинал — 32 766/64 = 511,96875 Гц, и с ним ошибка 25,88 ppm; калькулятор в режиме «Частота» считает номинал как (PRL + 1)/64.
Ошибки и уход часов
| Ошибка | В сутки | В месяц (30 сут) | В год |
|---|---|---|---|
| 1 ppm | 86,4 мс | 2,59 с | 31,5 с |
| 0,954 ppm (шаг калибровки) | 82 мс | 2,47 с | 30 с |
| 10 ppm | 0,86 с | 26 с | 5,3 мин |
| 20 ppm | 1,73 с | 52 с | 10,5 мин |
| 50 ppm | 4,32 с | 2,2 мин | 26 мин |
Типичные ошибки
- Часы от LSI. LSI — RC-генератор с разбросом в десятки процентов: у STM32F407 по даташиту от 17 до 47 кГц. Для календаря он не годится (AN3371); его частоту можно измерить таймером и подставить в калькулятор как свою. У STM32F1 для этого есть вход TIM5 только у high-density, XL-density и connectivity line (RM0008, раздел 7.2.5).
- Одна запись в RTC_PRER. RM0090 требует двух записей: сначала PREDIV_S, затем PREDIV_A.
- Калибровка через 1 Гц при включённой калибровке. Выход 1 Гц уже откалиброван — меряйте при RTC_CALR = 0 или используйте 512 Гц.
- CALP при малом PREDIV_A. При PREDIV_A < 3 бит игнорируется, и часы только замедляются.
- Калибровка «на всякий случай» по таблице. Ошибка кварца зависит от температуры: по AN2604 кварц с +27 ppm при 25 °C при 40 °C ошибается уже на +18 ppm. Калибруйте при рабочей температуре.
Часы обычно живут от батарейки VBAT — ток RTC входит в расчёт срока службы батареи. Про сторожевые таймеры, которым тоже нужен LSI, — калькулятор IWDG и WWDG.
Частые вопросы
Какие PREDIV_A и PREDIV_S нужны для кварца 32 768 Гц?
PREDIV_A = 127 и PREDIV_S = 255: 128 × 256 = 32 768, ck_spre ровно 1 Гц, RTC_PRER = 0x007F00FF. Это значения после сброса, их приводят RM0090, RM0444 и таблицы AN3371 и AN4759. Шаг долей секунды в RTC_SSR — 1/256 с, около 3,9 мс.
Почему PREDIV_A лучше делать большим?
Асинхронный делитель работает на частоте RTCCLK, синхронный — на частоте ck_apre после него. Чем больше PREDIV_A, тем медленнее тактируется синхронный делитель и тем меньше потребляет RTC — так советуют RM0090 и RM0444. Обратная сторона — грубее шаг долей секунды: при 127/255 он 3,9 мс, при 0/32767 — 30,5 мкс.
Как пересчитать ошибку часов в CALP и CALM?
Если часы спешат на ε, нужно 512·CALP − CALM = −ε·2²⁰. Для спешащих часов CALP = 0 и CALM ≈ ε × 1,048576 (ε в ppm): при +20 ppm CALM = 21. Для отстающих CALP = 1 и CALM = 512 − |ε| × 1,048576: при −20 ppm CALM = 491, RTC_CALR = 0x000081EB.
На сколько уходят часы с ошибкой 20 ppm?
1 ppm — это 86,4 мс в сутки и 2,59 с в месяц из 30 суток. Ошибка 20 ppm даёт 1,73 с в сутки, около 52 с в месяц и почти 11 минут в год.
Как откалибровать RTC STM32F103?
У STM32F1 калибровка одна: поле CAL[6:0] регистра BKP_RTCCR выбрасывает CAL импульсов из каждых 2²⁰ и замедляет часы на 0…121 ppm шагом 0,954 ppm. Ускорить часы оно не может, поэтому для медленного кварца AN2604 советует уменьшить делитель — записать в PRL 32 765 вместо 32 767 — и уже потом замедлять часы через CAL.
Источники
- STMicroelectronics. RM0090 Rev 22. Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — 26.3.1 — делители PREDIV_A и PREDIV_S, рекомендация большого PREDIV_A, деление до 2²²; 26.3.10 — грубая калибровка; 26.3.11 — гладкая калибровка, формула F_CAL, окна 32/16/8 с, случай PREDIV_A < 3; 26.3.14 — выход CALIB; регистры RTC_PRER (сброс 0x007F00FF) и RTC_CALR; RCC_CFGR RTCPRE — HSE/2…31, на RTC 1 МГц
- STMicroelectronics. RM0444 Rev 6. Reference manual: STM32G0x1 — 30.3.4 — делители; 30.3.11 — шаг долей секунды 1/(PREDIV_S + 1), 30,52 мкс при PREDIV_S = 0x7FFF; 30.3.13 — гладкая калибровка; RTC_ICSR, RTC_PRER, RTC_CALR; RCC — HSE/32, LSI 32 кГц
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — гл. 18 — RTC: f_TR_CLK = f_RTCCLK/(PRL + 1), PRLL = 0x7FFF для 32,768 кГц, режим CNF и флаг RTOFF; 6.4.2 — BKP_RTCCR: CAL замедляет на 0…121 ppm, CCO выводит RTCCLK/64; 7.2.8 — HSE/128
- STMicroelectronics. AN3371 Rev 5 (сентябрь 2012). Using the hardware real-time clock (RTC) in STM32 F0, F2, F3, F4 and L1 series of MCUs — таблица 3 — делители для 1 Гц от HSE 1 МГц, LSE, LSI 32 и 37 кГц (эталон тестов); 1.4.2 — гладкая калибровка и примеры маскирования импульсов
- STMicroelectronics. AN4759 Rev 11 (февраль 2026). Using the hardware real-time clock (RTC) and the tamper management unit (TAMP) with STM32 microcontrollers — таблица 3 — типы RTC2 и RTC3 по сериям; таблицы 4 и 5 — 13-битный PREDIV_S и отсутствие гладкой калибровки у F2 и L1 кат. 1; таблица 7 — делители для 1 Гц (строка LSI 40 кГц с ошибкой)
- STMicroelectronics. AN2604 Rev 1 (август 2007). STM32F101xx and STM32F103xx RTC calibration — таблица 1 — CAL в ppm и секундах за месяц из 30 суток (эталон тестов); пример 511,982 Гц; совет уменьшить делитель до 32 766 для медленного кварца; пересчёт ошибки на рабочую температуру
- STMicroelectronics. DS5319 Rev 20, DS8626 Rev 12, DS12232 Rev 5 — даташиты STM32F103x8/xB, STM32F405/407, STM32G071 — LSI: 30…40…60 кГц (F103), 17…32…47 кГц (F407), 32 кГц ±5 % (G071)
- STMicroelectronics. STM32CubeF1, STM32CubeF4, STM32CubeG0 HAL и LL (stm32f1xx/f4xx/g0xx-hal-driver) — HAL_RTC_Init пишет RTC_PRER двумя записями; у F1 RTC_AUTO_1_SECOND даёт PRL = f − 1; HAL_RTCEx_SetSmoothCalib, LL_RTC_Init, макросы RCC_RTCCLKSOURCE_* — имена в генераторе кода
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/stm32-rtc/" title="Часы RTC STM32: делители и калибровка" 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-rtc/">Часы RTC STM32: делители и калибровка</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>Обновлено .
Нашли ошибку в расчёте?