#include "Register_Bit.h" //包含位定义文件
#define TIMER0_ARR (uint32_t)70000
#define TIMER0_DIV1 (uint8_t)1
#define TIMER0_DIV3 (uint8_t)3
#define TIMER0_DIV4 (uint8_t)4
#define TIMER0_DIV5 (uint8_t)5
#define TIMER0_DIV10 (uint8_t)10
#define TIMER0_DIV12 (uint8_t)12
#define TIMER0_DIV50 (uint8_t)50
#define TIMER0_IEN_ENB TCSR0 |= (1<<29) //定时器中断使能
#define TIMER0_IEN_DIS TCSR0 &= ~(1<<29) //定时器中断使能
#define TIMER0_CNT_ENB TCSR0 |= (1<<30) //定时器计数使能
#define TIMER0_CNT_DIS TCSR0 &= ~(1<<30) //定时器计数使能
#define TIMER0_EXI_ENB TEXCON0 |= TEXI_EN //外部中断使能
#define TIMER0_EXI_DIS TEXCON0 &= ~TEXI_EN
//*************************************
// 函数名称:Init_timer0
// 函数功能:TIMER0初始化
// 入口参数:psc 分频系数 范围为1-255 Tcon 为计数个数
// 出口参数:无
//***************************************
void Init_Timer0(uint8_t psc,uint32_t Tcon) //SYSCLK =
{
/* Reset TMR0 IP 外设先复位再使能 */
IPRSTC2 |= TMR0_RST;
IPRSTC2 &= ~TMR0_RST;
/* Enable Timer0 clock source */
APBCLK |= TMR0_CLKEN;
NVIC_ISER |= TMR0_INT; //开TIMER0中断
// NVIC_IPR2 |= (0<<0) ; //设置中断优先级为0 ->最高优先级
/* Select Timer0 clock source as external 12M */
CLKSEL1 = (CLKSEL1 & (~TM0_CLK)) | TM0_12M_32K;
/* Reset the timer/counter0, after set, this bit will be clear by H/W */
// TCSR0 |= CRST;
/* Pre-Scaler */
TCSR0 &= ~(0XFF) ;
TCSR0 |= ((psc-1)<<0) ; //时钟分频
/* Enable TDR0 update. */
TCSR0 |= TDR_EN ; //更新TDR数据使能
TCSR0 &= ~(1<<24) ; //计数模式使能位 --不使能
TCSR0 |= (1<<27) ; //定时器设置为周期模式
TISR0 |= (1<<0) ; //中断状态标志清0
/* Timer0 interrupt enable */
// TCSR0 |= TMR_IE;
TCMPR0 = Tcon ; //计数个数
TDR0 = 0 ; //计数器清0
/* Reset the timer/counter0, after set, this bit will be clear by H/W */
TCSR0 |= CRST;
}
//*************************************
// 函数名称:Timer0_Cmd
// 函数功能:TIMER0使能
// 入口参数:使能参数
// 出口参数:无
//***************************************
void Timer0_Cmd(uint8_t en)
{
if(en == ENB)
{
TDR0 = 0 ; //计数器清0
TIMER0_IEN_ENB ; //定时器中断使能
TIMER0_CNT_ENB ; //定时器计数使能
}
else
{
TIMER0_IEN_DIS ; //定时器中断使能
TIMER0_CNT_DIS ; //定时器计数使能
}
}
//*************************************
// 函数名称:Timer0_InputCap_Init
// 函数功能:定时器0捕捉功能初始化
// 入口参数:无
// 出口参数:无
//***************************************
void Timer0_InputCap_Init(void)
{
/* Set P3.2 as timer0 external capture0 function */
P3_MFP = P3_MFP & (~P32_MFSEL) | P32_T0EX;
/*
// Set timer capture trigger-counting mode.
TEXCON0 |= MODE_CAP_EN;
*/
//以下两位设置外部捕捉为 自由计数模式
TEXCON0 &= ~MODE_CAP_EN ;
/* T0EX transition is used as timer capture function. */
TEXCON0 &= TMR_CAP;
/* T0EX pin enable. */
TEXCON0 |= TEX_EN;
/* Set falling edge on T0EX pin will be detected. */
TEXCON0 = TEXCON0 & (~TEX_EDGE) | TEX_EDGE_BOTH; //双边沿
/* Enable timer0 external capture pin de-bounce function. */
TEXCON0 |= TEXDB_EN; //使能外部引脚防反弹功能
/* DISEnable timer0 external capture interrupt */
TEXCON0 &= ~TEXI_EN;
/* Reset timer0 counter */
TCSR0 |= CRST;
/* Clear timer0 interrupt flag */
TEXISR0 |= TEX_IF;
}
//*************************************
// 函数名称:Timer0_InputCap_Cmd
// 函数功能:定时器0捕捉功能控制
// 入口参数:捕捉使能参数
// 出口参数:无
//***************************************
void Timer0_InputCap_Cmd(uint8_t en)
{
if(en == ENB)
{
TDR0 = 0 ; //计数器清0
TIMER0_EXI_ENB ; //外部中断使能
TIMER0_CNT_ENB ; //定时器计数使能
}
else
{
TIMER0_EXI_DIS ;
TIMER0_CNT_DIS ; //定时器计数使能
}
}
//----实例应用 初始化设置------
//定时器应用初始化
// Init_Timer0(TIMER0_DIV4,375) ; //12M/4=3M 共计125U
// Timer0_Cmd(ENB) ;
//定时器捕捉功能初始化
Init_Timer0(TIMER0_DIV4,TIMER0_ARR) ; //12M/4=3M
Timer0_InputCap_Init() ; //输入捕捉初始化
Timer0_InputCap_Cmd(ENB) ; //捕捉使能
|