2013年9月16日月曜日

STM32F1でTIMのパラメータ

STM32F1のTIMのパラメータ
この関数は引数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 件のコメント:

コメントを投稿