STM32F769I-DISCO 上的 1s 定时器
1s timer on STM32F769I-DISCO
我正在尝试使用 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 没有任何明显的区别。老实说,我是这方面的初学者,所以我通过观察它与普通 "wall" 时钟的不同来确认这一点,因为我不知道如何调试它。没有剩余的代码,仅此而已。我在 216mHz 上 运行 因为它在 STM 网站上说 STM32F769I 的 MCU 在 216 上运行,所以我假设我的定时器也是。如果是这样,则无法在任何地方真正破译。我也没有在计时器结构中找到任何可以设置时钟频率的设置。
试试这个非常复杂的代码:
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)
STM32F769NI 可以 运行 最大频率为 216 MHz,但在复位时它默认选择 16 MHz 内部 RC 振荡器。请参阅 the datasheet.
的第 2.15 节
TIM2 有一个 16 位预分频器。请参阅数据表的第 2.23.2 节。
216000 (0x34BC0) 太大,无法放入 16 位预分频器。在您的程序中,t运行cated 为 0x4BC0 或 19392。
16 MHz / 19392 = 825.1 Hz 或每秒 0.001212 个刻度。
0.001212 刻/秒乘以 1000 刻 = 1.212 秒。
将您的预分频器更改为 (16000 - 1),因为您的时钟实际上 运行ning 为 16 MHz,而不是 216 MHz。
我正在尝试使用 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 没有任何明显的区别。老实说,我是这方面的初学者,所以我通过观察它与普通 "wall" 时钟的不同来确认这一点,因为我不知道如何调试它。没有剩余的代码,仅此而已。我在 216mHz 上 运行 因为它在 STM 网站上说 STM32F769I 的 MCU 在 216 上运行,所以我假设我的定时器也是。如果是这样,则无法在任何地方真正破译。我也没有在计时器结构中找到任何可以设置时钟频率的设置。
试试这个非常复杂的代码:
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)
STM32F769NI 可以 运行 最大频率为 216 MHz,但在复位时它默认选择 16 MHz 内部 RC 振荡器。请参阅 the datasheet.
的第 2.15 节TIM2 有一个 16 位预分频器。请参阅数据表的第 2.23.2 节。
216000 (0x34BC0) 太大,无法放入 16 位预分频器。在您的程序中,t运行cated 为 0x4BC0 或 19392。
16 MHz / 19392 = 825.1 Hz 或每秒 0.001212 个刻度。
0.001212 刻/秒乘以 1000 刻 = 1.212 秒。
将您的预分频器更改为 (16000 - 1),因为您的时钟实际上 运行ning 为 16 MHz,而不是 216 MHz。