私は、DAC正弦波生成を駆動するためにSTM32f3ディスカバリボードにタイマ8を使用しています。ここに私のタイマーの設定があります:非正確なSTM32F303VCタイマクロック
TIM_TimeBaseInitTypeDef timer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&timer);
timer.TIM_CounterMode = TIM_CounterMode_Up;
//Setting prescaler so that timer clock will be only 64000Hz
timer.TIM_Prescaler = 1125;
//Setting period so Timer will give signal of frequency 1000Hz
timer.TIM_Period = 10;
TIM_TimeBaseInit(TIM6, &timer);
//generate event when counter hits TIM_period value
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
/* TIM2 enable counter */
TIM_Cmd(TIM6, ENABLE);
クロックは72MHzと仮定します。
正弦波の周波数を測定すると、100Hzではなく90Hzと表示されます。私はAPB1クロックのクロック周波数を計算すると、それは非常に奇妙に見える64.8MHzに等しいということになる。私はlcockの設定を変更することはありませんでした。デフォルトはすべてです。
システムクロックコアは72MHzです(RCC_GetClocksFreqコマンドを使用して確認してください)。
これはどこから来たのですか?
_ "私はクロックが72MHzに等しいと仮定しています。" _あなたは本当にそれを前提にする必要があります。 PLLをこのように設定した場合は72MHz _only_、正確な外部発振器を使用する場合は_only_となります。内部のHSE RC発振器は幅広い変動を持ち、温度安定性はありません。標準のCMSISスタートアップコードを使用する場合、PLLはsystem_stm32f3xx.c 'SystemInit()'で設定されます。 _nominal_クロック周波数はグローバル 'SystemCoreClock'に格納されます。 – Clifford
'SystemCoreClock'の点でプリスケーラを計算する方が良いかもしれませんが、ABP1クロック周波数は異なるクロック設定への移植性の点でより良いでしょう。 – Clifford