STM32F769I-DISCO上的1s计时器

时间:2017-07-27 17:58:02

标签: c timer embedded stm32 stm32f7

我尝试使用STM32 HAL库在STM32F69I发现板上设置1s LED闪烁。我按照以下方式设置了我的计时器:

__TIM2_CLK_ENABLE();
s_TimerInstance.Init.Prescaler = (216000);
s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
s_TimerInstance.Init.Period = (1000);
s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
s_TimerInstance.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&s_TimerInstance);
HAL_TIM_Base_Start(&s_TimerInstance);

然后我将我的LED切换为:

int main() {
    for (;;) {
        int timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
        if (timerValue == 800)
            HAL_GPIO_WritePin(GPIOJ, (LED_GREEN | LED_RED), GPIO_PIN_SET);
        if (timerValue == 1000)
            HAL_GPIO_WritePin(GPIOJ, (LED_GREEN | LED_RED), GPIO_PIN_RESET);
        }
}

MCU时钟应为216 mHz。我的逻辑是,如果我将预分频器设置为216000,则意味着我的定时器每秒将产生216000000/216000 = 1000个增量。这意味着,如果我将周期设置为1000,我的LED应该每秒闪烁一次。然而,它们每1.1-1.2秒闪烁一次。

我对预分频器和时期的理解是完全错误还是我错过了什么?

编辑:216000-1&& 1000-1没有任何明显的差异。说实话,我是一个完全的初学者,所以我通过看到它与正常的墙壁不同来证实这一点。时钟,因为我不知道如何调试这个。没有剩下的代码,这就是全部。我在216mHz运行,因为它在STM网站上说STM32F769I的MCU运行在216,所以我假设我的计时器也是。如果是这样的话,无法在任何地方真正破译。我也没有在timer结构中找到任何可以设置时钟频率的设置。

2 个答案:

答案 0 :(得分:3)

STM32F769NI最高可以运行216 MHz,但在复位时,它默认选择16 MHz内部RC振荡器。请参阅the datasheet的第2.15节。

TIM2具有16位预分频器。请参见数据表的第2.23.2节。

216000(0x34BC0)太大,无法放入16位预分频器。在你的程序中,它被截断为0x4BC0或19392。

16 MHz / 19392 = 825.1 Hz或每秒0.001212个刻度。

每秒0.001212个刻度乘以1000刻度= 1.212秒。

将预分频器更改为(16000 - 1),因为您的时钟实际上是以16 MHz而不是216 MHz运行。

答案 1 :(得分:0)

请尝试使用这个非常复杂的代码:

TIM2 -> PSC = 21600 - 1;
TIM2 -> EGR = TIM_EGR_UG;
TIM2 -> CR1 |= TIM_CR1_CEN;

while(1) {
    if(TIM2 -> CNT >= 10000) 
    {
        TIM2 -> CNT = 0;
        ToggleLed();
    }
}

将ToggleLed替换为您的实际代码(当然会切换LED)