Я тут несколько раз высказывался как правильно готовить часовой
кварц в STM32. Если найдете - выложите ссылки. Кратко: 1. Использовать надо обычный часовой кварц с CL = 12.5пФ, которых везде как грязи.
2. Нагружать этот кварц следует с учетом параметров, данных в даташите на МК (иначе не запустится)
3. Полученную недогрузку (уход часов вперед) следует откалибровать:
3.А. По системному кварцу (который термостабилен). Но здесь важно, чтобы системный кварц был тоже адекватно нагружен. Например, для CL=16пФ нужны емкости обвязки 24пФ, для CL=20пФ емкости обвязки 33пФ.
3.Б. Если нет системного кварца, то можно ввести фиксированную компенсацию. Если пользовать кварцы одного производителя (или даже разного производителя, но близкие по параметрам), то вполне рабочий способ.
Совершенно отдельно стоит проблема термокомпенсации. Она можетдолжна быть решена, когда устройство запитано и работает. Здесь тоже есть план А и Б :-)
А. При наличии системного кварца все тупо и просто - счет времени идет по системному кварцу. Он термостабилен. Накопленный разбег относительно часового кварца складывается в Backup-регистры.
Б. При отсутствии системного кварца можно пользовать встроенный в STM32 термодатчик и вводить параболическую термокомпенсацию. ЗЫ: Этот пункт я не пробовал, но эффект от него должен быть.
Ну и остается нерешенная проблема - термокомпенсация, когда устройство не запитано и не работает. Но тут ничего не поделать.