GNU ARM匯編--(六)s3c2440的時(shí)鐘控制
不再發(fā)感慨了,下面就對(duì)s3c2440的時(shí)鐘做一個(gè)說明,然后給出匯編對(duì)時(shí)鐘的控制代碼,最后比較一下有時(shí)鐘控制和沒時(shí)鐘控制下的流水燈的區(qū)別.
本文引用地址:http://butianyuan.cn/article/201611/321725.htms3c2440的時(shí)鐘控制邏輯可以產(chǎn)生3個(gè)時(shí)鐘信號(hào):用于CPU核(ARM920T)的FCLK,用于AHB總線外設(shè)(存儲(chǔ)控制器中斷控制器LCD控制器DMAUSB的主機(jī)端)的HCLK和用于APB總線外設(shè)(比如WDT IIS I2C PWM timer MMC ADC UART GPIO RTC SPI)的PCLK.s3c2440有兩個(gè)鎖相環(huán),一個(gè)是用于FCLK HCLK PCLK的MPLL,一個(gè)專用與USB的UPLL.
首先看一下下面的表格:
時(shí)鐘源可以來自于外部晶振(XTlpll)或者外部時(shí)鐘(EXTCLK).datasheet中的圖7-1顯示了時(shí)鐘的體系框圖,這里就不給出了,截出一小部分與上圖做個(gè)呼應(yīng):
這個(gè)圖就反映了OM[3:2]在XTlpll和EXTCLK之間的選擇.
接下來看看TQ2440的原理圖是如何處理的:
從原理圖可以看出:OM[3:2]為00b,意味著使用晶振來產(chǎn)生MPLL CLK和UPLL CLK.我們的XTIpll接的就是12M的晶振,這時(shí)候EXTCLK按照規(guī)定是要接高的,對(duì)應(yīng)圖如下:
值得注意的是:盡管MPLL在reset后就開始工作了,但是MPLL output只有在軟件寫有效的設(shè)置值到MPLLCON寄存器后才作為系統(tǒng)時(shí)鐘的.在有效設(shè)置之前,外部晶振或者EXTCLK直接用于系統(tǒng)時(shí)鐘.哪怕是你不想改動(dòng)MPLLCON寄存器的初始值,你也得將該值寫入MPLLCON.
上面的話意味著:如果不進(jìn)行時(shí)鐘的設(shè)置,那么我的板子就運(yùn)行在晶振為12M的系統(tǒng)時(shí)鐘下,這個(gè)和s3c2440的400M相去甚遠(yuǎn),做流水燈的延時(shí)肯定也差數(shù)量級(jí)的,這個(gè)等會(huì)就可以看到.
Mpll = (2*m * Fin) / (p * 2^s)
m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
s3c2440支持FCLK HCLK和PCLK之間的分頻比的選擇.比例由CLKDIVN寄存器的HDIVN和PDIVN決定.可參見下表:
注意:CLKDIVN要小心設(shè)置,不要超出了HCLK和PCLK的限制.如果HDIVN不為0,要用下面的指令,CPU總線模式從Fast Bus Mode變?yōu)楫惒娇偩€模式:
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
下面開始看看寄存器的設(shè)置:
LOCK TIME COUNT REGISTER (LOCKTIME)
這個(gè)時(shí)間是要保證PLL輸出頻率穩(wěn)定的,時(shí)序圖如下:
這個(gè)計(jì)數(shù)器的設(shè)置就是時(shí)序圖中的lock time,而在寄存器說明中規(guī)定要大于300us,那么這個(gè)時(shí)候根據(jù)12M的晶振頻率,計(jì)算如下:
(1/12M)*N>300us 所以N>3600 所以可以用寄存器的默認(rèn)值0xffff.
PLL CONTROL REGISTER (MPLLCON & UPLLCON)
MPLL Control Register
Mpll = (2 * m * Fin) / (p * 2S)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
UPLL Control Register
Upll = (m * Fin) / (p * 2S)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
評(píng)論