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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Аппаратная поддержка протокола синхронизации времени STM32F407+LAN8720A.
Pridnya
сообщение Dec 14 2016, 08:48
Сообщение #16


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

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



Цитата(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 и счетчик миллисекунд.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 15 2016, 09:32
Сообщение #17


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

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



Цитата(Pridnya @ Dec 14 2016, 11:48) *
Для случая, когда максимальное значение счетчка субсекнд равно 0x7FFFFFFF и тактовая частота равна HCLK равна 168 МГц значение ETH_PTPSSIR должно быть равно: 0x7FFFFFFF / 168000000 = 12,78 округляем до 13-ти.

Из-за этого округления прецизионные часы будут идти неточно без внешней синхронизации. Получается, чтобы они шли точно тактовая частота HCLK должна быть такой, чтобы значение 0x7FFFFFFF / HCLK было целым.
Не понимаю, почему так сделано. Ведь с микросхемы PHY LAN8720A на STM32F407 подается опорная частота 50МГц, почему бы не сделать тактирование PTP clock от этой частоты. Переключаем счетчик на верхнее значение 999999999 и выбираем частоту 50 МГц и часы бы шли более менее точно

Виноват, товарищи!
Это я использовал один из режимов работы PTP-clock, а там есть еще один, как раз с учетом отношения частот 168/50=3,36 и тогда часы идут очень хорошо.
Вот код инициализации:
Код
void InitPtpClockStm32F407(void)
{
ETH->PTPTSAR = 0x4C30C30C; // 2^32/(168/50) = 2^32/3.36 = 1278264076.19 округляем 0x4C30C30C
ETH->PTPSSIR = 20; // 20 наносекунд.
/* In Fine update mode, the value in this register is added to the system time whenever the accumulator gets an overflow.
Fine update mode: значение ETH->PTPSSIR добавляется к системному времени каждый раз когда аккумулятор переполняется. */        
ETH->PTPTSCR |= ETH_PTPTSCR_TSE;     // Time stamp enable.
ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI;   // Time stamp initialize.
ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU;   // Fine update method.
ETH->PTPTSCR |= ETH_PTPTSCR_TSARU;   // Addend register update. Если закомментировать, то часы не идут.
ETH->PTPTSCR |= ETH_PTPTSCR_TSSSR;   // digital rollover control, 0 - 999 999 999.
ETH->PTPTSCR |= ETH_PTPTSCR_TSPTPPSV2E; // Time stamp PTP packet snooping for version2 format enable.
ETH->PTPTSCR |= ETH_PTPTSCR_TSSIPV4FE;  // Time stamp snapshot for IPv4 frames enable.
}

Эти регистры хранят секунды и наносекунды.
Код
sprintf(LCD.line_1,"%d%c%d",ETH->PTPTSHR, '_',ETH->PTPTSLR);

Go to the top of the page
 
+Quote Post
gacov
сообщение Nov 11 2017, 20:52
Сообщение #18





Группа: Новичок
Сообщений: 1
Регистрация: 11-11-17
Пользователь №: 100 153



Цитата(Pridnya @ Dec 15 2016, 12:32) *


на самом деле значение регистра ETH->PTPTSAR вычисляется так
ETH->PTPTSAR = 2^63 / ( ETH->PTPSSIR * HCLK )
эта формула приведена в Application note AN3411
если ETH->PTPSSIR = 20; и частота HCLK (AHB шина) равна 168МГц то
ETH->PTPTSAR = 0xA39E2840

Сообщение отредактировал IgorKossak - Nov 12 2017, 20:27
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
V K
сообщение Dec 20 2017, 15:35
Сообщение #19





Группа: Новичок
Сообщений: 1
Регистрация: 20-12-17
Пользователь №: 100 744



to Pridnya

Удалось разобраться с PTP на STM32F407?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st January 2018 - 20:26
Рейтинг@Mail.ru


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