读取STM32定时器值

Joh*_*aby 3 c timer stm32

我正在使用 STM32F103 芯片,我正在尝试配置和使用其中一个定时器。我使用 STM32CubeMX 生成初始化定时器 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__);
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我主要尝试启动计时器并尝试打印出它的值。这是我用来执行此操作的代码:

__TIM2_CLK_ENABLE();;
HAL_TIM_Base_Start(&htim2);

while (true)
{
    Serial.println((long) __HAL_TIM_GetCounter(&htim2));
    delay(100);
}
Run Code Online (Sandbox Code Playgroud)

“Serial”类是我编写的一个类,它通过 USB 串行端口与我的 PC 进行通信。

ber*_*ing 7

不用HAL试试,并不复杂。

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

uint16_t read_TIM2() {
  return TIM2->CNT;
}
Run Code Online (Sandbox Code Playgroud)