реклама на сайте
подробности

 
 
> STM32F407 Synchronizing the RTC
Pridnya
сообщение Jun 10 2016, 12:55
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Здравствуйте!

Есть два макета, оба на STM32F407, в обоих включен RTC, тактирование от внешнего LSE-кварца 32768 Гц.

Код инициализация RTC
Код
void initRTC(void)
{
RTC_InitTypeDef RTC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

    PWR_BackupAccessCmd(ENABLE);  
    
    RCC_LSEConfig(RCC_LSE_ON);        
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {;}    
                    
    RCC_RTCCLKCmd(ENABLE);    
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  

    RTC_CalibOutputConfig(RTC_CalibOutput_1Hz); // 1 Hz            
    RTC_CalibOutputCmd(ENABLE);    
    
    RTC_StructInit(&RTC_InitStructure);
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
    //RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
    //RTC_InitStructure.RTC_SynchPrediv = 0xFF;
    RTC_InitStructure.RTC_AsynchPrediv = 0x0F;
    RTC_InitStructure.RTC_SynchPrediv = 0x7FF;
    RTC_Init(&RTC_InitStructure);    
    
    PWR_BackupAccessCmd(DISABLE);
}

Т.е. изменил значения предделителей. Суммарный коэффициент деления остался неизменным. На выходе PC13 место 1Гц получаю 8Гц, т.е. частота LSE делится сначала на 16, а затем на 256, поэтому 8Гц. Должна делиться на 2048.

Субсекунды при этом идут как положено RTC_SSR изменяется с 2047 до 0, т.е. с 0 до 999 мс.

PS: вопрос возник в связи с тем, что когда оба предделителя по умолчанию, то частота на выходе PC13 равна 1Гц и этими импульсами можно синхронизировать часы другого микроконтроллера (по внешнему прерыванию 1 импульс в секунду). А тут 8Гц. В RM0090 нарисовано, что частота 1Гц формируется с выхода синхронного предделителя. При дефолтных предделителях оба модуля RTC синхронизируются (в обработчике внешнего прерывания читаем RTC_SSR и корректируем RTC_SHIFTR), часы идут с точностью до 0,01 сек на дисплее (разрешающая способность по субсекундам равна 1/(PREDIV_S+1), т.е. 3,9 мс).

Сообщение отредактировал Pridnya - Jun 10 2016, 13:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jun 16 2016, 12:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Немного не в тему, конечно, но синхронизировать часы по RS485, это не самый точный способ. А использовать ds1306 вообще странновато, на мой взгляд. Я конечно не знаю полного техзадания ...
На своих образцах калибровал часы. Можно добиться точности пару секунд в месяц. Собственно реальная точность указана в руководстве по эксплуатации.
Если требуется совместная работа (то есть взаимная синхронизация) то лучше синхронизировать по какому-нибудь высокоскоростному интерфейсу. Обычно используется GPS, либо ethernet.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Jun 16 2016, 12:32
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(SasaVitebsk @ Jun 16 2016, 15:00) *
Немного не в тему, конечно, но синхронизировать часы по RS485, это не самый точный способ. А использовать ds1306 вообще странновато, на мой взгляд. Я конечно не знаю полного техзадания ...
На своих образцах калибровал часы. Можно добиться точности пару секунд в месяц. Собственно реальная точность указана в руководстве по эксплуатации.
Если требуется совместная работа (то есть взаимная синхронизация) то лучше синхронизировать по какому-нибудь высокоскоростному интерфейсу. Обычно используется GPS, либо ethernet.

Это только модель, в которой DS1306 формирует сигнал 1PPS (эмулятор импульсов с высокой точностью по времени). По RS485 часы синхронизируются с точностью до секунд (широковещательным запросом), а по сигналу 1PPS синхронизируются с точностью до миллисекунд. На практике желающие смогут использовать хоть сервер точного времени, хоть другую какую коробку с 1PPS. Хоть простой маячок с GPS и выходом 1PPS.

В любом случае, какой бы интерфейс и алгоритм не использовался, часы нужно подводить либо назад (это работает), либо вперед - это и интересует (как получить корректное время после сдвига).

Всем спасибо! Вопрос решен.
Все просто: после сдвига вперед, в случае, если RTC_SSR превышает (PREDIV_S+1) нужно из RTC_SSR вычесть (PREDIV_S+1), а затем преобразовать остаток в миллисекунды. И из секунд вычесть 1 секунду. И часы синхронизируются до тысячной доли. Это как раз этот случай.
Цитата
Note: SS can be larger than PREDIV_S only after a shift operation. In that case, the correct
time/date is one second less than as indicated by RTC_TR/RTC_DR.


Сообщение отредактировал Pridnya - Jun 16 2016, 13:21
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016