Timer(定時器)

剑客温华發表於2024-09-06

定時器介紹

  是一個內設計時裝置,到時間就會觸發中斷,
  STC8內設有5個16位定時器,timer0~timer4,當定時器數到65536(2^16)時觸發中斷
  timer0有4種工作模式:模式0(16位自動重灌載模式),模式1(16位不可重灌載模式),模式2(8位自動重灌模式),模式3(不可遮蔽中斷的16位自動重灌載模式)
  timer1有3種工作模式:模式0(16位自動重灌載模式),模式1(16位不可重灌載模式),模式2(8位自動重灌模式),timer1在模式 3時無效,停止計數。
  timer2的工作模式固定為16位自動重灌載模式。timer2可以當定時器使用,也可以當串列埠的波特率發生器和可程式設計時鐘輸出。
  timer3、timer4與timer2一樣,它們的工作模式固定為16位自動重灌載模式。timer3、timer4 可以當定時器使用,也可以當串列埠的波特率發生器和可程式設計時鐘輸出。

時鐘週期

 時鐘週期是系統時鐘一個完整的週期所需的時間。它的倒數就是時脈頻率,即每秒鐘發生的時鐘週期數。STC8H的時脈頻率為24MHz,
  1s / 24MHz,1000 000 000ns / 24 000 000 = 41.67ns

機器週期

  也叫做指令週期。指令週期是一條指令的執行時間。現在的STC8H可以有兩種配置,一個是1T,一個是12T
  1T也就是處理一條指令的時間為1個時鐘週期,為41.67ns,12T也就是處理一條指令的時間為12個時鐘週期,為12 * 41.67ns

原理

 已知STC8微控制器使用的是16位的定時器/計數器,計數範圍是0-65535,當16位全部存1之後再計數1,就會觸發中斷
  65535 * 41.67ns = 2.73ms,也就是從0開始到這個觸發中斷也就是2.73ms
//配置定時器
void TIMER_Config(){
    TIM_InitTypeDef init;
	init.TIM_Mode = TIM_16BitAutoReload;
     //工作模式,TIM_16BitAutoReload(自動重置為0),TIM_16Bit(手動重置),TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	init.TIM_ClkSource = TIM_CLOCK_1T;	
     //時鐘源,TIM_CLOCK_1T(41.67us),TIM_CLOCK_12T(12 * 41.67us),TIM_CLOCK_Ext(外部時鐘源)
	init.TIM_ClkOut = ENABLE;
     //可程式設計時鐘輸出,ENABLE,DISABLE(ENABLE觸發中斷時會在P35輸出高低電平訊號)
	init.TIM_Value = 65536 - (MAIN_Fosc / 1000);
     /*裝載初值
     16位定時器存放範圍是0-65535,我們用的板子頻率是24M,1s數24000000個數,1ms數24000個數
     所以為了計時比較準確就讓定時器數24000就觸發中斷,也就是每過1ms就觸發中斷
     就是從65536 - 24000 數到65536就是1ms的時間,就觸發一次中斷
     但不能直接寫24000,因為不同的微控制器的時鐘主頻是不同的,為了程式碼的可移植性
     MAIN_Fosc是config檔案中宏定義的時鐘主頻,(MAIN_Fosc / 1000)是根據不同時鐘主頻計算出的1ms所數的數
     */	
	init.TIM_Run = ENABLE;
     //是否執行	ENABLE,DISABLE。
    Timer_Inilize(Timer0,&init);
    //呼叫初始化函式
    NVIC_Timer0_Init(ENABLE,Priority_1);
    /*
    開啟中斷使能,配置中斷優先順序
    配置優先順序注意事項:
    1、當使用同一個定時器時最好是把其他使用此定時器且想要實現的功能中斷優先順序抬高,不然每過1ms觸發中斷,可能會打斷想實現的功能
    2、當優先順序相同時會根據次序來決定中斷的高低
    3、此時,就需要去查詢手冊的同級中斷優先順序中斷查詢次序表,次序在前優先中斷
    */
}
//中斷觸發時,會執行定時器0的中斷函式,也就是每到1毫秒就會觸發下面的中斷函式
//========================================================================
// 函式: Timer0_ISR_Handler
// 描述: Timer0中斷函式.
// 引數: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
/*
interrupt是中斷函式的標誌,表示這個函式是中斷函式
TMR0_VECTOR是中斷向量,每個中斷源都有對應的處理程式,這個處理程式稱為中斷服務程式,其入口地址稱為中斷向量。所有中斷的中斷服務程式入口地址構成一個表,稱為中斷向量表;也有的機器把中斷服務程式入口的跳轉指令構成一張表,稱為中斷向量跳轉表。
*/
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR//進中斷時已經清除標誌
{
    
}

相關文章