zoukankan      html  css  js  c++  java
  • 【单片机】【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相等的。

  • 相关阅读:
    Seven Puzzle Aizu
    Cheese
    Curling 2.0
    Ball
    Property Distribution
    Red and Black
    Lake Counting
    Ants
    剑桥雅思写作高分范文ESSAY20
    剑桥雅思写作高分范文ESSAY19
  • 原文地址:https://www.cnblogs.com/iteou/p/5889006.html
Copyright © 2011-2022 走看看