Цитата(Sekat @ Oct 12 2016, 09:42)

1. Не надо удивительных коробок. Используйте SNTP. Сервера с SNTP доступны и недороги. Точность после 485-го вас более чем устроит.
2. Сделайте клиента SNTP на PTP таймере STM32F4. Так будет значительно проще, чем на RTC.
3. 1588 v2 - это микросекундная и субмикросекундная точность. Зачем она вам? Сервера с PTP нераспространены и дороги.
Попробовал поработать с PTP-таймером STM32F407. Он состоит из двух счетчиков:
1) счетчик секунд uint32_t
2) счетчик субсекунд uint32_t c верхним значением 0x7FFFFFFF или 999999999 (зависит от настроек),
при этом теоретическое разрешение по времени равно:
1) 1/(0x7FFFFFFF+1) = 0.465 наносекунды.
2) 1/(999999999+1) = 1 наносекунда.
А правктически этот счетчик инкрементируется на определенное значение каждый период HCLK, которая у меня равна 168 МГц - максимальное по DataSheet.
PTP-clock инициализируем (хоть с нуля) и включаем, они идут даже без подключения к сети Ethernet.
Особенность у часов такая: каждый клок HCLK значение счетчика субсекунд увеличивается на заранее заданное значение в регистре ETH_PTPSSIR (Ethernet PTP subsecond increment register).
Для случая, когда максимальное значение счетчка субсекнд равно 0x7FFFFFFF и тактовая частота равна HCLK равна 168 МГц значение ETH_PTPSSIR должно быть равно: 0x7FFFFFFF / 168000000 = 12,78 округляем до 13-ти.
Из-за этого округления прецизионные часы будут идти неточно без внешней синхронизации. Получается, чтобы они шли точно тактовая частота HCLK должна быть такой, чтобы значение 0x7FFFFFFF / HCLK было целым.
Не понимаю, почему так сделано. Ведь с микросхемы PHY LAN8720A на STM32F407 подается опорная частота 50МГц, почему бы не сделать тактирование PTP clock от этой частоты. Переключаем счетчик на верхнее значение 999999999 и выбираем частоту 50 МГц и часы бы шли более менее точно.
PS: Получается, что никакого смысла использовать PTP-clock совместно с SNTP-клиентом нет, тем более, что формат меток времени NTP-timestamp не совместим с PTP-timestamp (для NTP субсекунды 0...0xFFFFFFFF, для PTP субсекунды 0...7FFFFFFF или 0...999999999). Я-то думал, что форматы меток совпадают и можно копировать метку из NTP в PTP, а здесь еще дополнительные преобразования нужны. Буду использовать системный таймер, в нем тактировать UnixTime и счетчик миллисекунд.