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



原文地址:https://www.cnblogs.com/zhugeanran/p/9262557.html

时间: 2024-08-02 06:24:36

N76E003之定时器3的相关文章

N76E003的定时器/计数器 0和1

定时器/计数器 0和1N76E003系列定时器/计数器 0和1是2个16位定时器/计数器.每个都是由两个8位的寄存器组成的16位计数寄存器. 对于定时器/计数器0,高8位寄存器是TH0. 低8位寄存器是TL0. 同样定时器/计数器1也有两个8位寄存器, TH1 和TL1. TCON 和 TMOD 可以配置定时器/计数器0和1的工作模式. 通过TMOD中的 位来选择定时器或计数器功能. 每个定时器/计数器都有选择位,TMOD的第2位选择定时器/计数器0功能,TMOD的第6位选择定时器/计数器1功能

N76E003之串口

N76E003包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口.由于两个串口的控制位是一样的,为了区分两个串口控制位,串口1的控制位以"_1"结尾(例如SCON_1).下述详例以串口0为例.每个串口都有一种同步工作模式:模式0.三种全双工异步模式:模式1,2,和3,这意味着收发可以同时连续进行.串口接收带有接收缓存,意味着在接收的前一个数据在被读取之前,串口就能接收第二个数据.接收和发送都是对SBUF进行操作访问,写入SBUF数据将直接传到发送寄存器,而读取SBUF是访问一个

单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟

N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c 1 #include <N76E003.H> 2 #include <SFR_Macro.h> 3 #include <Function_Define.h> 4 5 bit BIT_TMP; // 调用 SFR_Macro.h 使用的 6 7 void main(void){ 8 //

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

原文:Android零基础入门第60节:日历视图CalendarView和定时器Chronometer 上一期学习了AnalogClock.DigitalClock和TextClock时钟组件,本期继续来学习日历视图CalendarView和定时器Chronometer. 一.CalendarView 日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触 摸来滚动日历.如果希望监控该组件的日期改变,则可调用CalendarView的 setOnDateCha

发送短信验证码按钮 定时器

static int i = 29; @property(nonatomic,strong) NSTimer *timmer;//定时器 - (void)sendNumber{ NSLog(@"发送验证码"); self.getTelephoneCodeBtn.enabled = NO; [self.getTelephoneCodeBtn setTitle:@"已发送" forState:UIControlStateDisabled]; [self.getTelep

《TCP/IP具体解释》读书笔记(22章)-TCP的坚持定时器

TCP通过让接收方指明希望从发送方接收的数据字节数(即窗体大小)来进行流量控制. 假设窗体大小为0会发生什么情况呢?这将有效阻止发送方传送数据,直到窗体变为非0为止. ACK的传输并不可靠,也就是说,TCP不正确ACK报文段进行确认,TCP仅仅确认那些包括有数据的ACK报文段. 1.坚持定时器 假设一个场景:假设一个确认丢失了,则两方就有可能由于等待对方而使连接终止,接收方等待接收数据(由于它已经向发送方通告了一个非0的窗体),而发送方在等待同意它继续发送数据的窗体更新.为防止这种死锁情况的发生

javascript-函数和定时器

1.函数自执行 JavaScript中不像C#中那样要求所有路径都有返回值,没有返回值就是undefined (function(){alert(1);}()); (function(){alert(1);})(); !function(){alert(1);}(); void function(){alert(2);}(); 2.可变参数 js函数无法像C#方法那样重载 下面的代码等于是对a函数重新定义 function a() { alert("无参函数"); } function

&lt;JavaScript&gt; 八. 定时器

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <script type="text/javascript"> 6 /* 7 定时器 周期性执行JS代码 8 */ 9 10 // --------------------- 方法 ----------------------- 11 /* 12 1. setInterval(code, millisec

JavaScript定时器原理分析

.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { text-align: center; margin-top: 20px; margin-left: 10px; margin-bottom: 20px } a { cursor: pointer; text-decoration: none; color: gray } a:hover { text