【单片机】【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相等的。