dimka76 42 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Здравствуйте. Если кто-нибудь использовал PTP в STM32 подскажите пожалуйста. В данном блоке есть пара регистров ETH_PTPTSHR и ETH_PTPTSLR. Если я читаю из них текущее значение, то получается пока я читаю из одного, то в это время в другом значение может измениться. В Reference manual проэтот блок вообще мало что написано, а application manual на эту тему я вообще не нашел. Нашел лишь в сети проект и библиотеки под это дело. В них есть функции чтения этих регистров static uint32_t ETH_PTPSubSecond2NanoSecond(uint32_t SubSecondValue) { uint64_t val = SubSecondValue * 1000000000ll; val >>= 31; return val; } void ETH_PTPTime_GetTime(struct ptptime_t * timestamp) { timestamp->tv_nsec = ETH_PTPSubSecond2NanoSecond(ETH->PTPTSLR); timestamp->tv_sec = ETH->PTPTSHR; } И, как мне кажется, в них тоже кроется указанная выше опасность. Адреса этих регистров идут друг за другом ETH_PTPTSHR - Address offset: 0x0708 ETH_PTPTSLR - Address offset: 0x070C Поможет ли исправить ситуацию, если я заставлю компилятор читать значения из этих регистров с помощью инструкции LDRD ? Или я чего-то не понимаю ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Как-то так: uint32_t low, high, high2; high = ETH->PTPTSHR; do { high2 = high; low = ETH->PTPTSLR; high = ETH->PTPTSHR; } while (high != high2); См. тут, например: https://electronics.stackexchange.com/questions/3849/reading-a-16-bit-timer-on-an-8-bit-mcu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Спасибо ! Хорошая идея. А как вариант с LDRD ? Не прокатит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 1 час назад, dimka76 сказал: В данном блоке есть пара регистров ETH_PTPTSHR и ETH_PTPTSLR. Если я читаю из них текущее значение, то получается пока я читаю из одного, то в это время в другом значение может измениться. В Reference manual проэтот блок вообще мало что написано, а application manual на эту тему я вообще не нашел. Зато написано про "Enhanced Tx DMA descriptors" и "Enhanced Rx DMA descriptors format with IEEE1588 time stamp". т.е. самому читать эти регистры не нужно, DMA в процессе приёма/передачи их само прочитает и в поля TDES6/TDES7 (RDES6/RDES7) запишет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 6 minutes ago, SSerge said: Зато написано про "Enhanced Tx DMA descriptors" и "Enhanced Rx DMA descriptors format with IEEE1588 time stamp". т.е. самому читать эти регистры не нужно, DMA в процессе приёма/передачи их само прочитает и в поля TDES6/TDES7 (RDES6/RDES7) запишет. Я этот таймер счетчик использую еще и как системное время ))) Типа вместо SysTick. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 53 minutes ago, dimka76 said: А как вариант с LDRD ? Не прокатит ? А чем LDRD лучше? Всё равно регистры будут читаться по очереди. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 3 часа назад, dimka76 сказал: А как вариант с LDRD ? Не прокатит ? А разрядность шины к регистрам периферии в вашем МК какова? 32 бита? Как тогда она поможет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 13 февраля, 2020 Опубликовано 13 февраля, 2020 · Жалоба 16 hours ago, scifi said: А чем LDRD лучше? Всё равно регистры будут читаться по очереди. 13 hours ago, jcxz said: А разрядность шины к регистрам периферии в вашем МК какова? 32 бита? Как тогда она поможет? Да, примерно это я и ожидал услышать ))) Тогда остается делать только как советовал scifi uint32_t low, high, high2; high = ETH->PTPTSHR; do { high2 = high; low = ETH->PTPTSLR; high = ETH->PTPTSHR; } while (high != high2); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться