zoukankan      html  css  js  c++  java
  • N76E003之定时器3

    定时器3是一个16位自动重装载,向上计数定时器。用户可以通过配置T3PS[2:0] (T3CON[2:0])选择预分频,并写入重载值到R3H 和R3L寄存器来决定它的溢出速率。用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。

    定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”

     用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过
    FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。

    如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。

     

    定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”

    波特率

    串口的不同模式的波特率时钟源和速度是完全不同的。详见表 13–3. 用于设定不同的波特率。
    在模式1或模式3,串口0的波特率时钟源可通过BRCK (T3CON.5)选择定时器1或定时器3。对于串口1,只有采用定时器3作为唯一的时钟源。

    当采用定时器1作为波特率发生器,需要关闭定时器1中断。定时器1可配置为计数器或是定时器,三种工作模式都可以。典型应用中,会配置为定时器工作在自动重装载模式(定时器模式2)。如果采用定时器3作为波特率发生器,同样也需要关闭定时器3中断。

     对应算式如下:

    #ifdef FOSC_160000
            RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);          /*16 MHz */
            RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);          /*16 MHz */
    #endif
    #ifdef FOSC_166000
            RH3    = HIBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
            RL3    = LOBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
    #endif
    #include "N76E003.h"
    #include "SFR_Macro.h"
    #include "Function_define.h"
    #include "Common.h"
    #include "Delay.h"
    
    #define RELOAD_VALUE_H  (65536-1500)/256
    #define RELOAD_VALUE_L  (65536-1500)%256
    
    /************************************************************************************************************
    *    TIMER 2 interrupt subroutine
    ************************************************************************************************************/
    void Timer3_ISR (void) interrupt 16 
    {
        clr_TF3;
        P12 = ~P12;                                 //P0.2 toggle when TF3 interrupt
            printf("
     TM3 INT 0x%bX", RH3);
    }
    
    /************************************************************************************************************
    *    Main function 
    ************************************************************************************************************/
    void main (void)
    {
        
        Set_All_GPIO_Quasi_Mode;
        InitialUART0_Timer1(115200);
    
           
        RH3 = RELOAD_VALUE_H;                       //initial counter values 
        RL3 = RELOAD_VALUE_L;    
        
        set_ET3;                                    //enable Timer3 interrupt
        set_EA;                                     //enable interrupts
        set_TR3;                                    //Timer3 run
    
        while(1);
    }

    上面这个程序利用定时器一产生波特率,利用定时器3来进入中断。

    下面这个例程是产生串口波特率的(串口一)

    void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
    {
            P02_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit
            P16_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit
        
          SCON_1 = 0x50;       //UART1 Mode1,REN_1=1,TI_1=1
          T3CON = 0x08;       //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
            clr_BRCK;  //timer 1
        
    #ifdef FOSC_160000
            RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);          /*16 MHz */
            RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);            /*16 MHz */
    #endif
    #ifdef FOSC_166000
            RH3    = HIBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
            RL3    = LOBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
    #endif
        set_TR3;         //Trigger Timer3
    }
    #define HIBYTE(v1)              ((UINT8)((v1)>>8))                      //v1 is UINT16
    #define LOBYTE(v1)              ((UINT8)((v1)&0xFF))
    SCON_1 = 0x50;       //UART1 Mode1,REN_1=1,TI_1=1

    
    
     T3CON = 0x08;       //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1

     

    #ifdef FOSC_160000
            RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);          /*16 MHz */
            RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);            /*16 MHz */
    #endif
    #ifdef FOSC_166000
            RH3    = HIBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
            RL3    = LOBYTE(65536 - (1037500/u32Baudrate));              /*16.6 MHz */
    #endif
      set_TR3;         //Trigger Timer3

     





  • 相关阅读:
    arthas命令ognl视频演示
    arthas命令sc和sm视频演示
    混合Java函数和Groovy闭包
    Mock System.in和检查System.out
    arthas命令logger动态修改日志级别--视频演示
    删除List中null的N种方法--最后放大招
    ovs安装教程
    win10中安装与配置maven
    win10系统中按顺序安装jdk、tomcat
    win10系统中按顺序安装jdk、tomcat
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/9262557.html
Copyright © 2011-2022 走看看