Jump to content

    
Sign in to follow this  
dimka76

STM32F4xx IEEE1588

Recommended Posts

Здравствуйте.

Если кто-нибудь использовал 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 ?

Или я чего-то не понимаю ?



 

Share this post


Link to post
Share on other sites

Как-то так:

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

Share this post


Link to post
Share on other sites
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) запишет.

Share this post


Link to post
Share on other sites
6 minutes ago, SSerge said:

Зато написано про "Enhanced Tx DMA descriptors" и "Enhanced Rx DMA descriptors format with IEEE1588 time stamp".

т.е. самому читать эти регистры не нужно, DMA в процессе приёма/передачи их само прочитает и в поля TDES6/TDES7 (RDES6/RDES7) запишет.

Я этот таймер счетчик использую еще и как системное время ))) Типа вместо SysTick.

Share this post


Link to post
Share on other sites
3 часа назад, dimka76 сказал:

А как вариант с LDRD ? Не прокатит ?

А разрядность шины к регистрам периферии в вашем МК какова? 32 бита? Как тогда она поможет?

Share this post


Link to post
Share on other sites
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);

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this