系統(tǒng)時鐘和定時器_第1頁
系統(tǒng)時鐘和定時器_第2頁
系統(tǒng)時鐘和定時器_第3頁
系統(tǒng)時鐘和定時器_第4頁
系統(tǒng)時鐘和定時器_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

系統(tǒng)時鐘和定時器S3C2410/S3C2440的時鐘控制邏輯既可以外接晶振,然后通過內(nèi)部電路產(chǎn)生時鐘源;也可以直接使用外部提供的時鐘源,它們通過引腳的設(shè)置來選擇。ModeOM[3:2]MPLLStateUPLLStateMainClocksourceUSBClockSource00OnOnCrystalCrystal01OnOnCrystalEXTCLK10OnOnEXTCLKCrystal11OnOnEXTCLKEXTCLK時鐘控制邏輯給整個芯片提供3種時鐘:FCLK用于CPU核;HCLK用于AHB總線上設(shè)備,主要用于高性能模塊之間的連接,比如CPU核、寄存器控制器、中斷控制器、LCD控制器、DMA和USB主機(jī)模塊等;PCLK用于APB總線上的設(shè)備,主要用于低帶寬的周邊外設(shè)之間的連接,比如WATCHDOG、IIS、I2C、PWM定時器、MMC接口、ADC、UART、GPIO、RTC和SPI。為了降低電磁干擾、降低板間布線的要求,S3C2410/S3C2440外接的晶振頻率通常很低,開發(fā)板上一般為12MHz,需要通過時鐘控制邏輯的PLL提高系統(tǒng)時鐘。S3C2410/S3C2440有兩個PLL:MPLL和UPLL。UPLL專用于USB設(shè)備,MPLL用于設(shè)置FCLK、HCLK、PCLK。上電時,PLL沒被啟動,F(xiàn)CLK即等于外部輸入的時鐘,稱為Fin。若要提高系統(tǒng)時鐘,需要軟件來啟動PLL,可跟隨FCLK的圖像了解啟動過程。上電幾毫秒后,晶振輸出穩(wěn)定,F(xiàn)CLK=Fin(晶振頻率),nRESET信號恢復(fù)高電平后,CPU開始執(zhí)行指令??梢栽诔绦蜷_頭啟動MPLL,設(shè)置MPLL的幾個寄存器后,需要等待一段時間(LockTime),MPLL輸出才穩(wěn)定。在這段時間內(nèi),F(xiàn)CLK停振,CPU停止

工作。LockTime的長短由寄存器LOCKTIME設(shè)定。LockTime之后,MPLL輸出正常,CPU工作在新的FCLK下。FCLK、HCLK和PCLK的比例是可以改變的,設(shè)置它們?nèi)叩谋壤?,啟動MPLL只需設(shè)置3個寄存器(對于S3C2440的一些時鐘比例,還需要額外設(shè)置一個寄存器)。LOCKTIME寄存器:用于設(shè)置“TimeLock”的長度。MPLLCON寄存器:用于設(shè)置FCLK與Fin的倍數(shù)。CLKDIVN寄存器:用于設(shè)置FCLK、HCLK、PCLK三者的比例。對于S3C2440的一些時鐘比例,還需要額外設(shè)置一個寄存器CAMDIVN。#defineS3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))#defineS3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))/*對于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV有如下計(jì)算公式:S3C2410:MPLL(FCLK)=(m*Fin)/(p*2"s)S3C2410:MPLL(FCLK)=(2*m*Fin)/(p*2"s)其中:m=MDIV+8,p=PDIV+2,s=SDIV對于本開發(fā)板,F(xiàn)in=12MHz設(shè)置CLKDIVN,令分頻比為:FCLK:HCLK:PCLK=1:2:4,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz*/voidclock_init(void){//LOCKTIME=0x00ffffff;//使用默認(rèn)值即可CLKDIVN=0x03; //FCLK:HCLK:PCLK=1:2:4,HDIVN=1,PDIVN=1/*如果HDIVN非0,CPU的總線模式應(yīng)該從“fastbusmode”變?yōu)椤癮synchronousbusmode” */__asm__(/*讀出控制寄存器/*讀出控制寄存器*//*設(shè)置為“asynchronous/*寫入控制寄存器*/"orrr1,r1,#0xc0000000\n"busmode”*/"mcrp15,0,r1,c1,c0,0\n");/*判斷是S3C2410還是S3C2440*/if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002)){MPLLCON= S3C2410_MPLL_200MHZ; /*現(xiàn)在FCLK=200MHz,HCLK=100MHz,PCLK=50MHz*/}elseMPLLCON=S3C2440_MPLL_200MHZ;/*現(xiàn)在,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz*/}}PWM定時器S3C2410/S3C2440的定時器部件完全一樣,共有5個16位的定時器。其中定時器0、1、2有PWM功能,即它們都有一個輸出引腳,可以通過定時器來控制引腳周期性的高、低電平變化;定時器4沒有輸出引腳。定時器部件的時鐘電源位PCLK,首先通過兩個8位的預(yù)分頻器降低頻率:定時器0、1共用第一個預(yù)分頻,定時器2、3、4共用第二個預(yù)分頻器。預(yù)分頻器的輸出將進(jìn)入第二級分頻器,它們輸出5種頻率的時鐘:2分頻、4分頻、8分頻、16分頻或者外部時鐘TCLK0/TCLK1。每個定時器的工作時鐘可以從這5種頻率中選擇。這兩個預(yù)分頻都可以通過TCFG0寄存器來設(shè)置,每個定時器工作在哪種頻率下也可以通過TCFG1寄存器來選擇。

定時器內(nèi)部控制邏輯的工作流程如下。(1)程序初始,設(shè)定TCMPBn、TCNTBn這兩個寄存器,它們表示定時器n的比較值、初始計(jì)數(shù)值。(2) 隨之設(shè)置TCON寄存器啟動定時器n,這時,TCMPBn、TCNTBn的值將被裝入其內(nèi)部存儲器TCMPn、TCNTn中。在定時器n的工作頻率下,TCNTn開始減1計(jì)數(shù),其值可以通過讀取TCNTOn寄存器得知。(3) 當(dāng)TCNTn的值等于TCMPn的值時,定時器n的輸出管腳TOUTn反轉(zhuǎn);TCNTn繼續(xù)減1計(jì)數(shù)。(4) 當(dāng)TCNTn的值到達(dá)0時,其輸出管腳TOUTn再次反轉(zhuǎn),并觸發(fā)定時器n的中斷(如果中斷使能的話)。(5) 當(dāng)TCNTn的值到達(dá)0時,如果在TCON寄存器中將定時器n設(shè)為“自動加載”,則TCMPBn和TCNTBn寄存器的值被自動裝入TCMPn和TCNTn寄存器中,下一個計(jì)數(shù)流程開始。定時器n的輸出管腳TOUTn初始狀態(tài)為高電平,以后在TCNTn的值等于

TCMPn的值、TCNTn的值等于0時反轉(zhuǎn)。也可以通過TCON寄存器設(shè)置其初始電平,這樣TOUTn的輸出就完全相反了。通過設(shè)置TCMPBn、TCNTBn的值可以設(shè)置管腳TOUTn輸出信號的占空比,這就是所謂的可調(diào)制脈沖,所以這些定時器又被稱為PWM定時器。下面講解定時器的寄存器使用方法。(1) TCFG0寄存器:位[7:0]、位[15:8]分別被用于控制預(yù)分頻器0、1,它們的值為0~255.經(jīng)過預(yù)分頻器出來的時鐘頻率為:PCLK/{prescalervalue+1}。(2) TCFG1寄存器:經(jīng)過預(yù)分頻器得到的時鐘將被2分頻、4分頻、8分頻和16分頻,除這4種頻率外,額外地,定時器0、1還可以工作在外接的TCLK0時鐘下,定時器2、3、4還可以工作在外接的TCLK1時鐘下。通過TCFG1寄存器來設(shè)置這5個定時器,分別工作于這5個頻率中哪一個之下。(3) TCNTBn/TCMPBn寄存器:n為0~4,這兩個寄存器都只用到位[15:0],TCNTBn中保存定時器的初始計(jì)數(shù)值,TCMPBn中保存比較值。它們的值在啟動定時器時,被傳到定時器內(nèi)部寄存器TCNTn、TCMPn中。沒有TCMPB4,因?yàn)槎〞r器4沒有輸出引腳。(4) TCNTOn寄存器:n位0~4,定時器n被啟動后,內(nèi)部寄存器TCNTn在其工作時鐘下不斷減1計(jì)數(shù),可以通過讀取TCNTOn寄存器得知其值。(5)TCON寄存器:有四個作用,a、第一次啟動定時器時“手動”將TCNTBn/TCMPBn寄存器的值裝入內(nèi)部寄存器TCNTn、TCMPn中;b、啟動、停止定時器;3、決定在定時器計(jì)數(shù)達(dá)到0時是否自動將TCNTBn/TCMPBn寄存器的值裝入內(nèi)部寄存器TCNTn、TCMPn中;4、決定定時器的管腳TOUTn的輸出電平是否反轉(zhuǎn)。在第一次使用定時器時,需要設(shè)置“手動更新”位為1以使TCNTBn/TCMPBn寄存器的值裝入內(nèi)部寄存器TCNTn、TCMPn中。下一次如果還要設(shè)置這一位,需要先將它清0。#definePCLK 50000000voiddelay_ms(inttime){intval=(PCLK>>3)/1000-1;TCFG0&=~(0xff<<8);//TCFG0設(shè)置預(yù)分頻器0、1,TCFG1用于設(shè)置二次分頻TCFG0|=3<<8; //prescaler=3+1TCFG1&=~(0xf<<12);TCNTB3=val;TCMPB3=val>>1;TCONTCNTB3=val;TCMPB3=val>>1;TCON&=~(0xf<<16);TCON|=0xb<<16;starttimer3TCON&=~(2<<16);while(time--)//interval,inv-off,updateTCNTB3&TCMPB3,//clearmanualupdatebit

{while(TCNTO3>=val>>1);while(TCNTO3<val>>1);};}#defineGPB5_out(1<<(5*2))//LED1#defineGPB6_out(1<<(6*2))//LED2#defineGPB7_out(1<<(7*2))//LED3#defineGPB8_out(1<<(8*2))//LED4/**TimerinputclockFrequency=PCLK/{prescalervalue+1}/{dividervalue}*{prescalervalue}=0~255*{dividervalue}=2,4,8,16*本實(shí)驗(yàn)的Timer0的時鐘頻率=100MHz/(99+1)/(16)=62500Hz*設(shè)置Timer00.5秒鐘觸發(fā)一次中斷:*/voidtimer0_init(void)TCFG0=99;TCFG1=0x03;TCFG0=99;TCFG1=0x03;TCNTB0=31250;TCON|=(1<<1);//選擇16分頻//0.5秒鐘觸發(fā)一次中斷//手動更新TCON=TCON=0x09;//自動加載,清“手動更新”位,啟動定時器0//定時器0中斷使能voidinit_irq_timer0(void){INTMSK&=(~(1<<10));//定時器0中斷使能}voidTimer0_Handle(void){if(INTOFFSET==10)GPBDAT=~(GPBDAT&GPBDAT=~(GPBDAT&(Oxf<<5)); //每次中斷令4個LED改變狀態(tài)SRCPND=1<<INTOFFSET; //清中斷INTPND=INTPND;voidTimer0_test(void){charc;GPBCON=GPB5_out|GPB6_out|GPB7_out|GPB8_out;GPBDAT=0xffff;timer0_init();printf("\nKeyScanTest,pressESCkeytoexit!\n");ClearPending(BIT_TIMER0);pISR_TIMER0=(int)Timer0_Handle;EnableIrq(BIT_TIMER0);while((c=get_c())!=0x1b);DisableIrq(BIT_TIMER0);}BOARD//***************************[BOARDBEEP]*******************************voidBuzzer_Freq_Set(intfreq){GPBCON&=~3;GPBCON|=2;//setGPB0astout0,pwmoutputTCFG0&=~0xff;TCFG0|=15;//prescaler=15+1TCFG1&=~0xf;TCFG1|=2;//mux=1/8TCNTB0=(PCLK>>7)/freq;TCMPB0=TCNTB0>>1;//50%TCON&=~0x1f;TCON|=0xb;//disabledeadzone,auto-reload,inv-off,updateTCNTB0&TCMPB0,starttimer0TCON&=~2;//clearmanualupdatebit}voidBuzzer_Stop(void){GPBCON&=~3;//setGPB0asoutputGPBCON|=1;GPBDAT&=~1;}//***************************[BOARDBEEP]*******************************voidBeep(intfreq,intms){Buzzer_Freq_Set(freq);delay_ms(ms);Buzzer_Stop();}/****************************************************************************【功能說明】蜂鳴器PWM測試****************************************************************************/voidBuzzer_Pwm_Test(void){intfreq=8000;//lci1000;Buzzer_Freq_Set(freq);while(1){charkey=get_c();if(key=='+'){if(freq<2000)//lci20000freq+=10;Buzzer_Freq_Set(freq);}if(key=='-'){if(freq>11)freq-=10;Buzzer_Freq_Set(freq);}if(key==0x1b){Buzzer_Stop();returnWATCHDOG定時器WATCHDOG定時器可以像一般16位定時器一樣用于產(chǎn)生周期性的中斷,也可以用于發(fā)出復(fù)位信號以重啟失常的系統(tǒng)。WATCHDOG定時器的8位預(yù)分頻器將PCLK分頻后,被再次分頻得到4種頻率:16分頻、32分頻、64分頻、128分頻,WATCHDOG定時器可以選擇工作于哪種頻率之下。WTCNT寄存器按照其工作頻率減1計(jì)數(shù),當(dāng)達(dá)到0時,可以產(chǎn)生中斷信號,可以輸出復(fù)位信號。在第一次使用WATCHDOG定時器時,需要往WTCNT寄存器中寫入初始計(jì)數(shù)值,以后在計(jì)數(shù)值到達(dá)0時自動從WATDAT寄存器中裝入,重新開使用WATCHDOG定時器的“WATCHDOG功能”時,在正常的程序中,必須不斷重新設(shè)置WTCNT寄存器使得它不為0,這樣可以保證系統(tǒng)不被重啟,這稱為“喂狗”;當(dāng)程序崩潰時不能正常“喂狗”,計(jì)數(shù)值達(dá)到0后系統(tǒng)將被重啟,這樣程序?qū)⒅匦逻\(yùn)行。為了克服各種干擾、避免各類系統(tǒng)錯誤時系統(tǒng)徹底死機(jī),經(jīng)常使用WATCHDOG功能。WATCHDOG定時器所涉及的寄存器如下。(1)WTCON寄存器:用于設(shè)置預(yù)分頻系數(shù),選擇工作頻率,決定是否使能中斷、是否啟動WATCHDOG功能(即是否輸出復(fù)位信號)。

WTCONBitDescriptionInitialStatePrescalervalue[15:8]PrescalervalueThevalidrangeisfromOto255(2?-1).0x80Reserved[7:6]Resen/ed.Theset

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論