【单片机】【710】定时器

现在开始看710,我觉得看一个单片机还是先从定时器、振荡器、中断和器件配置这些基础的部分入手。

首先最应该知道的内容就是定时器如果选择了系统时钟,且分频比为1,则F = 1/40Mhz,每0.025us定时器的累加器加一

710的定时器分了3类,大概是有点多才分了类吧,它有9个定时模块

A类:Timer1

B类:Timer2、4、6、8

C类:Timer3、5、7、9

B类和C类可以组成32位的定时器,它们单独每个都是16位的。

大家都知道定时器里面主要的寄存器有三个

TMRx:16位定时器计数器

PRx:与定时器相关的16位定时器周期寄存器(和TMRx配合来控制定时的长短)

TxCON:与定时器相关的16位定时器控制寄存器

上面的这些寄存器里面有很多细分的设置位,这里就不写了啊,哈哈哈哈

这里还需要介绍几个控制位

TxIE:允许控制位()

TxIF:状态控制位()

TxIP<2:0> : 优先级控制位

A类定时器

只有一个Timer1,它的独特性是

可以依靠期间上的低功耗32KHz晶振工作

可以依靠外部时钟源以异步计数器模式工作

初始化代码如下

 1 #include"Timer1.h"
 2 void Timer1()
 3 {
 4     
 5     T1CONbits.TON=0;        //禁止16位定时器    
 6     T1CONbits.TGATE=0;        //禁止门控时间累加    
 7     T1CONbits.TCKPS=0b00;    //预分频比256
 8     
 9     T1CONbits.TSIDL=0;        //在空闲模式下定时器继续工作//
10     T1CONbits.TCS=0;        //内部时钟40MHZ
11     T1CONbits.TSYNC=0;        //不同步外部时钟
12     
13     TMR1=0;                    //时钟周期15625
14     PR1=40000;
15 
16     IPC0bits.T1IP=0B110;        //中断优先级1
17     IFS0bits.T1IF=0;        
18     IEC0bits.T1IE=1;
19     
20 //    T1CONbits.TON=1;          //启动16位定时器
21 
22 }
23 /*void __attribute__((__interrupt__, __shadow__)) _T1Interrupt(void)
24 {
25         IFS0bits.T1IF=0;
26 }*/

B类定时器

Timer2、4、6、8

可以通过与C类定时器组合成32位定时器

 1 #include "Timer2.h"       
 2   void Init_Timer2()
 3 {   T2CONbits.TON=0;    //禁止16位定时器
 4     T2CONbits.T32=0;    //选择16位定时器
 5     T2CONbits.TCS=0;    //时钟源40MHZ    
 6     T2CONbits.TSIDL=0;    //在空闲模式下继续工作
 7     T2CONbits.TGATE=0;    //禁止门控
 8     T2CONbits.TCKPS=0B01;    //预分频比为8
 9     
10     TMR2=0;
11     PR2=50000; //比较值                
12         
13     IPC1bits.T2IP=0B111;//中断优先级
14     IFS0bits.T2IF=0;//中断标志位清零
15     IEC0bits.T2IE=1;    //开启中断
16 
17     T2CONbits.TON=1;    //开启16位定时器
18 }
19 void __attribute__((__interrupt__, __shadow__)) _T2Interrupt(void)
20 {        if( IFS0bits.T2IF ==1 )
21     {
22         IFS0bits.T2IF=0;
}
23 }

C类定时器

Timer3、5、7、9

可以通过与B类定时器组合构成32位定时器

至少有一个C类定时器能够触发模数(A/D)转换

 1 void Init_Timer3() {
 2     T3CONbits.TON = 0;      //停止16位Timer3
 3     T3CONbits.TSIDL = 0;        //在空闲模式下继续工作
 4     T3CONbits.TGATE = 0;        //禁止门控时间累加
 5     T3CONbits.TCKPS = 0B01;     //预分频比为8
 6     T3CONbits.TCS = 0;      //选择内部时钟
 7         
 8     TMR3=0;
 9     PR3=50000; //比较值                
10         
11     IPC2bits.T3IP=0B111;//中断优先级  
12     IFS0bits.T3IF=0;//中断标志位清零
13     IEC0bits.T3IE=1;    //开启中断
14 
15     T3CONbits.TON=1;    //开启16位定时器
16 }
17 void __attribute__((__interrupt__, __shadow__)) _T2Interrupt(void)
18 {        if( IFS0bits.T3IF ==1 )
19     {
20         IFS0bits.T3IF=0;
21     }
22 }

上面的初始化代码中,有一个地方不是按规律来的,那就是设置中断优先级的时候,例如上面的IPC2bits.T3IP = 0B111;就是设置Timer3的优先级的,不按规律是指前面的IPCxbits.TyIP里的x和y(y = Timer后面的数字)不是相等的,即我设置Timer4的优先级的时候前面不一定是IPC4。明白了吧,あほ!

至于代码中其它地方的数字是和Timerx的x相等的。

原文地址:https://www.cnblogs.com/iteou/p/5889006.html