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

Принцип работы RTC в STM32F107

Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста

Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов.

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

 

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. Или я неправильно Вас понял? Как выставить дату больше указанной?

Изменено пользователем Auratos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета?

Просто я пользуюсь библиотечной функцией при установке времени и даты ... mktime(t);

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

2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке.

 

Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке.

 

Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные.

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

 

И вы также используете библиотечные функции localtime и mktime? А не могли бы вы, пожалуйста, привести пример своих функций для работы со временем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вы также используете библиотечные функции 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

 

Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? :wacko:

2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать B)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать B)

Все верно. Создаем вычислительное устройство, настал момент его сертифицировать, где мы гарантируем 15 лет бесперебойной работы, поэтому уже через 4 года мы не сможем гарантировать указанный срок службы, т.к. 2022 + 15 = 2037 год :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле, если формат хранения времени (timestamp) не выходит за пределы прибора, то вы можете его применять в любом виде: хоть в UNIX, хоть в смещенном.

Важно чтобы переполнение обрабатывалось корректно и наружу прибора всегда выводилось бы правильное время.

 

Мы себе такого позволить не можем, потому что наш смещенный формат timestamp-а передается в таком виде наружу в виде поля времени протокола связи и описан в документации для пользователя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...