Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 15.03.2022, 16:12  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию STM32 счетчик миллисекунд

Здравствуйте. Мне нужно сделать штамп времени для передаваемых на комп данных. Счетчик должен быть в реальном времени с точностью до миллисекунды.

МК stm32f103c8t
Тут есть вроде как RTC но как я понял он не умеет считать до миллисекунд?
Или я ошибкаюсь??


В итоге я сделал в лоб:

Сделал таймер вот с такими параметрами:
Код:
void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 2;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 12000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

Скрин таймеров в приложении. Расчет времени прерывания такой:
48 000 000/2/12000 = 1000

То есть как я понимаю прерывание должно срабатывать 1000 раз в секунду.

Вот обработчик прерывания.
Код:
uint8_t TimeStamp[3];
uint8_t* SecTime = &TimeStamp[0];
int16_t* MillisecTime = (int16_t*) &TimeStamp[1];

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
	if (htim-›Instance == TIM3) {
		if ((*MillisecTime)++ › 999) {
			(*SecTime)++;
			(*MillisecTime) = 0;

			HAL_GPIO_WritePin(DEBUG_LED_GPIO_Port, DEBUG_LED_Pin, blink);
			blink = !blink;
		}
	}
}

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

Почему так?? Разве я не правильно рассчитал период??

Или может есть нормальный способ получить такой штамп от кварца реального времени?? Чтобы было максимально точно.

Спасибо.
Миниатюры:
Нажмите на изображение для увеличения
Название: hg.png
Просмотров: 0
Размер:	88.2 Кб
ID:	169964  
Реклама:
worldmasters вне форума  
Непрочитано 15.03.2022, 19:35  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

С такими настройками период 500 мкс. Увеличь период в 2 раза или предделитель в 2 раза.
realid вне форума  
Сказали "Спасибо" realid
mike-y-k (15.03.2022)
Непрочитано 15.03.2022, 20:44  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,583
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

Лучше systick по назначению - как системный таймер - использовать. Пусть себе эти миллисекунды и считает. Заодно во всех конечных автоматах, где нужны миллисекундные задержки, будет использоваться.
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Сказали "Спасибо" eddy
mike-y-k (15.03.2022)
Непрочитано 16.03.2022, 08:55  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

Сообщение от realid Посмотреть сообщение
С такими настройками период 500 мкс. Увеличь период в 2 раза или предделитель в 2 раза.

Нифига.
Увеличил. и теперь период вообще почти 2 секунды.

Код:
 htim3.Instance = TIM3;
  htim3.Init.Prescaler = 2;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 24000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {


Сообщение от eddy Посмотреть сообщение
Лучше systick по назначению - как системный таймер - использовать.
Это как? Есть пример?

Последний раз редактировалось worldmasters; 16.03.2022 в 10:27.
worldmasters вне форума  
Непрочитано 16.03.2022, 10:17  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,583
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

Сообщение от worldmasters Посмотреть сообщение
Есть пример?
В main.c заводим счетчик, обработчик прерывания и настраиваем таймер:
Код:
volatile uint32_t Tms;

void sys_tick_handler(void){
    ++Tms;
}

void main(){
...
  SysTick_Config(72000);
...
}
А где нужно - используем, например, так:
Код:
extern volatile uint32_t Tms;
...
void process_keys(){
    static uint32_t lastT = 0;
    if(Tms == lastT) return;
    uint16_t d = (uint16_t)(Tms - lastT);
    lastT = Tms;
...
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Эти 2 пользователя(ей) сказали Спасибо eddy за это сообщение:
mike-y-k (16.03.2022), worldmasters (16.03.2022)
Непрочитано 16.03.2022, 10:22  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

Я не знаю как в HAL обыграно с настройкой таймера, но предделитель всегда +1 от значения в регистре. То есть в текущей настройке это получается 3 и тогда с периодом 24000 получается 1,5 мс на период. Надо попробовать установку предделителя сделать 1.
realid вне форума  
Эти 2 пользователя(ей) сказали Спасибо realid за это сообщение:
mike-y-k (16.03.2022), worldmasters (16.03.2022)
Непрочитано 16.03.2022, 10:27  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Re: STM32 счетчик миллисекунд

Сообщение от realid Посмотреть сообщение
Я не знаю как в HAL обыграно с настройкой таймера, но предделитель всегда +1 от значения в регистре. То есть в текущей настройке это получается 3 и тогда с периодом 24000 получается 1,5 мс на период. Надо попробовать установку предделителя сделать 1.
Ну да.. с прескалером 1 все заработало как положено.
Код:
 htim3.Init.Prescaler = 1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 24000;
worldmasters вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6166 19.02.2024 18:22
Публикации КОМПЭЛ КОМПЭЛ Электроника - это просто 294 11.08.2023 18:12
Драйвер (не VCP) для встроенного USB STM32 vvv998 ARM 106 08.11.2014 21:36
Эл. счетчик СОЭ-5/50-Т-112 Electric75 Производственное оборудование 4 12.10.2011 09:05
Счетчик количества просмотров slavar1 Обсуждение сайта и форума 4 07.01.2011 20:56


Часовой пояс GMT +4, время: 19:55.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot