//文件timer5.h #ifndef _timer5_H_ #define _timer5_H_ #define TIM5_DIV1 (uint8)0 #define TIM5_DIV2 (uint8)1 #define TIM5_DIV4 (uint8)2 #define TIM5_DIV8 (uint8)3 #define TIM5_DIV16 (uint8)4 #define TIM5_DIV32 (uint8)5 #define TIM5_DIV64 (uint8)6 #define TIM5_DIV128 (uint8)7 #define TIM5_UpDate (unsigned char)0x01 //更新中斷通道 #define TIM5_InChanel1 (unsigned char)0x02 #define TIM5_InChanel2 (unsigned char)0x04 #define TIM5_InChanel3 (unsigned char)0x08 #define TIM5_InDir_UP (unsigned char)0 #define TIM5_InDir_DOWN (unsigned char)1 #define TIM5_IEN_ENB TIM5_CR1 |= 0X01 ; //開啟定時器 #define TIM5_IEN_OFF TIM5_CR1 &= ~0X01 ; //關閉定時器 extern void Init_TIM5_Base(uint16 Tcon,uint8 Pscr) ; extern void Init_TIM5_InSet(void) ; extern void TIM5_InChanelEnb(uint8 Chanel,uint8 en) ; extern void TIM5_InDirection(uint8 Chanel,uint8 Dircetion); extern void TIM5_InEnb(uint8 en) ; extern void TIM5_IntEnb(uint8 Chanel,uint8 en) ; extern void TIM5_Enb(uint8 en) ; #endif //文件timer5.c #include "global.h" #include "timer5.h" #define Init_TIM5_Base_CALL /* #define Init_TIM5_InSet_CALL #define TIM5_InDirection_CALL #define TIM5_InChanelEnb_CALL */ #define TIM5_IntEnb_CALL //#define TIM5_InEnb_ CALL #define TIM5_Enb_CALL // ***** TIM5 16位普通定時器 ******** //************************************* // 函數名稱:Init_Timer5_Timer // 函數功能:TIM5作定時器用時初始化 // 入口參數: // 出口參數:無 /***************************************/ #ifdef Init_TIM5_Base_CALL void Init_TIM5_Base(uint16 Tcon,uint8 Pscr) { // 禁止產生更新事件 TIM5_EGR = 0x00; //計數器時鐘=主時鐘/16=16MHZ/16 = 1U // 相當於計數器周期為1uS TIM5_PSCR = Pscr; //設定重裝載時的寄存器值 TIM5_ARRH = (Tcon >> 8) & 0xff;//0X07; TIM5_ARRL = Tcon & 0xff ;//0XD0; // 設定計數器的初值 定時周期=(ARR+1)*8=16320uS TIM5_CNTRH = 0; TIM5_CNTRL = 0; // b0 = 1,允許計數器工作 b1 = 0,允許更新 // 設置控制器,啟動定時器 TIM5_CR1 = 0x00; } #endif //Init_TIM5_Base_CALL //************************************* // 函數名稱:Init_Timer5_In // 函數功能:TIM5作輸入捕捉使用時初始化 // 入口參數: // 出口參數:無 /***************************************/ #ifdef Init_TIM5_InSet_CALL void Init_TIM5_InSet(void) { TIM5_CCER1 &= ~(SETB0 | SETB4) ; //禁止輸入捕獲1 2 3 TIM5_CCER2 &= ~SETB0 ; // 采樣頻率=Fmst N = 8 // 每個邊沿捕獲一次 TIM5_CCMR1 |= 0x30 ; TIM5_CCMR2 |= 0x30 ; TIM5_CCMR3 |= 0x30 ; //通道映射方向 TIM5_CCMR1 |= 0x01 ;//IC1映射在TI1FP1 // TIM5_CCMR1 |= 0x02 ;//IC1映射在TI2FP1 // TIM5_CCMR2 |= 0x01 ;//IC2映射在TI2FP2 TIM5_CCMR2 |= 0X02 ;//IC2映射在TI1FP2 TIM5_CCMR3 = 0x31 ;//IC3映射在TI3FP3 TIM5_SMCR = 0X04 ; //觸發方式復位 //捕捉方向 TIM5_InDirection(TIM5_InChanel1,TIM5_InDir_UP) ; TIM5_InDirection(TIM5_InChanel2,TIM5_InDir_DOWN) ; TIM5_InDirection(TIM5_InChanel3,TIM5_InDir_UP) ; //捕捉通道使能 TIM5_InChanelEnb((TIM5_InChanel1 | TIM5_InChanel2) ,ENB) ; TIM5_InChanelEnb(TIM5_InChanel3 ,DIS) ; } #endif //Init_TIM5_InSet_CALL //************************************* // 函數名稱:TIM5_InDirection // 函數功能:TIM5捕捉方向設置 // 入口參數:通道號,捕捉方向 // 出口參數:無 /***************************************/ #ifdef TIM5_InDirection_CALL void TIM5_InDirection(uint8 Chanel,uint8 Dircetion) { if(Chanel == TIM5_InChanel1) //通道1 { if(Dircetion == TIM5_InDir_UP) TIM5_CCER1 &= ~SETB1 ;//捕捉在TI1F或TI2F的上升沿 else TIM5_CCER1 |= SETB1 ; } else if(Chanel == TIM5_InChanel2)//通道2 { //捕捉在TI1F或TI2F的上升沿 if(Dircetion == TIM5_InDir_UP) TIM5_CCER1 &= ~SETB5 ; else TIM5_CCER1 |= SETB5 ; } else if(Chanel == TIM5_InChanel3)//通道3 { if(Dircetion == TIM5_InDir_UP) TIM5_CCER2 &= ~SETB1 ;//捕捉在TI3F的上升沿 else TIM5_CCER2 |= SETB1 ; } } #endif //TIM5_InDirection_CALL //************************************* // 函數名稱:TIM5_InChanelEnb // 函數功能:TIM5輸入通道使能函數 // 入口參數:TIM5通道號 使能參數 // 出口參數:無 /***************************************/ #ifdef TIM5_InChanelEnb_CALL void TIM5_InChanelEnb(uint8 Chanel,uint8 en) { if(ENB == en) { if(Chanel & TIM5_InChanel1) TIM5_CCER1 |= SETB0 ; //捕捉1使能 if(Chanel & TIM5_InChanel2) TIM5_CCER1 |= SETB4 ; //捕捉2使能 if(Chanel & TIM5_InChanel3) TIM5_CCER2 |= SETB0 ; //捕捉3使能 } else { if(Chanel & TIM5_InChanel1) TIM5_CCER1 &= ~SETB0 ; //捕捉1禁止使能 if(Chanel & TIM5_InChanel2) TIM5_CCER1 &= ~SETB4 ; //捕捉2禁止使能 if(Chanel & TIM5_InChanel3) TIM5_CCER2 &= ~SETB0 ; //捕捉3禁止使能 } } #endif //TIM5_InChanelEnb_CALL //************************************* // 函數名稱:TIM5_IntEnb // 函數功能:TIM5中斷使能函數 // 入口參數:TIM5中斷號 使能參數 // 出口參數:無 /***************************************/ #ifdef TIM5_IntEnb_CALL void TIM5_IntEnb(uint8 Chanel,uint8 en) { if(ENB == en) { if(Chanel & TIM5_UpDate) TIM5_IER |= SETB0 ; //允許更新中斷 if(Chanel & TIM5_InChanel1) TIM5_IER |= SETB1 ; //開捕捉/比較1中斷 if(Chanel & TIM5_InChanel2) TIM5_IER |= SETB2 ; //開捕捉/比較2中斷 if(Chanel & TIM5_InChanel3) TIM5_IER |= SETB3 ; //開捕捉/比較3中斷 } else { if(Chanel & TIM5_UpDate) TIM5_IER &= ~SETB0 ; //禁止更新中斷 if(Chanel & TIM5_InChanel1) TIM5_IER &= ~SETB1 ; //禁止捕捉/比較1中斷 if(Chanel & TIM5_InChanel2) TIM5_IER &= ~SETB2 ; //禁止捕捉/比較2中斷 if(Chanel & TIM5_InChanel3) TIM5_IER &= ~SETB3 ; //禁止捕捉/比較3中斷 } } #endif //TIM5_IntEnb_CALL //************************************* // 函數名稱:Tim5In_Enb // 函數功能:TIM5 開捕捉中斷 // 入口參數: // 出口參數:無 /***************************************/ #ifdef TIM5_InEnb_CALL void TIM5_InEnb(uint8 en) { if(en == ENB) { TIM5_CNTRH = 0; TIM5_CNTRL = 0; //開捕捉/比較1.2中斷 TIM5_IntEnb((TIM5_InChanel1 | TIM5_InChanel2),ENB) ; TIM5_CR1 |= 0X01 ; //開啟定時器 } else { //關閉捕捉/比較1.2.3中斷 TIM5_IntEnb((TIM5_InChanel1 | TIM5_InChanel2 | TIM5_InChanel3),DIS) ; TIM5_CR1 &= ~0X01 ; //關閉定時器 } } #endif //TIM5_InEnb_CALL //************************************* // 函數名稱:Tim5er_Enb // 函數功能:TIM5er使能 作定時器用 // 入口參數: // 出口參數:無 /***************************************/ #ifdef TIM5_Enb_CALL void TIM5_Enb(uint8 en) { if(en == ENB) { TIM5_IntEnb(TIM5_UpDate,ENB) ; //使能更新中斷 TIM5_CR1 |= 0X01 ; //開啟定時器 } else { TIM5_IntEnb(TIM5_UpDate,DIS) ; //禁止更新中斷 TIM5_CR1 &= ~0X01 ; //關閉定時器 } } #endif //TIM5_Enb_CALL //實例應用 void main(void) { //-----TIM5 初始化-------------------------- Init_TIM5_Base(30,TIM5_DIV16) ; //16M/16=1M 定時30*1U=30U中斷一次 TIM5_Enb(ENB) ; //TIM5定時器使能計數 使能中斷 while(1) { } }