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

Почему не запускается кварц LSE 32,768 кГц на STM32L0?

Обновлено Редакция GAW

Часовой кварц у STM32L0 питает RTC и может тактировать LPUART и LPTIM. Генератор LSE экономичный, поэтому его усиление невелико и подбор кварца критичнее, чем у быстрого HSE. Но прежде чем менять кварц, проверьте программную сторону.

Шаг 1: доступ к домену RTC

Биты LSEON, LSEDRV, RTCSEL и RTCEN в RCC_CSR защищены от записи. Пока в PWR_CR не стоит бит DBP, запись в них молча игнорируется — и кажется, что генератор не стартует.

// Enable LSE on STM32L0 (RM0377, 6.4.1, 7.3.20)
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_DBP;                     // unlock the RTC domain
RCC->CSR = (RCC->CSR & ~RCC_CSR_LSEDRV) | RCC_CSR_LSEDRV_1;  // medium high drive in one write;
                                           // never write 00: it locks LSEDRV until POR/RTC reset
RCC->CSR |= RCC_CSR_LSEON;
while (!(RCC->CSR & RCC_CSR_LSERDY)) { }   // add a timeout in real code

Шаг 2: хватит ли усиления

По AN2867 кварц запустится надёжно, если его критическая крутизна меньше предельной для выбранного уровня LSEDRV:

gm,crit=4⋅ESR⋅(2πF)2⋅(C0+CL)2g_{m,crit} = 4 \cdot ESR \cdot (2\pi F)^2 \cdot (C_0 + C_L)^2
Уровень LSEDRVGm_crit_max у STM32L0
00, Low0,5 мкА/В
01, Medium low0,75 мкА/В
10, Medium high1,7 мкА/В
11, High2,7 мкА/В

Пример (наш расчёт для условного кварца с ESR 70 кОм и C0 = 1 пФ): при CL = 6 пФ gmcrit ≈ 0,58 мкА/В — уровня Low уже не хватает, нужен хотя бы Medium low; при CL = 12,5 пФ gmcrit ≈ 2,16 мкА/В — подходит только High. После сброса по питанию LSEDRV = 00, то есть самый слабый уровень. Важная оговорка RM0377: если программа сама запишет в LSEDRV значение 00, поле больше не изменится программно до сброса по питанию или сброса домена RTC — поэтому нужный уровень записывают сразу одной командой, без промежуточного обнуления. Подробнее о запасе — в термине «Запас по усилению генератора», конденсаторы под CL подбирает калькулятор конденсаторов кварца.

Шаг 3: плата

Дорожки к кварцу делают короткими, а соседний вывод PC13 не переключают: по AN2867 активность PC13, например выход RTC_OUT, сдвигает частоту LSE. Про сам кварц и его уход — термин «Часовой кварц», про домен с RTC — «Резервный домен». Остальное о семействе — на странице STM32L0.

Похожие вопросы

Можно ли проверить LSE осциллографом?

Только щупом с очень малой входной ёмкостью: AN2867 предупреждает, что вход LSE чувствителен к ёмкости нагрузки, и рекомендует щуп 0,1 пФ. Обычный щуп 10X с ёмкостью около десятка пикофарад сам может сорвать генерацию или сдвинуть частоту. Проще смотреть флаг LSERDY и частоту RTC на выводе калибровочного выхода.

Почему после перепрошивки LSEDRV не вернулся к нулю?

Биты LSEDRV, как и LSEON, лежат в домене RTC и по RM0377 сбрасываются только сбросом по питанию или сбросом домена RTC. Обычный сброс кнопкой или перепрошивка их не трогают, поэтому старая настройка может сохраниться и замаскировать проблему с кварцем. А если в LSEDRV однажды записали 00, по RM0377 поле заблокировано, и поднять усиление можно только после такого сброса.

Можно ли подать на OSC32_IN готовый сигнал 32,768 кГц?

Да, для этого есть бит LSEBYP в RCC_CSR: в режиме обхода генератор не работает, а внешний сигнал идёт прямо в тактовую цепь. Бит LSEBYP можно записать только при выключенном LSE.

Источники

  1. STMicroelectronics. AN2867 Guidelines for oscillator design on STM8AF/AL/S and STM32 MCUs/MPUs, Rev 24 (February 2026) — разд. 3.4: gmcrit = 4 · ESR · (2πF)² · (C0 + CL)², при заданном Gm_crit_max нужно gmcrit < Gm_crit_max; отношение отрицательного сопротивления к ESR рекомендуется больше 3 для LSE; табл. 5: LSE STM32L0 — уровни Low, Medium low, Medium high, High: gm (min) 2,5 / 3,75 / 8,5 / 13,5 мкА/В, Gm_crit_max 0,5 / 0,75 / 1,7 / 2,7 мкА/В; разд. 3.5.2: напряжение на LSE очень чувствительно к ёмкости щупа, нужен щуп 0,1 пФ; разд. 7.4: активность PC13 (например RTC_OUT) может сдвигать частоту LSE
  2. STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 7.2.5: LSE включают битом LSEON, усиление LSEDRV[1:0] можно менять на ходу, флаг LSERDY; разд. 7.3.20: RCC_CSR, значение после POR 0x0C00 0004, LSEON, LSEBYP, RTCSEL, LSEDRV и RTCEN в домене RTC и защищены от записи — нужен DBP в PWR_CR, сбрасываются только сбросом домена RTC; LSEDRV — биты 12:11: 00 Lowest, 01 Medium low, 10 Medium high, 11 Highest, очищаются сбросом по питанию и сбросом RTC; после записи 00 содержимое LSEDRV программно изменить нельзя; разд. 6.4.1: DBP — бит 8 PWR_CR

Нашли ошибку?