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

STM32F4 чтение регистра SSR из RTC

Пытюсь получать значения субсекунд от RTC

сделал тестовую функцию которая запускается в произвольный момент и вызывает 5 чтений SSR через паузы 1 миллисекунду

времени по приходу команды

 

void RTC_TEST(void)
{
  volatile unsigned int ssr[5]={0};
  ssr[0] = RTC_GetSubSecond();
  delay1ms();
  ssr[1] = RTC_GetSubSecond();
  delay1ms();
  ssr[2] = RTC_GetSubSecond();
  delay1ms();
  ssr[3] = RTC_GetSubSecond();
  delay1ms();
  ssr[4] = RTC_GetSubSecond();
 
  asm("NOP");
  asm("NOP");
  asm("NOP");
 
}

далее там где нопы ставлю точку останова и в отладчике смотрю массив ssr.

разности соседних значений ssr в массиве соответствуют одной миллисекунде задержки

!!!! НО !!!!

Далее продолжив программу  снова запускаю функцию внешней командой и получаю опять

5 значений в массиве ssr, Причем самое первое ssr[0] всегда примено равно

предыдущему значению ssr[0] из предыдущего запуска функции.

Как так получается, я ведь запускаю в совершенно разные мометнты времени и миллисекунды тоже должны быть произвольные ?

Вот например пример результатов запуска несколько раз этой функции:

первый запуск

10944, 10924, 10903, 10883, 10862

второй запуск

10969, 10949, 10928, 10908, 10877

третий запуск

10981, 10961, 10940, 10920, 10900

Модератор: код прячем в теги, пустые строки в большом количестве не оставляем!

 

Изменено пользователем haker_fox
Оформление поправил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему они длжны отличаться если вы в начале обнуляете массив! перед чтением первого значения нет задержки 1мс и значение должно быть всяко разно меньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/9/2022 at 1:23 PM, kumle said:

Как так получается

Возможно как то синхронизируется.

Попробуйте, между попытками, добавить случайные задержки и выполнить пять запросов за один запуск.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, выяснил.  Поставил вызов в прерывание и сразу при каждом вызове значения были разные !!!

А до этого вызов был в бесконечном цикле в main, а так как RTC от часового кварца, то видимо засинхронизировался с тактами контроллера

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы Вы показали инициализацию RTC, гадать было бы проще. У мну почему-то получается (для дефолтного RTC_PRER), что RTC у Вас тактируется от ~ 50 кГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот моя инициализация RTC

void RTC_Config(void)
{
  /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  
  /* Allow access to RTC */
  PWR_BackupAccessCmd(ENABLE);
 
//  if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)
//  {
    // Сброс данных в резервной области
//    RCC_BackupResetCmd(ENABLE);
//    RCC_BackupResetCmd(DISABLE);
   
    RCC_LSEConfig(RCC_LSE_ON);
  
    /* wait till lse is ready */  
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
    {
    }

    /* Select the RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  
    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);
  
    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();
  
    /* Configure the RTC data register and RTC prescaler */
    //из даташита: F=Frtcosc/((div_a+1)x(div_s+1))=32768/((1+1)*(16383+1))=1Hz
    //при этом subsecond точность будет равна 1/16384=61,035мкс !!!
    RTC_InitStructure.RTC_AsynchPrediv = 1; 
    RTC_InitStructure.RTC_SynchPrediv = 16383;
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_12;
  
    /* Check on RTC init */
    if (RTC_Init(&RTC_InitStructure) == ERROR)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
  
    /* Enable The TimeStamp */
    //RTC_TimeStampCmd(RTC_TimeStampEdge_Falling, ENABLE); 
//  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 LSB RTC_SSR при таком RTC_PRER действительно будет соответствовать 1/LSE_CLK*2.
А если в PREDIV_A вписать 0, то 1 LSB RTC_SSR вообще получится 1/LSE_CLK.
Но точность этой 1 будет определяться только точностью LSE_CLK.

(на всякий случай)

Note:


When both prescalers are used, it is recommended to configure the asynchronous prescaler
to a high value to minimize consumption.

И лучше сразу придумать какой-нить выход по таймауту из цикла ожидания готовности LSE.

По исходному вопросу у меня только одно предположение: т.к. RTC_SSR обнуляется только в трёх случаях, то за ~ 0.33 с до вызова RTC_TEST() приключался один из этих случаев.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...