Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Попытка реализации PTP протокола на STM32F417
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
proga
Я сейчас разрабатываю программу на базе платы TE-STM32F417MCU. В ней я пытаюсь, в том числе, реализовать поддержку PTP протокола. Однако я столкнулся со следующей проблемой.Системный таймер, ответственный за PTP, генерирует прерывание, если его текущее время превышает значение, записанное в регистрах target time. При этом устанавливается флаг TSTS в регистре ETH_MACSR. Данный флаг очищается как только производится чтение из регистра ETH_MACSR, так гласит Reference manual. Однако в режиме отладки я наблюдал , что после прочтения регистра никакого снятия флага TSTS не происходит и программа застревает в обработчике. Вследствие этого пришлось ввести в обработчик цикл, который снова и снова считывает содержимое регистра ETH_MACSR
до тех пор пока флаг TSTS не очищается. Однако этого я смог добиться только в режиме отладки. Когда же я прошиваю контроллер и запуская его на исполнение без программатора, то программа застревает в этом цикле навечно, т.е флаг TSTS так и не сбрасывается. Буду благодарен любым соображениям по этому поводу . Спасибо
Sekat
Нарвался на ту же проблему с STM32F407 на Discovery. При чем, если читать состояние этого флага в регистре ETH->MACSR с помощью ST-LINK в окне дебаггера , то этот флажок успешно сбрасывается! А изнутри - никак!
Может есть прогресс в этом вопросе с февраля?
proga
К сожалению, нет. В итоге, я использовал трансивер физического уровня dp83640 с поддержкой протокола IEE 1588 и на его основе успешно реализовал поддержку протокола PTP в своём проекте. Я задавал вопрос в комьюнити STM по данной проблеме и, судя потому, как они резко прекратили обсуждения, после того, как я послал им проект, в котором можно наблюдать проявление данной проблемы, я сделал вывод, что это аппаратный баг, который делает невозможным реализацию протокола PTP только средствами контроллера STMF417. Хотя возможно я и ошибаюсь.
Sekat
Цитата(proga @ Aug 18 2013, 19:37) *
К сожалению, нет. В итоге, я использовал трансивер физического уровня dp83640 с поддержкой протокола IEE 1588 и на его основе успешно реализовал поддержку протокола PTP в своём проекте. Я задавал вопрос в комьюнити STM по данной проблеме и, судя потому, как они резко прекратили обсуждения, после того, как я послал им проект, в котором можно наблюдать проявление данной проблемы, я сделал вывод, что это аппаратный баг, который делает невозможным реализацию протокола PTP только средствами контроллера STMF417. Хотя возможно я и ошибаюсь.


Спасибо за ответ.
Да. Видел я этот тред в коммьюнити, даже там тоже написал. Относительно официальной поддержки - действительно, по опыту предыдущих общений с СТ -очень тяжело чего-либо добиться. Реализация в трансивере - выход из положения, однако для моего проекта это существенно менее удобно.

Не уверен что все так совсем плохо для реализации только средствами STM.
1. PTP можно реализовать и без этого прерывания средствами только контроллера, практически без ущерба для точности.
2. У меня меня есть несколько иные планы на это прерывание от таймера (не для целей PTP), которые так же надеюсь реализовать иными методами, однако без привлечения дополнительно аппаратного обеспечения.

Конечно же нормальная работа этого прерывания облегчила бы жизнь, однако официально писать им в поддержку по этому поводу не стану - жалко времени.
HasuMan
Добрый день. Столкнулся с той же самой проблемой на stm32f417.
Ваша тема на форуме st?
Подскажите, как решили данную проблему. Если возможно, выложите исходный код.
Sekat
Цитата(HasuMan @ Dec 26 2013, 10:43) *
Добрый день. Столкнулся с той же самой проблемой на stm32f417.
Ваша тема на форуме st?
Подскажите, как решили данную проблему. Если возможно, выложите исходный код.

Да. Проблема преодолена.
С Новым Годом! Держите Новогодний подарок:
Код
       if (ETH->MACSR & ETH_MACSR_TSTS){
// Есть прерывание от "будильника PTP"
       ETH->PTPTTHR=ETH->PTPTSHR+MyConst;// Переустановить будильник
       if(ETH->PTPTSSR&ETH_PTP_FLAG_TSTTR){// Эта команда очищает не только флаг ETH_PTP_FLAG_TSTTR, но и ETH_MACSR_TSTS.
           ETH->PTPTSCR|=ETH_PTPTSCR_TSITE;
// Ваш код
//
}}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.