读取STM32定时器值

时间:2018-05-11 01:10:11

标签: c timer stm32

我正在使用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' class是我写的一个类,它通过USB串口与我的PC通信。

4 个答案:

答案 0 :(得分:3)

在没有HAL的情况下尝试,它并不复杂。

<main class="container-fluid">
<div class="row">
    <section class="col-lg-2 sidenav">
      <div class="row">
        <div class="col-lg-12">
  "       <div class="input-group">
            <input data-bind="textInput: filter, valueUpdate: 'keyup'"
             type="text" class="form-control" placeholder="Filter Places"
             aria-describedby="basic-addon2" id="test">
          </div>
        </div>
        <div class="col-lg-12">
          <hr>
          <div data-bind="foreach: filterList">
            <p data-bind="text: $data.title"></p>
          </div>
        </div>
      </div>
    </section>
    <section class="col-lg-10" id="map"></section>
</div>

答案 1 :(得分:0)

设置值

htim2.Init.Period = 0;

零初始化自动重载寄存器(ARR)不是cubeMX的非常方便的默认选择,您可能希望ARR值为0xFFFFFFFF

接受0xFFFFFFFF重置后的ARR值取决于它的ARR值而没有提及,如果您问我,运气比智慧更重要

答案 2 :(得分:0)

ARR(htim2.Init.Period)不应为0。它将尝试计数直到... 0!在此放置一些16位整数。祝你好运!

答案 3 :(得分:0)

我将向您展示一些需要牢记的公式:(参考:AN4776)

. Frequency = Fclk(timer) / (prescaler + 1)

例如,您选择 prescaler = 0,这意味着您的计时器在 1 / 80MHz 的周期内完成计数 [0: count),以防 SystemClock 如此配置(您应该检查时钟的值和确定更新频率的预分频器)。

. #1_count(s) = 1 / Frequency

. period(s) = #1_count * (counter + 1) 

--> 举个例子:

SystemClock = 72MHz,需要 1us 分辨率定时器和 1ms 周期。

。对于 1us 的分辨率 -> 频率 = 1Mhz

'1MHz = 72MHz / (prescaler + 1)' -> prescaler = 71 

。以便计时器每 1 毫秒中断一次,我们必须计算它应该计数多少:

'1ms = 1us * (counter + 1)' -> count = 999

使用这些值,我们配置以下内容:

htim2.Init.Prescaler = 71;

htim2.Init.Period = 999;

计时器将从 0 开始计数:999,步长为 1uS。

你的代码有两个问题,定时器频率太高,只从0:1开始计数,所以你永远看不到计数的增加。