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