|
STM32F407 Synchronizing the RTC |
|
|
|
Jun 10 2016, 12:55
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jun 16 2016, 12:32
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 23 2016, 12:54
|
Участник

Группа: Участник
Сообщений: 61
Регистрация: 13-02-12
Пользователь №: 70 242

|
Цитата(Pridnya @ Jun 16 2016, 15:32)  Это только модель, в которой DS1306 формирует сигнал 1PPS (эмулятор импульсов с высокой точностью по времени). По RS485 часы синхронизируются с точностью до секунд (широковещательным запросом), а по сигналу 1PPS синхронизируются с точностью до миллисекунд. На практике желающие смогут использовать хоть сервер точного времени, хоть другую какую коробку с 1PPS. Хоть простой маячок с GPS и выходом 1PPS. 1PPS от GPS модуля позволяет синхронизировать внутренние часы на STM32F407 с точностью до ~200нс (нано) . Для этого нужно использовать PTP таймер. Тогда схема синхронизации времени выглядит так. Основные часы - PTP таймер, синхронизируемый по 1PPS в пределах 1 секунды. Через какой-нибудь интерфейс (485, ETHERNET и т.д.) происходит грубая установка времени (дата/минуты/секунды). Периодически время пересчитывается и переписывается из PTP таймера в RTC. RTC используются как основные часы, когда устройство отключено и при включении питания время перезаписывается из RTC в PTP.
|
|
|
|
|
Jul 8 2016, 07:20
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(Sekat @ Jun 23 2016, 15:54)  1PPS от GPS модуля позволяет синхронизировать внутренние часы на STM32F407 с точностью до ~200нс (нано) . Для этого нужно использовать PTP таймер. Тогда схема синхронизации времени выглядит так. Основные часы - PTP таймер, синхронизируемый по 1PPS в пределах 1 секунды. Через какой-нибудь интерфейс (485, ETHERNET и т.д.) происходит грубая установка времени (дата/минуты/секунды). Периодически время пересчитывается и переписывается из PTP таймера в RTC. RTC используются как основные часы, когда устройство отключено и при включении питания время перезаписывается из RTC в PTP. Спасибо! Я пока с PTP-протоколом не работал, слишком уж он точный (как мне показалось), а такой точности мне не требуется, да и на практике обеспечить её практически не возможно, нужно дорогостоящее оборудование (сервер точного времени, дорогие коммутаторы...) На практике все немного не так: например, один из производителей (можно сказать, ведущий российский производитель РЗА) заявляет поддержку синхронизации времени по множеству протоколов, в т.ч. и по PTP, очень умные сразу понимают, что это означает точность в микросекундах , менее умные читают отдельный документ "про синхронизацию", а там что-то типа такого Делаем вывод: на практике достаточно 1 мс.
Сообщение отредактировал Pridnya - Jul 8 2016, 07:21
Эскизы прикрепленных изображений
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|