//文件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)
{
}
}