この関数は引数1で与えた周波数になるように引数2と引数3のポインタにパラメーターを書き込む
// 0:成功
// 1:システムクロックで割り切れない周波数
// 2:プリスケーラの設定中に丸め誤差が発生した
uint8_t TIM_GetFreqencyPrameter(uint32_t Freqency, uint16_t *pPeriod, uint16_t *pPrescaler) {
const uint32_t cSysFreq = 72 * 1000 * 1000;
uint32_t per, pre;
if (cSysFreq % Freqency) { return(1); }
per = cSysFreq / Freqency;
pre = 1;
while (per > 0xFFFF) { per /= 10; pre *= 10; }
if ((cSysFreq / per / pre) != Freqency) { return(2); }
*pPeriod = per - 1;
*pPrescaler = pre - 1;
return(0);
}
なおシステム周波数はcSysFreq変数に設定され、この例では72MHzとなっている計算上完璧な周波数以外は1or2が返される
正常な場合は0が返され、ポインタに値が設定される
とりあえず軽く動作確認はしていますが、使うときは自己責任でどーぞ
例えば7Hzや11Hzは作成できません
11Hzは整数で割り切ることができないので1が帰ります
7Hzは整数で割り切ることができますが、0xFFFFより大きな数字になってしまうため、丸め誤差エラーが発生し2が帰ります
ラッパー関数を作ればサクッとタイマの初期化もできますが、信頼性は低いのであまり多様しないように
0 件のコメント:
コメントを投稿