您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
定時(shí)器3是一個(gè)16位自動(dòng)重裝載,向上計(jì)數(shù)定時(shí)器。用戶可以通過配置T3PS[2:0] (T3CON[2:0])選擇預(yù)分頻,并寫入重載值到R3H 和R3L寄存器來決定它的溢出速率。用戶可以設(shè)置TR3 (T3CON.3)來開始計(jì)數(shù)。當(dāng)計(jì)數(shù)跨過FFFFH,TF3 (T3CON.4)置為1,且R3H 和R3L寄存器的內(nèi)容重載到內(nèi)部16位計(jì)數(shù)器。如果ET3 (EIE1.1)置為1,定時(shí)器3中斷服務(wù)程序被執(zhí)行。當(dāng)進(jìn)入中斷服務(wù)程序,TF3會(huì)被硬件自動(dòng)清零。
定時(shí)器3同時(shí)也用作串口波特率產(chǎn)生定時(shí)器,詳細(xì)內(nèi)容請(qǐng)參考章節(jié)13.5“波特率”
用戶可以設(shè)置TR3 (T3CON.3)來開始計(jì)數(shù)。當(dāng)計(jì)數(shù)跨過
FFFFH,TF3 (T3CON.4)置為1,且R3H 和R3L寄存器的內(nèi)容重載到內(nèi)部16位計(jì)數(shù)器。
如果ET3 (EIE1.1)置為1,定時(shí)器3中斷服務(wù)程序被執(zhí)行。當(dāng)進(jìn)入中斷服務(wù)程序,TF3會(huì)被硬件自動(dòng)清零。
定時(shí)器3同時(shí)也用作串口波特率產(chǎn)生定時(shí)器,詳細(xì)內(nèi)容請(qǐng)參考章節(jié)13.5“波特率”
波特率
串口的不同模式的波特率時(shí)鐘源和速度是完全不同的。詳見表 13–3. 用于設(shè)定不同的波特率。
在模式1或模式3,串口0的波特率時(shí)鐘源可通過BRCK (T3CON.5)選擇定時(shí)器1或定時(shí)器3。對(duì)于串口1,只有采用定時(shí)器3作為唯一的時(shí)鐘源。
當(dāng)采用定時(shí)器1作為波特率發(fā)生器,需要關(guān)閉定時(shí)器1中斷。定時(shí)器1可配置為計(jì)數(shù)器或是定時(shí)器,三種工作模式都可以。典型應(yīng)用中,會(huì)配置為定時(shí)器工作在自動(dòng)重裝載模式(定時(shí)器模式2)。如果采用定時(shí)器3作為波特率發(fā)生器,同樣也需要關(guān)閉定時(shí)器3中斷。
對(duì)應(yīng)算式如下:
#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); }
上面這個(gè)程序利用定時(shí)器一產(chǎn)生波特率,利用定時(shí)器3來進(jìn)入中斷。
下面這個(gè)例程是產(chǎn)生串口波特率的(串口一)
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
上一篇:嵌入式Linux下Qt的中文顯示
下一篇:SDRAM容量的計(jì)算方法
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08