我尝试使用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结构中找到任何可以设置时钟频率的设置。
答案 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)