Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 библиотечный RTC_GetCounter
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
podelkin
на мой взгляд теущая реализация RTC_GetCounter в стандартной библиотеки от ST не совсем корректная
и при переполнении нижнего 16 битного регистра может вернутся неверное значение (что происходит примерно раз в 18 часов)

Код
uint32_t RTC_GetCounter(void)
{
  uint16_t tmp = 0;
  tmp = RTC->CNTL;
  return (((uint32_t)RTC->CNTH << 16 ) | tmp);
}


предлогаю следующий вариант, что скажете? если

Код
uint32_t RTC_GetCounter(void)
{
  uint32_t counter;
  uint16_t tmp;

  do
  {
    tmp = RTC->CNTL;
    counter = (((uint32_t)RTC->CNTH << 16 ) | tmp);
  } while(tmp != RTC->CNTL);

  return counter;
}

nx6310
Я использую эту конструкцию
Код
counter=(RTC->CNTH << 16)+RTC->CNTL
IgorKossak
Что говорит мануал о порядке вычитывания CNTH CNTL?
podelkin
Цитата(nx6310 @ Feb 4 2013, 15:11) *
Я использую эту конструкцию
Код
counter=(RTC->CNTH << 16)+RTC->CNTL


Ничем не лучше, на мой взгляд.

Цитата
Что говорит мануал о порядке вычитывания CNTH CNTL?


Молчит как партизан.
demiurg_spb
Цитата(podelkin @ Feb 4 2013, 15:07) *
предлогаю следующий вариант, что скажете? если
Вполне нормально на первый взгляд. Перепрочитать если тикнуло...
podelkin
Родился более производительный вариант
Код
uint32_t RTC_GetCounter(void)
{
  uint32_t counter;
  uint16_t tmp;

  do
  {
    tmp = RTC->CNTH;
    counter = (((uint32_t)tmp << 16 ) | RTC->CNTL);
  } while(tmp != RTC->CNTH);

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