Чтение значения таймера STM32 - PullRequest
0 голосов
/ 11 мая 2018

Я использую микросхему STM32F103 и пытаюсь настроить и использовать один из таймеров. Я использовал STM32CubeMX для генерации кода, который инициализирует Timer 2. Я запускаю таймер, вызывая HAL_TIM_Base_Start. Затем в цикле я распечатываю текущее значение таймера с помощью вызова htim2.Instance-> CNT или поочередно, вызывая макрос __HAL_TIM_GetCounter (который, я считаю, просто возвращает то же значение). Однако, независимо от того, что я делаю, значение счетчика отображается как ноль. Я также попытался вызвать __TIM2_CLK_ENABLE () в начале, но это не имеет значения.

Я искал решение и нашел пару вопросов по этой проблеме, но не нашел решения.

Кто-нибудь знает, что я делаю неправильно?

Спасибо.

Вот процедура, которая инициализирует таймер. Этот код был сгенерирован STM32CubeMX, и я не изменил его:

/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

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

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

}

Затем в основном я пытаюсь запустить таймер и попытаться распечатать его значение. Вот код, который я использую для этого:

__TIM2_CLK_ENABLE();;
HAL_TIM_Base_Start(&htim2);

while (true)
{
    Serial.println((long) __HAL_TIM_GetCounter(&htim2));
    delay(100);
}

Класс «Serial» - это класс, который я написал и который связывается с моим ПК через последовательный порт USB.

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Установка значения

htim2.Init.Period = 0;

ноль инициализирует регистр автоматической перезагрузки (ARR), не очень удобный выбор по умолчанию для cubeMX, вы, вероятно, хотите, чтобы значение ARR составляло 0xFFFFFFFF

Принятый ответ опирается на значение ARR после сброса 0xFFFFFFFF, не упоминая его, больше удачи, чем мудрости, если вы спросите меня

0 голосов
/ 31 марта 2019

ARR (htim2.Init.Period) не должно быть 0. Он будет пытаться считать до ... 0! Поместите туда 16-битное целое число. Удачи!

0 голосов
/ 11 мая 2018

Попробуйте без HAL, это не сложно.

void start_TIM2() {
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
  TIM2->CR1 |= TIM_CR1_EN;
}

uint16_t read_TIM2() {
  return TIM2->CNT;
}
...