|
STM32F2: RTC проблемы с датой |
|
|
|
Sep 28 2017, 10:09
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 18-07-16
Пользователь №: 92 595

|
Цитата(k000858 @ Dec 27 2016, 12:59)  В других контроллерах (stm32f4 к примеру) дата меняется в 00:00:00 время В STM32F2 наблюдаю другую картину: дата может измениться в 00:00:07 время или не изменяться вообще.
Кто то сталкивался с такой проблемой? куда капать? У меня такая же проблема. Есть ли решение?
|
|
|
|
|
Sep 28 2017, 14:13
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(k000858 @ Dec 27 2016, 14:59)  Кто то сталкивался с такой проблемой? куда капать? Ни на кого не надо к апать.  Цитата(paulbell @ Sep 28 2017, 17:09)  У меня такая же проблема. Есть ли решение? Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.
|
|
|
|
|
Sep 29 2017, 03:33
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(paulbell @ Sep 28 2017, 13:09)  У меня такая же проблема. Есть ли решение? К сожалению, уже не помню, как решил данную проблему. Кажется, было связано с чтением регистра с датой: толи необходимо читать его после каждого чтения регистра времени (именно после него) толи что то такое. Цитата(jcxz @ Sep 28 2017, 17:13)  Ни на кого не надо к апать.  Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти. ага и дату самому считать и календарь весь
|
|
|
|
|
Sep 29 2017, 06:05
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 28-06-13
Пользователь №: 77 311

|
Цитата(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 иначе значение даты обновляться не будет пока его не считают. Может и тут такое же?
|
|
|
|
|
Sep 29 2017, 07:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(jcxz @ Sep 29 2017, 11:43)  С часами на основе счётчика секунд, работать много проще чем с набором полей времени/даты. +1 даже стандартная Cи функция time() возвращает секунды. преобразовывать каждый раз полный календарь в секунды - лишние накладные расходы, никому не нужные.
|
|
|
|
|
Sep 29 2017, 08:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(jcxz @ Sep 28 2017, 17:13)  . . . Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти. ++++ (!) ++++ Нормальные узлы RTC имеют 2 режима - обычный календарный (человеческий) и UTC счетчик. Еси есть такая возможность - переведите узел в режим 32-разрядного счетчика UTC и пользуйтесь удобным и стандартым методом работы в временем localtime(), gmtime(), strftime() etc. Заодно "автоматически" решается гемор с переходом или "непереходом" зима-лето, если ОНО требуется и таймозонами. --- Если аппаратного UTC нет - Цитата(jcxz @ Sep 28 2017, 17:13)  . . . Забить на эти регистры, разрешить секундные прерывания и по ним инкрементировать счётчик в памяти.  И будет Вам счастье .... Проверка "прохода" через час: Код if( (UTC_Counter % 3600) == 0 ) . . . . . Проверка "прохода" через 5 минут: Код if( (UTC_Counter % 300) == 0 ) . . . . . Печать часы-минуты-секунды в массив ms Код strftime( ms, 20, "%H-%M-%S", &ttm_LOC );
|
|
|
|
|
Sep 29 2017, 08:57
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(k155la3 @ Sep 29 2017, 15:41)  Нормальные узлы RTC имеют 2 режима - обычный календарный (человеческий) и UTC счетчик. Еси есть такая возможность - переведите узел в режим 32-разрядного счетчика UTC Вы мне-то это зачем советуете?? Я всегда именно так и делаю. Про прерывания написал - как общий случай, когда режима счётчика нет. Цитата(scifi @ Sep 29 2017, 15:41)  Там в мануале написали целую страницу про то, как правильно читать регистры календаря. Наверняка что-то там нарушаете. 99.9% что именно так и обстоит дело.
|
|
|
|
|
Sep 29 2017, 09:29
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 28-06-13
Пользователь №: 77 311

|
Цитата(jcxz @ Sep 29 2017, 11:57)  99.9% что именно так и обстоит дело. В сообщении #6 я же про это ТС-у написал. Что то проигнорировал он )
|
|
|
|
|
Oct 4 2017, 15:50
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Как уже было замечено ранее, всё дело в последовательности. Там вы работаете не напрямую с физическими регистрами, а с теневыми. Сейчас уже точно не помню, но вроде реальные данные, переписываются из теневых регистров только после записи секунд в них. С чтением проблем вроде не было. Но и там то же читать надо 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 Или я не уловил суть вопроса?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|