SysTickシステムタイマティック

24ビットのカウントダウンタイマー、カウントをゼロに、初期値のオートリロードレジスタリロードタイミングから。それはSysTick制御およびステータスレジスタビットがクリアされ、それはまだ立っていないしない限り、スリープモードでも動作することができます。

 

4つのレジスタ:

CTRL SysTick制御およびステータスレジスタ 

LOADのSysTickオートリロードレジスタ値加算 

VAL SysTick現在値レジスタ 

CALIB SysTick較正値レジスタ

 

 

クロックソースの選択CTRL:

 HAL_SYSTICK_CLKSourceConfig(のuint32_t CLKSOURCE)

パラメータは埋めることができます:SYSTICK_CLKSOURCE_HCLKとSYSTICK_CLKSOURCE_HCLK_DIV8 8や貧しい人々を、周波数によらず

 

(割り込み開口部に設けられたクロックソースがのSysTick設定荷重値を有効に)発生する割り込みマダニの一周期後

__STATIC_INLINEのuint32_t SysTick_Config(のuint32_tティック)
{ 
  もし、((ダニ- 1UL)> SysTick_LOAD_RELOAD_Msk)
  { 
    リターン1UL)。                                                   / * リロード値不可能* / 
  } 

  のSysTick - > LOAD =(のuint32_t)(ダニ- 1UL)。                         / * セットリロードレジスタ* / 
  NVIC_SetPriority(SysTick_IRQn、(1UL << __NVIC_PRIO_BITS) - 1UL)。/ * のSysTick割り込みの設定優先順位* / 
  のSysTick - > VAL =0UL ;                                             / * ロードのSysTickカウンタ値* / 
  のSysTick - > CTRL = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk    | 
                   SysTick_CTRL_ENABLE_Msk;                         / * SysTickのIRQとのSysTickタイマ・イネーブル* / 
  リターン0ULを)。                                                     / * 関数の成功* / 
}

 

 

// システムクロック周波数格納するために使用される
静的 U32 fac_us = 0 ;                             // 米国遅延時間乗数



// 初期遅延関数
 // この関数UCOS UCOSクロックパルスを初期化するとき
 @ のSysTick固定クロックAHBクロック1/8
 // SYSCLK:システムクロック周波数
ボイドdelay_init(U8 SYSCLK)を
{ 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); // のSysTick周波数HCLKの 
    fac_us = SYSCLK;                             // かかわらずかどうかOS、使用にfac_us必要が
}     


// 鋳造NUSとき
 // NUSは、私たちの数は、遅延にしたいです。    
 // 注:NUS 1000us以下の値が
無効delay_us(U32のNUS)を 
{        
    マダニU32、
    U32は、TNOW、TCNT語ら = 0 ; // TCNTを最後に使用されるサイクルの現在の数を格納するために使用され、比較ティック
    U32リロードを ; = SysTick-> LOAD                 // 負荷値リロード値がこの数値を達成するために後にリセットされますカウンタ   	           
    = NUS * fac_usダニ;                          // ビートの必要数 
    = SysTick-> VAL語っ;                         // カウンタ値VALだけに格納されて語らに入るときに
    、一方1 
    { 
        TNOW = SysTick-> VAL;    
         IF(TNOW =!告げ)//場合は、オーバーロードされていない
        {         
            IF(TNOWが<語ら)+ =語ら-TCNT TNOW;     //ここで注目すべきは、ダウンカウンタのSysTickがそれです。
            他の TCNTリロード-TNOW + + = トールド; <TNOWが過負荷状態の後に//語った
            語った = ; TNOW
             IF(=ティックTCNT)> BREAKを ;             // 時間よりも/に等しいです遅延時間、出口へ
        }   
    }; 
} 
 
// 遅延NMS
 @ NMS:MSが数に遅延
空隙Delay_ms(U16 NMS)
{ 
    U32 I; 
    のために(私は= 0 ; I <NMS; I ++)delay_us (1000年); 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

(!TNOWは言わ。=)IF {     //まだ過負荷にならない(TNOWは<語った)場合ケース{ //これはその上にダウンカウンタノートのSysTickであり、TCNT + =語った-TNOWを} //それ以外はトールド<過負荷状態TNOW後{ TCNT + =語っ+リロード-TNOW;     } 語っ= TNOW; IF(TCNT> =ティック)BREAK; //時間よりも/その後、終了、遅延時間に等しいです}  

おすすめ

転載: www.cnblogs.com/qifeng1024/p/12052284.html