Перейти к содержанию

    

Pridnya

Свой
  • Публикаций

    142
  • Зарегистрирован

  • Посещение

Весь контент Pridnya


  1. Электрическая надежность STM32.

    Вот здесь поподробнее можно?
  2. ADC STM32

    Написано в Reference manual RM0041 (не в Data Sheet).
  3. Texas Instruments LMFLASH Programmer

    Здравствуйте, уважаемое сообщество! Есть контроллер TM4C от Texas Instruments, в нем есть аппаратный загрузчик, который позволяет прошить память программ через Ethernet. Есть утилита LMFLASH от Texas Instruments, которая запускается из командной строки с параметрами. Есть у этой утилиты параметр --examples, но из него не понятно, какие параметры задать, чтобы зашить файл File.bin в чистый TM4C, примеры такого вида (файл записыватся в демо-платы ek-lm3s6965...)
  4. Всем привет! Проект без операционной системы с LwIP-стеком (low-level "core" / "callback" or "raw" API) на одном микроконтроллере (основная программа + TCP-сервер (Modbus TCP)), работает. Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом? По отдельности TCP-сервер работает, UDP-клиент работает, а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)? Я еще с такой задачей не сталкивался, поэтому сильно не ругайте. Если что, то в качестве PHY используется LAN8720A, разъем RJ45 один, проект на STM32, но микроконтроллер пока не важен, меня интересует сама возможность совмещения серера и клиента.
  5. Здравствуйте, товарищи! Совсем запутался. Разъясните пожалуйста! У Microchip поддержка PTP v2 заявлена только в многопортовых Ethernet Switch, например: KSZ8463...и других из этой серии, LA9313, LAN9355...и других, но не в микроконтроллерах, ни в PIC32MX, ни в PIC32MZ. У STM32F407 поддержка PTP v2 заявлена в самом микроконтроллере, к этому микроконтроллеру присоединена LAN8720A. Не пойму, как связаны часы микроконтроллера (модуль RTC с точностью до секунд или даже до субсекнд в случае с STM32F407) и высокоточные часы в соответсвии с PTP с точностью до 20 наносекунд, в которых время хранится 32.32 (секунды.наносекунды). У KSZ8463 даже есть выход 1PPS (один импульс в секунду), тактируемый через протокол PTP. Но аналогичый вывод есть и у STM32F407. Не пойму, для чего он должен использоваться? Вроде как устройства на основе MCU+KSZ8463 или на STM34F407 при использовании протокола PTP могут быть мастерами, рассылать сообщения с метками времени и выдавать импульс 1PPS? Так? И еще, в описании к KSZ8463 есть упоминание про IEC61850 (протокол цифровых подстанций), там как раз используется PTP v2 и сигналы 1PPS, по этому импульсу ежесекундно корректируются (синхронизируются) внутренние часы ведомых устройств.
  6. Цитата(foxit @ Feb 2 2017, 15:07) На какое расстояние надо передавать сигнал? Если метров до 20 можно поставить 74HC125. Вот попробовал эту схему и результат такой (питание SN74ABT125D +5 вольт, подключен кабель 50 Ом, 20 метров, на конце кабеля вход с резистором 50 Ом, т.е. вход согласован по сопротивлению с кабелем): На четырех выходах напряжение 3,8 вольт, на выходе 1PPS вообще 2 вольта. Странно как-то, т.к у микросхемы SN74ABT125D I OH High-level output current −24 −32 mA. Разве так и должно быть?
  7. Здравствуйте! Существует ли программный метод измерения частоты основной гармоники с точностью 0,01 Гц? Предполагается, что в системе есть антиалисинговый фильтр 0-1600 Гц, АЦП с частотой выборки 3200 Гц и микроконтроллер.
  8. Цитата(Pridnya @ Apr 18 2017, 09:49) Откуда у GSA взялось GN? Из-за включенного бита 20 в CDB-ID 200. Если его сбросить, то выдается GLGSA.
  9. Цитата(Alechek @ Apr 17 2017, 16:24) А какие спутники используются, это смотрите по G*GSA и G*GSV. Вообще не понимаю, вот цитата из описания: Цитата: ЦитатаЕсли включена только Созвездие ГЛОНАСС, то идентификатор источника сообщений NMEA для GSV и GSA равен "GL". Вот сообщения от модуля: Цитата$GNGSA,A,1,66,,,,,,,,,,,,99.0,99.0,99.0*1E $GLGSV,3,1,09,66,44,206,34,76,72,024,,75,22,060,,8 4,13,005,*60 $GLGSV,3,2,09,67,52,297,,68,10,337,,86,11,110,,77, 39,260,*6F $GLGSV,3,3,09,85,26,057,,,,,,,,,,,,,*57 $GNGSA,A,1,66,,,,,,,,,,,,99.0,99.0,99.0*1E $GLGSV,3,1,09,66,44,206,34,76,72,024,,75,22,060,,8 4,13,005,*60 $GLGSV,3,2,09,67,52,297,,68,10,337,,86,11,110,,77, 39,260,*6F $GLGSV,3,3,09,85,26,057,,,,,,,,,,,,,*57 Откуда у GSA взялось GN? Для разных систем ЦитатаConfigured GNSS Talker ID GPS -------------------------- GP GLONASS --------------------- GL Galileo ------------------------ GA BeiDou ----------------------- GB Any combination of GNSS ----- GN
  10. Цитата(Alechek @ Apr 17 2017, 15:40) Как говорится, на бога надейся... но ищи глбже! ML8088 - это STA8088. А для STA8088 есть и другие интересные вещи. К, примеру, Navigation & Multimedia System & Architecture STA8088 Firmware Configuration(STA8088_Firmware_Configuration.pdf). Там все описано подробно. В т.ч. и ваши биты. Эту PDF-ку я посмотрю. Спасибо! В этой PDF-ке CDB-ID 201 биты 3 и 24 Not used (см.скриншот), как и в описании v1.1 производителя модуля GL8088S, а фактически они используются и отвечают за Цитата0x01000000 - Бит 24 0x1000000 Не используется v1.1 (Сообщения GPZDA!!!) 0x00000008 - Бит 3 0x0000008 Не используется v1.1 (Сообщения GPGST!!!) Вот еще интресный момент: модули вроде как с поддержкой нескольких систем (GPS/Глонасс), но стандартные сообщения NMEA от системы GPS - GPRMC описаны, а GLRMС не упоминяются. Что-то я не понимаю, получается, что модуль определяет дату, время (эти данные меня интересуют более всего) только с помощью GPS, т.е. используя Глонасс не может вычислить дату, время, местоположение? Так что ли? Т.е. даже после выбора настроек "Спутниковые группировки -> Глонасс" (GPS отключено), после перезагрузки модуля (сброс) выдаются сообщения GPRMC. Как это так? Должно же быть GNRMC.
  11. Цитата(Владимир О. @ Apr 17 2017, 11:18) Добрый день! В принципе за набор сообщений отвечает (в основном) CDB-ID 201. Ну тогда еще в описание Приемники навигационные GL8088s и ML8088s Описание команд и сообщений Редакция 1.1 нужно внести правку т.к. у меня получается так: Для отправки команды в программе ComPump набираем $PSTMGETPAR,1201* и в настройках выбираем «добавить CR LF». Например, на запрос содержимого ячеки CDB-ID 201 (список сообщений порта NMEA, 1 – текущая конфигурация, 201 - ячейка 201 (занимает 4 байта)): 36;W;12:27:47:831;$PSTMGETPAR,1201* 37;R;12:27:47:847;$PSTMSETPAR,1201,0x01000048*5c $PSTMGETPAR,1201* Приходит ответ 0x01000048,т.е. выдаются сообщения (расшифровываем в соответствии с описанием v1.1): 0x01000000 - Бит 24 0x1000000 Не используется (возможно это GPZDA???) 0x00000040 - Бит 6 0x40 Сообщение $GPRMC 0x00000008 - Бит 3 0x8 Не используется (как мы выяснили это GPGST) А фактически передаются сообщения GPRMC, GPGST, GPZDA (координаты я специально заменил на знаки ?): $GPRMC,060925.000,A,?.22941,N,?.16069,E,0.7,358.7,170417,,,A*60 $GPGST,060925.000,5.4,64.3,25.0,-0.3,61.7,30.8,26.6*7F $GPZDA,060925.00,17,04,2017,00,00*68 Да, так и есть, бит 24 - это ZDA. Если кому-то пригодится, то биты 3 и 24 реально соответствуют ZDA и GST (в версии описания они помечены "не используются"). Цитата0x01000000 - Бит 24 0x1000000 Не используется v1.1 (Сообщения GPZDA!!!) 0x00000040 - Бит 6 0x0000040 Сообщение $GPRMC 0x00000008 - Бит 3 0x0000008 Не используется v1.1 (Сообщения GPGST!!!)
  12. Цитата(Владимир О. @ Apr 17 2017, 11:18) Добрый день! В принципе за набор сообщений отвечает (в основном) CDB-ID 201. Бит 3 Маска бита 0x8 Сообщение $GPGST Message Например, если CDB-ID 201 = 0x88435F – то есть $GPGST Message включен Если его нужно отключить, нужно сделать CDB-ID 201 = 0x884357 По поводу часового пояса - не поддерживается эта функция. Часовой пояс в настоящее время не только географическое значение, но и политическое. Год от году карты часовых поясов меняются, области переходят из оного пояса в другой. Честно говоря, я не понимаю, как сделать в модуле учет "контурных карт" границ часовых поясов. Спасибо, Владимир. Тогда нужно исправить в описании, т.к. в соответсвии с описанием этот бит не используется. См. скриншот. И пожелание одно есть: в следующем описании вместо малопонятного с неясным смыслом ЦитатаGPRMС - Рекомендуемые минимальные конкретные данные GPS/ПЕРЕДАЧИ Написать ЦитатаGPRMC - минимальные данные необходимые для определения местоположения. Так гораздо понятнее о чем речь. PS: И еще один момент смущает: на обложке версия 1.1, а на страницах вверху 1.0 (колонтитул). Логично, когда в новой версии описания сообщений и команд версии соответствуют, т.е. на обложке 1.1 и на страницах 1.1. А здесь получается на обложке исправили, а на страницах забыли. Так что ли?
  13. Цитата(viakon @ Feb 4 2017, 18:46) Как-то сомнительно, что это критично. Судя по посту ранее там 100нс разбег между модулями и так возможен. Между двумя модулями нет расхождения 100 нс. Там меньше 10 нс. Вот картинка с двух GL8088S. Цитата(Владимир О. @ Dec 13 2013, 15:36) На сайте НАВИА размещено руководство по применению модуля ML8088 для синхронизации времени. http://naviaglonass.ru/wp-content/uploads/...S_AppNote_1.pdf По результатам экспериментов, в режиме синхронизации и при валидности сигнала PPS ошибка не превышает 15нс. Прошу учесть, что плохая видимость спутников может увеличивать ошибку. Здравствуйте, Владимир. Есть вопрос "как отключить сообщения GPGST"? Про сообщения GST в описании сообщений и команд v1.1 не упоминается, а модуль выдает это сообщение. Вот у меня сообщения в эксперименте с выдергиванием антенны (временно). Широту и долготу я заменил знаками вопроса. Включил выдачу RMC и ZDA, а GST (Статистика ошибки определения местоположения) мне пока нужна, нужно только дата и время: Цитата$GPRMC,060909.000,A,?.23278,N,?.16024,E,2.3,153.5,170417,,,A*6A $GPGST,060909.000,9.3,35.0,23.0,-0.2,34.6,23.6,16.5*77 $GPZDA,060909.00,17,04,2017,00,00*66 $GPRMC,060910.000,V,?.23278,N,?.16024,E,2.3,153.5,170417,,,N*7A $GPGST,060910.000,0.0,39.8,25.8,-0.1,39.6,26.2,17.9*7D $GPZDA,060910.00,17,04,2017,00,00*6E ... $GPRMC,060924.000,V,?.23278,N,?.16024,E,2.3,153.5,170417,,,N*7D $GPGST,060924.000,0.0,80.0,31.8,-0.2,78.2,36.0,31.7*7E $GPZDA,060924.00,17,04,2017,00,00*69 $GPRMC,060925.000,A,?.22941,N,?.16069,E,0.7,358.7,170417,,,A*60 $GPGST,060925.000,5.4,64.3,25.0,-0.3,61.7,30.8,26.6*7F $GPZDA,060925.00,17,04,2017,00,00*68 И еще было бы интересно, как для сообщения ZDA установить часовой пояс (в сообщении это поле равно нулю)? Про часовой пояс тоже не упоминается.
  14. Segger Embedded Studio: Non Commercial License

    Здравствуйте! Есть IDE от Segger - Segger Embedded Studio, можно использовать для Cortex M0-M7. На сайте написано, что можно в некоммерческих целях можно использовать, например, дома в образовательных целях, для этого достаточно лицензии Non Commercial License. ЦитатаNon-profit educational purpose Non-profit educational purposes in the context of the non commercial license terms allows using Embedded Studio by students, tutors, teachers, or private individuals in universities, colleges, non-profit organisations, or at home for courses, classes, training, and self-education. ... Examples Embedded Studio may be used at home to learn how to develop an embedded system with typical evaluation tools. Сама IDE устанавливается и открывается, но при попытке собрать пример появляется сообщение "не найдена коммерческая лицензия", а она мне не нужна, я хочу не коммерческую. Где брать?
  15. Segger Embedded Studio: Non Commercial License

    Цитата(Obam @ Feb 9 2017, 15:22) Не вебинсталлятор есть где-нибудь обычный дистрибутив? У меня Windows x32, я скачал с сайта дистрибутив Setup_EmbeddedStudio_v310i_win_x86.exe. Дистрибутив сохранился в каталоге, путь к которому содержит кириллицу, пара каталогов: ЦитатаC:\Documents and Settings\Demetrius\Мои документы\Загрузки\ Из каталога с таким путем установка не пошла, отобразилось сообщение с каракулями вместо кириллицы, скриншот Instalation Error. Я скопировал дистрибуив на диск С и установил оттуда, установилось. Цитата(id_Alx @ Feb 9 2017, 15:18) Жмите Accept, соглашаясь использовать некоммерческую. Это просто предупреждение. Я уже нажимал, но оригинальный пример HelloWorld не собирается, появляется ошибка "Error Starting Process...". Может, в этой IDE еще что-то нужно настроить. Я только установил, запустил IDE, затем нажал кнопку Build и всё. Цитата(Pridnya @ Feb 9 2017, 15:23) Я уже нажимал, но оригинальный пример HelloWorld не собирается, появляется ошибка "Error Starting Process...". Может, в этой IDE еще что-то нужно настроить. Я только установил, запустил IDE, затем нажал кнопку Build и всё. Все, вопрос решился. По умолчанию SES располагает каталог с примером в каталоге C:\Documents and Settings\Demetrius\Мои документы\SEGGER Embedded Studio Projects\Hello\ Путь содержит кириллицу. Если создать новый проект в каталоге, путь к которому не содержит кириллицу, например, C:\Documents and Settings\Demetrius\SES\ то все работает:
  16. Цитата(foxit @ Feb 2 2017, 15:07) На какое расстояние надо передавать сигнал? Если метров до 20 можно поставить 74HC125. [attachment=105374:2017_02_02_140518.jpg] Спасибо! Как раз метров 10-20, не больше. А я ищу, одно старье какое-то попадается вроде SN75ALS123 (Permits Digital Data Transmission Over Coaxial Cable, Strip Line, or Twisted Pair), как раз на 50-ти омный кабель работает. DataSheet SEPTEMBER 1987 − REVISED FEBRUARY 1993 и уже тогда NOT RECOMMENDED FOR NEW DESIGN. Ни разу не приходилось передавать PPS по коаксиальному кабелю.
  17. Цитата(Владимир О. @ Dec 13 2013, 15:36) На сайте НАВИА размещено руководство по применению модуля ML8088 для синхронизации времени. http://naviaglonass.ru/wp-content/uploads/...S_AppNote_1.pdf По результатам экспериментов, в режиме синхронизации и при валидности сигнала PPS ошибка не превышает 15нс. Прошу учесть, что плохая видимость спутников может увеличивать ошибку. Добрый день, Владимир! Модуль ML8088 работает, сигнал 1PPS есть. А как усилить сигнал PPS с выхода GL8088S/ML8088S чтобы его можно было раздать по коаксиальному кабелю? Т.е. примерная структура: ML8088 выход PPS->Усилитель->Согласующее устройство 50 Ом ->ВЧ-разъем BNC. Т.е. какой усилитель можно применить для этих целей? Может быть вы с каким-то усилителем уже тестировали?
  18. time.h ARMCC

    Здравствуйте! Как учитывается временная зона в стандартной библиотеке времени time.h? Все что нашел в файле time.h - упоминание в функции strftime() Цитата%Z is replaced by the timezone name or abbreviation, or by no characters if no time zone is determinable. Попробовал все, что можно вывести, выводит все, кроме временной зоны: Цитатаtime_t rawtime = 1480685759; // Fri, 02 Dec 2016 13:35:59 GMT struct tm * timeinfo; timeinfo = (struct tm*)localtime(&rawtime); // Convert time_t to tm as UTC time char buffer [80]; strftime (buffer,80,"%I:%M%p",timeinfo); puts (buffer); // 01:35PM strftime (buffer,80,"%H:%M:%S%p",timeinfo); puts (buffer); // 13:35:59PM strftime (buffer,80,"%H:%M:%S",timeinfo); puts (buffer); // 13:35:59 strftime (buffer,80,"%d.%m.%y",timeinfo); puts (buffer); // 02.12.16 strftime (buffer,80,"%a_%A",timeinfo); puts (buffer); // Fri_Friday strftime (buffer,80,"%b_%B",timeinfo); puts (buffer); // Dec_December strftime (buffer,80,"%c",timeinfo); puts (buffer); // 02 Dec 2016 13:35:59 strftime (buffer,80,"%j",timeinfo); puts (buffer); // 337 (day of the year as a decimal number (001-366)) strftime (buffer,80,"%W",timeinfo); puts (buffer); // 48 (the week number of the year (Monday as the first day)) strftime (buffer,80,"%x",timeinfo); puts (buffer); // 02 Dec 2016 strftime (buffer,80,"%X",timeinfo); puts (buffer); // 13:35:59 strftime (buffer,80,"%y",timeinfo); puts (buffer); // 16 (year without century). strftime (buffer,80,"%Y",timeinfo); puts (buffer); // 2016 (year with century) strftime (buffer,80,"%Z",timeinfo); puts (buffer); // ??? Не знаю, как её задавать. Ведь с систем синхронизации будет время UTC+0, а у меня локальное UTC+3. Т.е. где-то должна быть временная зона. Посмотрел у других - для PIC24 (компилятор XC16) в файле time.h есть переменная time_zone: Кодextern int    time_zone;    /* minutes WESTWARD of Greenwich */                 /* this value defaults to 0 since with                    operating systems like MS-DOS there is                    no time zone information available */
  19. Вопрос по LwIP

    Цитата(scifi @ Dec 29 2016, 11:43) Кстати, неплохо было бы включить вывод диагностической информации. Там точно будет сообщение о причине ERR_MEM. Для этого нужно настроить какой-нибудь UART на вывод, переопределить макрос, который выводит отладочные строки в конкретный UART, и в настройках стека разрешить вывод отладочной информации вообще и в конкретных ситуациях.
  20. Вопрос по LwIP

    Цитата(l_fin_l @ Dec 28 2016, 08:19) Здравствуйте, использую LwIP порт для stm32f207(компилятор IAR), при работе более 24 часов, функция netconn_recv возвращает ошибку ERR_MEM. Не могу понять где не хватает памяти, как я понял стек выделяет для приема память из PBUF_POOL. Возможно я что-то недопонимаю, заранее спасибо. Укажите хотя бы версию LwIP, а то люди отвечают даже не зная какая у вас версия (1.3.2...2.0.0). И версию компилятора тоже можно указать.
  21. Вопрос по I2C

    Цитата(Сергей Борщ @ Dec 16 2016, 14:15) А еще бывают внешние микросхемы, у которых I2C прибит гвоздями. К тому же и UART и SPI - интерфейс "точка-точка" и для опроса нескольких внешних микросхем придется городить огород. У меня на двух проводах I2C висят три заказных индикатора и 124 линии ввода-вывода (кнопки, светодиоды) через расширители, все это разбросано по плате размером с полтора листа A4. Про принцип "пустил-забыл" слышали? Передача: дождался освобождения шины, запустил обмен, пошел делать другие дела. Прием: дождался освобождения шины, запустил обмен, жду сигнала от ОС о готовности данных (в это время процессор делает другие полезные дела вместо тупого опроса флагов I2C или тупого шевеления ногами "медленной шины I2C"). Спасибо! В случае SPI для нескольких микросхем потребуется дешифратор 3-8 для CS и три лини SI, SO, SCK. Получается, что можно и I2C использовать с прерываниями, но лучше еще и с RTOS, если я правильно понял. Про принцип, естественно, слышал, сам использую USART передатчик по прерываниям или через DMA. Цитата(zltigo @ Dec 16 2016, 14:18) Вот именно потому, что она МЕДЛЕННАЯ и следует использовать прерывания, дабы не ждать ожидания транзакции. Причем все точно так же обстоит и с помянутыми Вами SPI и UART. Спасибо!
  22. Вопрос по I2C

    Цитата(KnightIgor @ Dec 15 2016, 23:11) Мда, сочуствую: начинать с I2C F103 по прерываниям. Это полная катастрофа... Цитата(Сергей Борщ @ Dec 16 2016, 09:48) Присоединяюсь к вопросу. Я сразу начал и с прерываниями и с ПДП и под ОС. Все работет. Что я сделал неправильно? Цитата(dimon_rub @ Dec 16 2016, 10:36) А в чем интересно проблема. Поделитесь ПОЖАЛУЙСТА. Я вообще шину I2С использовал только на MCU PIC16 от Microchip, да и то программный вариант: выделяешь два вывода и работаешь. Медленная она, но полезная, когда нечасто нужно опрашивать несколько микросхем на шине I2C или в пределах печатной платы связать все узлы, поддерживающие I2C. А вообще использую интерфейсы UART и SPI, они быстрые (несколько мегабит или несколько десятков мегабит в секунду), по ним можно передавать большие блоки данных, и здесь удобно пользоваться прерываниями на низких скоростях и DMA на больших. Но вот совсем не пойму, а какой смысл использовать на медленной шине I2C прием и передачу по прерываниям, и еще DMA для I2C использовать? Поясните в двух словах, если не сложно!
  23. Протокол SNTP

    Цитата(Ruslan1 @ Dec 15 2016, 14:01) А, ну значит уже было, а я-то просто не искал тогда. Значит ошибся, извиняюсь. Да ладно! Цитата(Ruslan1 @ Dec 15 2016, 14:01) Но sntp протокол действительно очень "simple" и совершенно не привязан к типу ядра микроконтроллера. Вот это "simple" каждый понимает по-своему, в меру разумения. Код клиента на Си не привязан к ядру (к системе команд), даже к периферии не привязан, зато привязан к конкретному TCP/IP-стеку, который портируется для конкретной архитектуры (и не всегда есть порт для конкретной архитектуры). Для того же LwIP есть несколько вариантов клиента (с использованием RTOS и без неё) и т.д. А у Microchip клиент за 10 лет практически не изменился, в последней версии microchip\mla\v2016_08_08\framework\tcpip\src\sntp.c практически тот же что и в 2007-м году файл, только нет строк об авторах и дате. Стыдно, наверное.
  24. Протокол SNTP

    Здравствуйте, товарищи! Использую стек lwIP 1.3.2, протокол SNTP (за основу взят sntp из архива contrib-1.4.1). Заполняю структуру sntp_msg, Кодstruct sntp_msg { PACK_STRUCT_FIELD(u8_t  li_vn_mode); PACK_STRUCT_FIELD(u8_t  stratum); PACK_STRUCT_FIELD(u8_t  poll); PACK_STRUCT_FIELD(u8_t  precision); PACK_STRUCT_FIELD(u32_t root_delay); PACK_STRUCT_FIELD(u32_t root_dispersion); PACK_STRUCT_FIELD(u32_t reference_identifier); PACK_STRUCT_FIELD(u32_t reference_timestamp[2]); PACK_STRUCT_FIELD(u32_t originate_timestamp[2]); PACK_STRUCT_FIELD(u32_t receive_timestamp[2]); PACK_STRUCT_FIELD(u32_t transmit_timestamp[2]); }; вставляю в неё свою метку времени originate_timestamp[] и отправляю её NTP-серверу (служба времени Windows), в ответ получаю такую же структуру с четырьмя метками времени. В файле sntp.c (из архива contrib-1.4.1) есть функция Код/* SNTP processing of received timestamp  */ static void sntp_process(u32_t *receive_timestamp) {   /* convert SNTP time (1900-based) to unix GMT time (1970-based)    * @todo: if MSB is 1, SNTP time is 2036-based!    */   time_t t = (ntohl(receive_timestamp[0]) - DIFF_SEC_1900_1970); #if SNTP_CALC_TIME_US   u32_t us = ntohl(receive_timestamp[1]) / 4295;   SNTP_SET_SYSTEM_TIME_US(t, us);   /* display local time from GMT time */   LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s, %"U32_F" us", ctime(&t), us)); #else /* SNTP_CALC_TIME_US */   /* change system time and/or the update the RTC clock */   SNTP_SET_SYSTEM_TIME(t);   /* display local time from GMT time */   LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s", ctime(&t))); #endif /* SNTP_CALC_TIME_US */ } Из этого кода следует, что метка времени receive_timestamp[] (момент времени, когда NTP-сервер получил запрос клиента) переводится из NTP timestamp в UnixTime и далее используется клиентом как "время сервера" (эталонное), при этом никак не учитываются два параметра из протокола SNTP (RFC1769 SNTP v3) - циклическая задержка и смещение времени (см.скриншот). Это авторы кода так упростили себе задачу и почему они так сделали? И как учесть циклическую задержку и смещение?
  25. Цитата(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);