Калибровка часов stm32f103

Тема в разделе "Arduino & Shields", создана пользователем k008, 31 авг 2024.

Метки:
  1. k008

    k008 Нерд

    Подскажите как можно сделать калибровку часов в stm32f103.
    Сейчас работаю так:
    Код (C++):
    #include <STM32RTC.h>
    STM32RTC& rtc = STM32RTC::getInstance();
    setup() {
        rtc.setClockSource(STM32RTC::LSE_CLOCK);
        rtc.begin(); // initialize RTC 24H format
    }
    Калибровка, и инициализация вроде как делается так:
    Код (C++):


    if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)  //Проверка работы часов, если не включены, то инициализировать
      {
      RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;  //Включить тактирование PWR и Backup
      PWR->CR |= PWR_CR_DBP;  //Разрешить доступ к Backup области
      RCC->BDCR |= RCC_BDCR_BDRST;  //Сбросить Backup область
      RCC->BDCR &= ~RCC_BDCR_BDRST;
      RCC->BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSE;  //Выбрать LSE источник (кварц 32768) и подать тактирование
      RCC->BDCR |= RCC_BDCR_LSEON;  //Включить LSE
      while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON){} //Дождаться включения
      BKP->RTCCR |= 3;  //калибровка RTC
      while (!(RTC->CRL & RTC_CRL_RTOFF));  //проверить закончены ли изменения регистров RTC
      RTC->CRL  |=  RTC_CRL_CNF;  //Разрешить Запись в регистры RTC
      RTC->PRLL  = 0x7FFF;  //Настроит делитель на 32768 (32767+1)
      BKP->RTCCR |= BKP_RTCCR_CCO;  //Включение вывода Temper
      RTC->CRL  &=  ~RTC_CRL_CNF;  //Запретить запись в регистры RTC
      while (!(RTC->CRL & RTC_CRL_RTOFF));  //Дождаться окончания записи
      RTC->CRL &= (uint16_t)~RTC_CRL_RSF;  //Синхронизировать RTC
      while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}  //Дождаться синхронизации
      PWR->CR &= ~PWR_CR_DBP;  //запретить доступ к Backup области
      }

     
    Но как правильнее будет делать калибровку, если использовать STM32RTC.h?
     
  2. k008

    k008 Нерд

    Никто не подскажет? Это действительно сложный вопрос?
     
  3. Igor68

    Igor68 Гуру

    Никто не подскажет, потому как требования и цели не ясны.
    Если это некий прерыватель с синхронизацией времени (для диагностики изоляции объектов например) то это одно, а иное не понятно.

    PS: В далёком прошлом делал подобное. В начальном этапе по включению часы учились "ходить" точно по сигналу GPS, потом они шагали сами даже без GPS. Смысл в том чтобы все устройства включали и выключали подачу защитные потенциалы от станций катодной защиты синхронно (даже) по всей стране. В момент отключения производилась диагностика. А что Вам надо не знаю. Если просто часы то надо подобрать параметры. Вроде какой-то из таймеров в ARM/Cortex умеет работать в режиме часов.
     
  4. k008

    k008 Нерд

    Задача простая, часы c точным временем. Вместо использования отдельных часов RTC, у stm32f103 есть свой RTC, но у него есть погрешность и возможность калибровки. Вот теперь и вопрос, как правильно его использовать на Arduino и используя библиотеку STM32RTC.h
     
  5. k008

    k008 Нерд

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

    Igor68 Гуру

    Я не понимаю в чем проблема. Настройте таймер и установите в его регистр (LD) нужное значение, которое будет автоматом загружаться в (VAL) при каждом прерывании. Я таймер настраивал на декремент и при нуле (VAL) происходило прерывание а из (LD) в (VAL) автоматом загружалось нужное значение. И всё начиналось заново.