您好,欢迎进入 官方网站!

您现在的位置: 首页 新闻资讯>> 新闻头条>> N76E003之定时器3
新闻资讯
NEWS INFORMATION

N76E003之定时器3

发布时间:2019-05-22

定时器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"#defineRELOAD_VALUE_H (65536-1500)/256#defineRELOAD_VALUE_L (65536-1500)%256/************************************************************************************************************ * TIMER 2 interrupt subroutine ************************************************************************************************************/voidTimer3_ISR (void) interrupt16{ clr_TF3; P12= ~P12;//P0.2 toggle when TF3 interruptprintf("\n TM3 INT 0x%bX", RH3); }/************************************************************************************************************ * Main function ************************************************************************************************************/voidmain (void) { Set_All_GPIO_Quasi_Mode; InitialUART0_Timer1(115200); RH3= RELOAD_VALUE_H;//initial counter valuesRL3 =RELOAD_VALUE_L; set_ET3;//enable Timer3 interruptset_EA;//enable interruptsset_TR3;//Timer3 runwhile(1); }

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

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

voidInitialUART1_Timer3(UINT32 u32Baudrate)//use timer3 as Baudrate generator{ P02_Quasi_Mode;//Setting UART pin as Quasi mode for transmitP16_Quasi_Mode;//Setting UART pin as Quasi mode for transmitSCON_1=0x50;//UART1 Mode1,REN_1=1,TI_1=1T3CON =0x08;//T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1clr_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*/#endifset_TR3;//Trigger Timer3}
#defineHIBYTE(v1) ((UINT8)((v1)>>8))//v1 is UINT16#defineLOBYTE(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





联系方式 0755-82591179

传真:0755-82591176

邮箱:vicky@yingtexin.net

地址:深圳市龙华区民治街道民治大道973万众润丰创业园A栋2楼A08

Baidu
map