一、定時器
定時器是一種計時裝置,通常由一個晶體振蕩器提供時鐘信號,可以計時一定的時間后執行相應的操作。在單片機中,定時器一般是由計數器和時鐘源組成的,可以用來產生一定時間間隔的中斷信號,或者用于測量輸入信號的周期和占空比等。定時器通常具有多種工作模式和計數方式,可以靈活地應用于各種場合。
STC8H內置了5個16位定時器:T0,T1,T2,T3,T4.
二、Timer案例
使用定時器,控制板載LED高低電平輸出。
#include "Config.h"
#include "Timer.h"
#include "GPIO.h"
#include "NVIC.h"void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure; //結構定義GPIO_InitStructure.Pin = GPIO_Pin_3; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P5, &GPIO_InitStructure); //初始化
}
//int arr[];
//int counter = 3;void TIMER_config(void) {TIM_InitTypeDef TIM_InitStructure; //結構定義//定時器0做16位自動重裝, 中斷頻率為100000HZ,中斷函數從P6.7取反輸出50KHZ方波信號.TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定時鐘源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut = DISABLE; //是否輸出高速脈沖, ENABLE或DISABLETIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); // 初值,指定Timer頻率 1000hz (每秒執行1000次,每次1ms(周期))// 不要小于367hz (2.7ms周期)// 不要大于1 000 000hz 一百萬 (1us周期)TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后啟動定時器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4NVIC_Timer0_Init(ENABLE,Priority_0); //中斷使能, ENABLE/DISABLE; 優先級(低到高) Priority_0,Priority_1,Priority_2,Priority_3}
void main(){GPIO_config();TIMER_config();// 開啟全局中斷EA = 1;P53 = 0; // 熄燈while(1);
}
Timer_Isr.c
//========================================================================
// 函數: Timer0_ISR_Handler
// 描述: Timer0中斷函數.
// 參數: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //進中斷時已經清除標志
{// TODO: 在此處添加用戶代碼P53 = ~P53;
}
三、定時器配置理解
工作模式
工作模式指的是計數方式,timer的計數是在主頻計數的基礎上,來進行數數的。timer有16位的計數器,通過計數器來計數來確定定時器運行的時長,在關鍵位置觸發定時中斷。
●16位自動重裝載模式:可以被設置成定時或者計數兩種模式,每當定時器溢出時就會觸發中斷或者輸出信號。
●16位不可重裝載模式:計數值達到設定值后,定時器就會停止計數,需要重新初始化才能繼續計數。
●8位自動重裝載模式:8位計數器溢出時觸發中斷或輸出信號。
●不可屏蔽中斷的16位自動重裝載模式:16位計數器溢出時觸發中斷或輸出信號,并且可以通過軟件或硬件方式清除定時器計數器的值。
通常使用16位自動重裝載模式.
中斷配置
中斷配置是為了打開中斷開關的,從而可以觸發中斷回調的,如果不配置,將無法觸發中斷回調。
時鐘源
可配置的是重要有兩個:
●1T: 跟隨主頻。
●12T: 進行12分頻。
是否輸出高速脈沖
TIM_ClkOut,可以配置DISABLE或者ENABLE
如果配置ENABLE,則P3.5端口會同步輸出時鐘脈沖
時鐘周期設置
時鐘周期指的是1秒鐘執行多少次timer中斷。時鐘周期=時鐘源頻率1?
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 10000UL);
以上配置中,TIM_InitStructure.TIM_Value
最終會轉化位寄存器配置。
其中,10000UL
表示的就是時鐘周期,意思就是這個timer回調1秒鐘要調用 10000
次。
注意時鐘周期的取值范圍,通過以上數學公式,(MAIN_Fosc / Timer頻率)
不能大于65536UL
;理論上時鐘周期可以無限大,經過測試,最大值為500000UL
,也就是2us
調用1次。但是,我們要考慮到,如果timer設置到這么高的頻率,你在回調中執行的代碼時長就不能超過這個值。如果是24M主頻,1個時鐘周期為 1/24MHz=41.67ns,但是一個指令通常由多個時鐘周期組成,一段代碼又由多個指令組成,這么一算,可做的操作就很少了。因此我們不要設置得那么大。
啟動配置
配置定時器的啟動