定時(shí)器中斷---那些年我們一起玩mini2440(arm9)裸機(jī)
(時(shí)鐘體系)
時(shí)鐘概念:
★時(shí)鐘脈沖:一個(gè)按一定電壓幅度,一定時(shí)間間隔連續(xù)發(fā)出的脈沖信號(hào);
★時(shí)鐘頻率:在單位時(shí)間(如:1秒)內(nèi)產(chǎn)生的時(shí)鐘秒沖數(shù);
時(shí)鐘的作用:
時(shí)鐘信號(hào)是時(shí)序邏輯的基礎(chǔ),它用于決定邏輯單元中的狀態(tài)何時(shí)更新。數(shù)字芯片中眾多的晶體管都工作在開(kāi)關(guān)狀態(tài),它們的導(dǎo)通和關(guān)斷動(dòng)作無(wú)不是按照時(shí)鐘信號(hào)的節(jié)奏進(jìn)行的。
時(shí)鐘的作用(簡(jiǎn)潔版)
系統(tǒng)中的設(shè)備需要有個(gè)時(shí)間來(lái)和它進(jìn)行同步—即靠時(shí)鐘!
時(shí)鐘的產(chǎn)生-晶振
晶振:晶體振蕩器,是用石英晶體精密切割做成。
優(yōu)點(diǎn):振蕩頻率非常穩(wěn)定;振蕩頻率很準(zhǔn)確;結(jié)構(gòu)簡(jiǎn)單、噪聲低。
缺點(diǎn):生產(chǎn)成本高,交貨周期較長(zhǎng),不利于客戶加快產(chǎn)品上市時(shí)間,而且難以獲得非常標(biāo)準(zhǔn)的頻率。
時(shí)鐘產(chǎn)生-PLL
PLL:(鎖相環(huán))合成器是一種更為復(fù)雜的系統(tǒng)時(shí)鐘源。通過(guò)PLL合成器需要一個(gè)外部晶體并包含一個(gè)能夠?qū)w的特定頻率加倍或分頻的集成鎖相環(huán)PLL電路。
S3C2440時(shí)鐘體系
S3C2440的主時(shí)鐘晶振來(lái)自外部晶振(XTIPLL),或者是外部時(shí)鐘(EXTCLK)。時(shí)鐘生成器包含了一個(gè)振蕩器(振蕩放大器),其連接外部晶振,可以產(chǎn)生需要的高頻,通過(guò)引腳OM[3:2]來(lái)決定時(shí)鐘源時(shí)Crystal還是EXTCLK.
S3C2440時(shí)鐘體系
S3C2440有兩個(gè)PLL:(1)MPLL和(2)UPLL,
UPLL專用于USB設(shè)備。
MPLL用于CPU及其他外圍器件。
通過(guò)MPLL會(huì)產(chǎn)生三個(gè)部分的時(shí)鐘頻率:FCLK、HCLK、PLCK.
FCLK:用于CPU核;
HCLK:用于AHB(常用于高速外設(shè))總線的設(shè)備,比如:SDRAM;
PCLK:用于APB(常用于低速外設(shè))總線的設(shè)備,比如:UART.
時(shí)鐘啟動(dòng)流程:
1.上電幾毫秒后,外部晶振輸出穩(wěn)定,F(xiàn)CLK=外部晶振頻率(12MHZ),nRESET
信號(hào)恢復(fù)高電平后,CPU開(kāi)始執(zhí)行命令。
2.在設(shè)置MPLL的幾個(gè)寄存器后,需要等待一段時(shí)間(Lock Time),MPLL的輸出才穩(wěn)定。在這段時(shí)間(Lock Time)內(nèi),F(xiàn)CLK停振,CPU停止工作。
Lock Time的長(zhǎng)短由寄存器LOCKTIME設(shè)定。
3.Lock Time之后,MPLL輸出正常,CPU工作在新的FCLK(如:400MHZ)下。
寄存器:
設(shè)置S3C2440的時(shí)鐘頻率就是設(shè)置相關(guān)的幾個(gè)寄存器:
1.LOCKTIME寄存器
2.MPLLCON寄存器
3.CLKDIVN寄存器
寄存器-LOCKTIME
MPLL啟動(dòng)后需要等待一段時(shí)間(Lock Time),使得其輸出穩(wěn)定。
位[31:16]用于UPLL,
位[15:0]用于MPLL.
使用缺省值0xffff ffff
寄存器-MPLLCON
該寄存器用于設(shè)置FCLK(cpu的時(shí)鐘頻率)與Fin的倍數(shù)(Fin:輸入的時(shí)鐘頻率)
位[19:12]的值稱為MDIV
位[9:4]的值稱為PDIV
位[1:0]的值稱為SDIV
FCLK與Fin的計(jì)算關(guān)系式如下:
MPLL(FCLK) = (2*m*Fin)/(p*2^s)
其中:m= MDIV+8 ,p=PDIV+2 , s= SDIV
寄存器-CLKDIVN
該寄存器用于設(shè)置FCLK、HCLK、PCLK三者的比例
★HDIVN:位[2:1],用來(lái)設(shè)置HCLK與FCLK比例關(guān)系
★PDIVN:位[0],用來(lái)設(shè)置PCLK與HCLK比例關(guān)系
例如:
FCLK:HCLK:PCLK=4:2:1
FCLK=400MHZ(主頻)
HCLK=200M
PCLK=100M
巧計(jì),速記2圖:
圖1:
圖2:
S3C2440定時(shí)器
S3C2440共有5個(gè)16位的定時(shí)器。其中定時(shí)器0、1、2、3有PWM功能,他們都有一個(gè)輸出引腳,可以通過(guò)定時(shí)器來(lái)控制引腳周期性的高、低電平變化;
定時(shí)器4沒(méi)有輸出引腳。
S3C2440定時(shí)器
定時(shí)器部件的時(shí)鐘源為--PCLK,(經(jīng)過(guò)兩次分頻)
首先通過(guò)兩個(gè)8位的預(yù)分頻器降低頻率:定時(shí)器0、1共用第一預(yù)分頻器,
定時(shí)器2、3、4公用第二個(gè)預(yù)分頻器。
再次預(yù)分頻器的輸出將進(jìn)入第二級(jí)分頻器,它們輸出5種頻率的時(shí)鐘:2分頻、4分頻、8分頻、16分頻或者外部時(shí)鐘TCLK0、TCLK1,每個(gè)定時(shí)器的工作時(shí)鐘也可以從這5種頻率中選擇。
定時(shí)器初始化:步驟:
1.定時(shí)器時(shí)鐘頻率
(定時(shí)器的時(shí)鐘頻率需要經(jīng)過(guò)兩次的分頻)例如:定時(shí)器的時(shí)鐘頻率50--表示:每一秒鐘把定時(shí)器的初始值減去50;
2.設(shè)置定時(shí)器計(jì)數(shù)值;
--即設(shè)置定時(shí)器的初始值(比較值為0)
3.設(shè)置中斷處理函數(shù);--即定時(shí)器到時(shí)間時(shí)去處理什么函數(shù)
定時(shí)器輸出時(shí)鐘頻率=PCLK/{prescalervalue+1} /{divider value}
{prescaler value} =0 ~255(第一次預(yù)分頻通過(guò)TCFG0設(shè)置)
{divider value} = 2, 4, 8, 16(第二次預(yù)分頻通過(guò)TCFG1設(shè)置)
TCMPB0:定時(shí)器n的比較值
TCNTB0:初始計(jì)數(shù)值(放到TCNT0后TCNT0會(huì)自動(dòng)減一直到減到== TCMPB0)
之后設(shè)置TCON會(huì)自動(dòng)重新裝載TCMPB0和TCNTB0再次重新計(jì)數(shù)
定時(shí)器工作流程
1.程序初始化,設(shè)置TCMPBn、TCNTBn這兩個(gè)寄存器,它們表示定時(shí)器n的比較值、初始計(jì)數(shù)值。
2.設(shè)置TCON寄存器定時(shí)器n,這時(shí)TCMPBn、TCNTBn的值將被裝入其內(nèi)部寄存器TCMPn、TCNTn中。在定時(shí)器n的工作頻率下,TCNTn開(kāi)始減一計(jì)數(shù),其值可以通過(guò)讀取TCNTOn寄存器得知。
3.當(dāng)TCNTn的值等于TCMPn的值時(shí),定時(shí)器n的輸出管腳TOUTn反轉(zhuǎn);TCNTn繼續(xù)減一計(jì)數(shù)。
4.當(dāng)TCNTn的值到達(dá)0時(shí),器輸出管腳TOUTn再次反轉(zhuǎn),并觸發(fā)定時(shí)器n的中斷。
5.當(dāng)TCNTn的值到達(dá)0時(shí),如果TCON寄存器中將定時(shí)器n設(shè)為“自動(dòng)加載”,則TCMPB0和TCNTB0寄存器的值被自動(dòng)裝入TCMP0和TCNT0寄存器中,下一個(gè)計(jì)數(shù)流程開(kāi)始。
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
voidTimer0_init(void);
staticvoid__irqIRQ_Timer0_Handle(void);
voidSet_Clk(void);
staticvoidcal_cpu_bus_clk(void);
voidLed1_init(void);
voidLed1_run(void);
/*************************************************
Functionname:delay
Parameter:times
Description:延時(shí)函數(shù)
Return:void
Argument:void
Autor&date:
**************************************************/
voiddelay(inttimes)
{
inti,j;
for(i=0;i for(j=0;j<400;j++); } /************************************************* Functionname:Main Parameter:void Description:主功能函數(shù) Return:void Argument:void Autor&date:Daniel **************************************************/ voidMain(void) { Set_Clk(); MMU_Init(); //Uart_Init(0,115200); //Uart_Select(0); Led1_init(); Timer0_init(); while(1); } /************************************************* Functionname:Timer0_init(void) Parameter:void Description:定時(shí)器的初始化 Return:void Argument:void Autor&date:Daniel **************************************************/ voidTimer0_init(void) { //Timer0init rTCFG0=49;//pclk/(49+1) rTCFG1=0x03;//16分頻=62500HZ rTCNTB0 = 6250