1

我正在尝试使用 STM32 HAL 库在 STM32F69I 发现板上设置 1 秒 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 上运行,所以我假设我的计时器也是。如果是这样的话,在任何地方都无法真正破译。我也没有在计时器结构中找到任何可以设置时钟频率的设置。

4

2 回答 2

3

STM32F769NI 可以在最大 216 MHz 下运行,但在复位时默认选择 16 MHz 内部 RC 振荡器。请参阅数据表的第 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。

于 2017-07-28T03:09:24.237 回答
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)

于 2017-07-27T20:25:19.693 回答