[DemoCode下载] 新唐MINI51 TIMER0初始化设置

[复制链接]
 楼主| Messi1999 发表于 2016-3-7 16:58 | 显示全部楼层 |阅读模式
  1. #include "Register_Bit.h"   //包含位定义文件  

  2. #define     TIMER0_ARR              (uint32_t)70000  


  3. #define     TIMER0_DIV1             (uint8_t)1  
  4. #define     TIMER0_DIV3             (uint8_t)3  
  5. #define     TIMER0_DIV4             (uint8_t)4  
  6. #define     TIMER0_DIV5             (uint8_t)5  
  7. #define     TIMER0_DIV10            (uint8_t)10  
  8. #define     TIMER0_DIV12            (uint8_t)12  
  9. #define     TIMER0_DIV50            (uint8_t)50  

  10. #define     TIMER0_IEN_ENB      TCSR0 |= (1<<29)   //定时器中断使能  
  11. #define     TIMER0_IEN_DIS      TCSR0 &= ~(1<<29)   //定时器中断使能  

  12. #define     TIMER0_CNT_ENB      TCSR0 |= (1<<30)   //定时器计数使能   
  13. #define     TIMER0_CNT_DIS      TCSR0 &= ~(1<<30)   //定时器计数使能   

  14. #define     TIMER0_EXI_ENB      TEXCON0 |= TEXI_EN  //外部中断使能      
  15. #define     TIMER0_EXI_DIS      TEXCON0 &= ~TEXI_EN   


  16. //*************************************  
  17. // 函数名称:Init_timer0  
  18. // 函数功能:TIMER0初始化  
  19. // 入口参数:psc 分频系数 范围为1-255 Tcon 为计数个数  
  20. // 出口参数:无  
  21. //***************************************  
  22. void Init_Timer0(uint8_t psc,uint32_t Tcon) //SYSCLK =   
  23. {  

  24.     /* Reset TMR0 IP  外设先复位再使能 */  
  25.     IPRSTC2 |= TMR0_RST;  
  26.     IPRSTC2 &= ~TMR0_RST;     

  27.     /* Enable Timer0 clock source */  
  28.     APBCLK |= TMR0_CLKEN;  

  29.     NVIC_ISER |= TMR0_INT;  //开TIMER0中断  
  30. //  NVIC_IPR2 |= (0<<0) ; //设置中断优先级为0 ->最高优先级  

  31.     /* Select Timer0 clock source as external 12M */   
  32.     CLKSEL1 = (CLKSEL1 & (~TM0_CLK)) | TM0_12M_32K;      

  33.     /* Reset the timer/counter0, after set, this bit will be clear by H/W */         
  34. //   TCSR0 |= CRST;     

  35.     /* Pre-Scaler */  
  36.     TCSR0 &= ~(0XFF) ;  
  37.     TCSR0  |= ((psc-1)<<0) ;  //时钟分频     

  38.     /* Enable TDR0 update. */  
  39.     TCSR0 |= TDR_EN ;   //更新TDR数据使能   
  40.     TCSR0 &= ~(1<<24) ; //计数模式使能位 --不使能  
  41.     TCSR0 |= (1<<27) ;  //定时器设置为周期模式  

  42.     TISR0 |= (1<<0) ; //中断状态标志清0  

  43.     /* Timer0 interrupt enable */  
  44. //    TCSR0 |= TMR_IE;  

  45.     TCMPR0 = Tcon ;  //计数个数  

  46.     TDR0 = 0 ;  //计数器清0      

  47.     /* Reset the timer/counter0, after set, this bit will be clear by H/W */         
  48.     TCSR0 |= CRST;            
  49. }  
  50. //*************************************  
  51. // 函数名称:Timer0_Cmd  
  52. // 函数功能:TIMER0使能  
  53. // 入口参数:使能参数  
  54. // 出口参数:无  
  55. //***************************************  
  56. void  Timer0_Cmd(uint8_t en)  
  57. {  

  58.     if(en == ENB)  
  59.     {  
  60.         TDR0 = 0 ;  //计数器清0  
  61.         TIMER0_IEN_ENB ;  //定时器中断使能  
  62.         TIMER0_CNT_ENB ;  //定时器计数使能   
  63.     }  
  64.     else  
  65.     {  
  66.         TIMER0_IEN_DIS ;  //定时器中断使能  
  67.         TIMER0_CNT_DIS ;  //定时器计数使能      
  68.     }  

  69. }  
  70. //*************************************  
  71. // 函数名称:Timer0_InputCap_Init  
  72. // 函数功能:定时器0捕捉功能初始化  
  73. // 入口参数:无  
  74. // 出口参数:无  
  75. //***************************************  
  76. void Timer0_InputCap_Init(void)  
  77. {  
  78.     /* Set P3.2 as timer0 external capture0 function */  
  79.     P3_MFP = P3_MFP & (~P32_MFSEL) | P32_T0EX;   
  80. /*
  81.     // Set timer capture trigger-counting mode.  
  82.     TEXCON0 |= MODE_CAP_EN;
  83. */  
  84.     //以下两位设置外部捕捉为 自由计数模式  
  85.     TEXCON0 &= ~MODE_CAP_EN ;  
  86.     /* T0EX transition is used as timer capture function. */  
  87.     TEXCON0 &= TMR_CAP;  

  88.     /* T0EX pin enable. */  
  89.     TEXCON0 |= TEX_EN;  

  90.     /* Set falling edge on T0EX pin will be detected. */   
  91.     TEXCON0 = TEXCON0 & (~TEX_EDGE) | TEX_EDGE_BOTH;   //双边沿  

  92.     /* Enable timer0 external capture pin de-bounce function. */  
  93.     TEXCON0 |= TEXDB_EN; //使能外部引脚防反弹功能        

  94.     /* DISEnable timer0 external capture interrupt */  
  95.     TEXCON0 &= ~TEXI_EN;         

  96.     /* Reset timer0 counter */  
  97.     TCSR0 |= CRST;   

  98.     /* Clear timer0 interrupt flag */  
  99.     TEXISR0 |= TEX_IF;  
  100. }  
  101. //*************************************  
  102. // 函数名称:Timer0_InputCap_Cmd  
  103. // 函数功能:定时器0捕捉功能控制  
  104. // 入口参数:捕捉使能参数  
  105. // 出口参数:无  
  106. //***************************************  
  107. void Timer0_InputCap_Cmd(uint8_t en)  
  108. {  
  109.     if(en == ENB)  
  110.     {  
  111.         TDR0 = 0 ;  //计数器清0  
  112.         TIMER0_EXI_ENB ;  //外部中断使能  
  113.         TIMER0_CNT_ENB ;  //定时器计数使能   
  114.     }  
  115.     else   
  116.     {  
  117.         TIMER0_EXI_DIS ;  
  118.         TIMER0_CNT_DIS ;  //定时器计数使能   
  119.     }  
  120. }  


  121. //----实例应用 初始化设置------  

  122.     //定时器应用初始化  
  123. //  Init_Timer0(TIMER0_DIV4,375) ; //12M/4=3M 共计125U  
  124. //  Timer0_Cmd(ENB) ;  

  125.     //定时器捕捉功能初始化  
  126.     Init_Timer0(TIMER0_DIV4,TIMER0_ARR) ; //12M/4=3M      
  127.     Timer0_InputCap_Init() ;   //输入捕捉初始化  
  128.     Timer0_InputCap_Cmd(ENB) ;    //捕捉使能  


侣行天下 发表于 2016-3-10 21:55 | 显示全部楼层
这个定时器是否可以作为操作系统的的时钟呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

363

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部