реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32 библиотечный RTC_GetCounter, Исправление
podelkin
сообщение Feb 4 2013, 11:07
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 24-10-11
Пользователь №: 67 911



на мой взгляд теущая реализация 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;
}

Go to the top of the page
 
+Quote Post
nx6310
сообщение Feb 4 2013, 11:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Я использую эту конструкцию
Код
counter=(RTC->CNTH << 16)+RTC->CNTL
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 4 2013, 12:25
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Что говорит мануал о порядке вычитывания CNTH CNTL?
Go to the top of the page
 
+Quote Post
podelkin
сообщение Feb 4 2013, 12:30
Сообщение #4





Группа: Участник
Сообщений: 14
Регистрация: 24-10-11
Пользователь №: 67 911



Цитата(nx6310 @ Feb 4 2013, 15:11) *
Я использую эту конструкцию
Код
counter=(RTC->CNTH << 16)+RTC->CNTL


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

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


Молчит как партизан.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 4 2013, 13:12
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(podelkin @ Feb 4 2013, 15:07) *
предлогаю следующий вариант, что скажете? если
Вполне нормально на первый взгляд. Перепрочитать если тикнуло...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
podelkin
сообщение Feb 4 2013, 14:01
Сообщение #6





Группа: Участник
Сообщений: 14
Регистрация: 24-10-11
Пользователь №: 67 911



Родился более производительный вариант
Код
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;
}


Сообщение отредактировал podelkin - Feb 4 2013, 14:02
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 02:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016