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 ~ 1.2 秒ごとに 1 回点滅します。
プリスケーラと周期に関する私の理解は完全に間違っていますか、それとも何が欠けていますか?
編集: 216000-1 && 1000-1 目に見える違いはありません。正直なところ、私はこれについて完全な初心者なので、これをデバッグする方法がわからないため、通常の「壁」時計とは異なることを確認しています。残りのコードはありません。これがすべてです。STM Web サイトで STM32F769I の MCU が 216 で動作すると書かれているため、私は 216mHz で動作しているので、タイマーも同様であると想定しました。そうであるかどうかは、どこにも解読できませんでした。また、クロック周波数を設定できるタイマー構造体に設定が見つかりませんでした。