Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F2: RTC проблемы с датой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
k000858
В других контроллерах (stm32f4 к примеру) дата меняется в 00:00:00 время
В STM32F2 наблюдаю другую картину: дата может измениться в 00:00:07 время или не изменяться вообще.

Кто то сталкивался с такой проблемой? куда капать?
paulbell
Цитата(k000858 @ Dec 27 2016, 12:59) *
В других контроллерах (stm32f4 к примеру) дата меняется в 00:00:00 время
В STM32F2 наблюдаю другую картину: дата может измениться в 00:00:07 время или не изменяться вообще.

Кто то сталкивался с такой проблемой? куда капать?



У меня такая же проблема. Есть ли решение?
jcxz
Цитата(k000858 @ Dec 27 2016, 14:59) *
Кто то сталкивался с такой проблемой? куда капать?

Ни на кого не надо капать. sm.gif

Цитата(paulbell @ Sep 28 2017, 17:09) *
У меня такая же проблема. Есть ли решение?

Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.
k000858
Цитата(paulbell @ Sep 28 2017, 13:09) *
У меня такая же проблема. Есть ли решение?

К сожалению, уже не помню, как решил данную проблему.
Кажется, было связано с чтением регистра с датой: толи необходимо читать его после каждого чтения регистра времени (именно после него) толи что то такое.

Цитата(jcxz @ Sep 28 2017, 17:13) *
Ни на кого не надо капать. sm.gif


Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.

ага и дату самому считать и календарь весь
jcxz
Цитата(k000858 @ Sep 29 2017, 10:33) *
ага и дату самому считать и календарь весь

Да. А это что, сложно??? smile3046.gif
Zeal0t
Цитата(k000858 @ Dec 27 2016, 10:59) *
В других контроллерах (stm32f4 к примеру) дата меняется в 00:00:00 время
В STM32F2 наблюдаю другую картину: дата может измениться в 00:00:07 время или не изменяться вообще.

Кто то сталкивался с такой проблемой? куда капать?


Для L серии есть вот такое:
Get the RTC_TR register, reading RTC_TR locks the values in the higher-order calendar shadow registers until RTC_DR is read.

т.е. нужно прочитать TR и потом DR иначе значение даты обновляться не будет пока его не считают. Может и тут такое же?
HardEgor
Цитата(jcxz @ Sep 28 2017, 21:13) *
Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.

К сожалению, когда питание выключили, RTC будет тикать, а инкрементировать некому.
jcxz
Цитата(HardEgor @ Sep 29 2017, 13:19) *
К сожалению, когда питание выключили, RTC будет тикать, а инкрементировать некому.

При включении питания считать RTC, преобразовать в секунды и начать тикать.
С часами на основе счётчика секунд, работать много проще чем с набором полей времени/даты.
Alechek
Цитата(jcxz @ Sep 29 2017, 11:43) *
С часами на основе счётчика секунд, работать много проще чем с набором полей времени/даты.

+1
даже стандартная Cи функция time() возвращает секунды.
преобразовывать каждый раз полный календарь в секунды - лишние накладные расходы, никому не нужные.
k155la3
Цитата(jcxz @ Sep 28 2017, 17:13) *
. . .
Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.

++++ (!) ++++

Нормальные узлы RTC имеют 2 режима - обычный календарный (человеческий) и UTC счетчик.
Еси есть такая возможность - переведите узел в режим 32-разрядного счетчика UTC
и пользуйтесь удобным и стандартым методом работы в временем localtime(), gmtime(), strftime() etc.
Заодно "автоматически" решается гемор с переходом или "непереходом" зима-лето, если ОНО требуется и таймозонами.
---
Если аппаратного UTC нет -
Цитата(jcxz @ Sep 28 2017, 17:13) *
. . .
Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.

sm.gif
И будет Вам счастье ....

Проверка "прохода" через час:
Код
if( (UTC_Counter % 3600) == 0 ) . . . . .


Проверка "прохода" через 5 минут:
Код
if( (UTC_Counter % 300) == 0 ) . . . . .


Печать часы-минуты-секунды в массив ms
Код
    strftime( ms, 20, "%H-%M-%S", &ttm_LOC );

scifi
Цитата(k000858 @ Dec 27 2016, 10:59) *
В STM32F2 наблюдаю другую картину: дата может измениться в 00:00:07 время или не изменяться вообще.

Там в мануале написали целую страницу про то, как правильно читать регистры календаря. Наверняка что-то там нарушаете.
jcxz
Цитата(k155la3 @ Sep 29 2017, 15:41) *
Нормальные узлы RTC имеют 2 режима - обычный календарный (человеческий) и UTC счетчик.
Еси есть такая возможность - переведите узел в режим 32-разрядного счетчика UTC

Вы мне-то это зачем советуете?? Я всегда именно так и делаю. Про прерывания написал - как общий случай, когда режима счётчика нет.

Цитата(scifi @ Sep 29 2017, 15:41) *
Там в мануале написали целую страницу про то, как правильно читать регистры календаря. Наверняка что-то там нарушаете.

99.9% что именно так и обстоит дело.
k155la3
Цитата(jcxz @ Sep 29 2017, 11:57) *
Вы мне-то это зачем советуете?? Я всегда именно так и делаю. Про прерывания написал - как общий случай, когда режима счётчика нет.
. . .

Вас-с-с-с я цитирую и плюсую, а советую ТС.
k000858
да да и будильник из спящего режима на таймере делать?
в общем в моем случае проблема давно решена. как озвучили выше "необходимо сначала считывать регистр времени затем даты".
Zeal0t
Цитата(jcxz @ Sep 29 2017, 11:57) *
99.9% что именно так и обстоит дело.


В сообщении #6 я же про это ТС-у написал. Что то проигнорировал он )
HardEgor
Цитата(jcxz @ Sep 29 2017, 13:43) *
При включении питания считать RTC, преобразовать в секунды и начать тикать.
С часами на основе счётчика секунд, работать много проще чем с набором полей времени/даты.

Не всегда он есть, например в STM32F3xx нет счетчика секунд.
inventor
T
vlad_new
Как уже было замечено ранее, всё дело в последовательности. Там вы работаете не напрямую с физическими регистрами, а с теневыми. Сейчас уже точно не помню, но вроде реальные данные, переписываются из теневых регистров только после записи секунд в них. С чтением проблем вроде не было. Но и там то же читать надо 2 раза, что бы не напороться на секундный переход. Причем при использовании библиотек, убедитесь, что там верная последовательность (ошибок в библиотеках хватает).
Читаем в такой последовательности:
Код
RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure);           // Get the current Time
RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure);           // Get the current Date

Пишем в такой:
Код
    PWR_BackupAccessCmd(ENABLE);                                        // BKP ENABLE
    RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);                    // Init Date
    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);                    // Init Time
    PWR_BackupAccessCmd(DISABLE);                                       // BKP DISABLE

Или я не уловил суть вопроса?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.