Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Принцип работы RTC в STM32F107
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Auratos
Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста
viakon
Цитата(Auratos @ Feb 28 2018, 14:48) *
Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста

Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов.
Auratos
Цитата(viakon @ Feb 28 2018, 10:28) *
Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов.

Можно, пожалуйста, поподробнее? Просто я пользуюсь библиотечной функцией при установке времени и даты

Код
void Set_Time(struct tm *t)
{
  uint32_t CounterValue = (uint32_t)mktime(t);
  save_Time(CounterValue;
}

void save_Time(uint32_t tmr) {
  RTC_WaitForLastTask();
  RTC_SetCounter(tmr);
  RTC_WaitForLastTask();
}


Так вот, функция mktime не воспринимает дату позже февраля 2036 года (найдено опытным путем вплоть до минуты и секунды), т.к. при инкрементации новой секунды происходит переполнение 32-битного CounterValue. Или я неправильно Вас понял? Как выставить дату больше указанной?
Baser
Цитата(Auratos @ Feb 28 2018, 11:48) *
И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета?

Цитата(Auratos @ Feb 28 2018, 12:42) *
Просто я пользуюсь библиотечной функцией при установке времени и даты ... mktime(t);

Это библиотечная фунция, входящая в Си. В ней применяется UNIX-время (Unix Epoch). Отсчет начинается от 1 января 1970 года.
2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке.

Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные.
Я применяю время с 1 января 2000 года. Переписал функции и использую такой свой Timestamp.
Auratos
Цитата(Baser @ Feb 28 2018, 12:25) *
Это библиотечная фунция, входящая в Си. В ней применяется UNIX-время (Unix Epoch). Отсчет начинается от 1 января 1970 года.
2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке.

Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные.
Я применяю время с 1 января 2000 года. Переписал функции и использую такой свой Timestamp.


И вы также используете библиотечные функции localtime и mktime? А не могли бы вы, пожалуйста, привести пример своих функций для работы со временем?
scifi
Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? wacko.gif
Baser
Цитата(Auratos @ Feb 28 2018, 14:29) *
И вы также используете библиотечные функции localtime и mktime? А не могли бы вы, пожалуйста, привести пример своих функций для работы со временем?

Если применять стандартные функции, то там все просто. Вот пример сдвига из программы тестера плат на ПК.
GPSTmp.Time это timestamp в секундах от 1 янв 2000 года. На выходе печатается время в виде строки.
Код
struct tm time;
  time.tm_year = 2000-1900;
  time.tm_mon = 0;
  time.tm_mday = 1;
  time.tm_hour = 0;
  time.tm_min = 0;
  time.tm_sec = 0;
  time.tm_isdst = 0;

  time_t offset2000 = mktime(&time);
  GPSTmp.Time += offset2000;

  struct tm *ptime = localtime((time_t*)&GPSTmp.Time);
  char time_str[81];
  strftime(time_str, 80, "%d-%m-%Y %X", ptime);
  fprintf(fpLog,"Time:       %s\n", time_str);

А в программах на МК использую свои переписанные функции. В качестве примера см. различные открытые библиотеки.
Напр.: date_time.c

Код
UNIX time: 01-01-2000 00:00:00 = 946684800 sec = 10957 days


Цитата(scifi @ Feb 28 2018, 14:44) *
Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? wacko.gif

2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать cool.gif
Auratos
Цитата(Baser @ Feb 28 2018, 16:04) *
2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать cool.gif

Все верно. Создаем вычислительное устройство, настал момент его сертифицировать, где мы гарантируем 15 лет бесперебойной работы, поэтому уже через 4 года мы не сможем гарантировать указанный срок службы, т.к. 2022 + 15 = 2037 год sm.gif
Baser
На самом деле, если формат хранения времени (timestamp) не выходит за пределы прибора, то вы можете его применять в любом виде: хоть в UNIX, хоть в смещенном.
Важно чтобы переполнение обрабатывалось корректно и наружу прибора всегда выводилось бы правильное время.

Мы себе такого позволить не можем, потому что наш смещенный формат timestamp-а передается в таком виде наружу в виде поля времени протокола связи и описан в документации для пользователя.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.