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("\n 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);
}
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;
    
#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))

定时器3是一个16位自动重装载,向上计数定时器。

用户可以通过配置T3PS[2:0] (T3CON[2:0])选择预分频,并写入重载值到R3H 和R3L寄存器来决定它的溢出速率。

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

 set_ET3; //enable Timer3 interrupt

set_EA; //enable interrupts

set_TR3; //Timer3 run





猜你喜欢

转载自www.cnblogs.com/zhugeanran/p/9262557.html
今日推荐