打印
[DemoCode下载]

新唐MINI51 TIMER0初始化设置

[复制链接]
1644|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Messi1999|  楼主 | 2016-3-7 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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) ;    //捕捉使能  


沙发
侣行天下| | 2016-3-10 21:55 | 只看该作者
这个定时器是否可以作为操作系统的的时钟呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

363

帖子

1

粉丝