|
|
  |
Принцип работы RTC в STM32F107 |
|
|
|
Feb 28 2018, 09:48
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032

|
Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста
|
|
|
|
|
Feb 28 2018, 10:28
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(Auratos @ Feb 28 2018, 14:48)  Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов.
|
|
|
|
|
Feb 28 2018, 10:42
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032

|
Цитата(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. Или я неправильно Вас понял? Как выставить дату больше указанной?
Сообщение отредактировал Auratos - Feb 28 2018, 10:47
|
|
|
|
|
Feb 28 2018, 12:25
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(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.
|
|
|
|
|
Feb 28 2018, 12:29
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032

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

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(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)  Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее?  2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать
|
|
|
|
|
Feb 28 2018, 15:45
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032

|
Цитата(Baser @ Feb 28 2018, 16:04)  2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать  Все верно. Создаем вычислительное устройство, настал момент его сертифицировать, где мы гарантируем 15 лет бесперебойной работы, поэтому уже через 4 года мы не сможем гарантировать указанный срок службы, т.к. 2022 + 15 = 2037 год
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|