mini244-------keil for ARM系列之時(shí)鐘的配置(附帶LED代碼)
整篇文章的結(jié)構(gòu)如下:
一、直接把時(shí)鐘管理用到的寄存器羅列出來進(jìn)行分析。
二、對(duì)其中的一些原理性的東西做介紹。
三、對(duì)于在后面編寫串口時(shí)會(huì)出現(xiàn)的問題注意點(diǎn)提出說明。
四、LED 代碼
一、在時(shí)鐘管理中會(huì)用到的寄存器有以下一些。
LOCKTIME,MPLLCON,UPLLCON,CLKCON,CLKSLOW,CLKDIVN,CAMDIVN。
LOCKTIME:是對(duì)于配置好鎖相環(huán)之后需要延時(shí)的一段時(shí)間,這時(shí)為了上鎖穩(wěn)定。其中包括兩部分
①U_LTIME:這是UCLK(USB專用的一個(gè)時(shí)鐘)配置好后需要的延時(shí)時(shí)間。
②M_LTIME:這時(shí)FCLK(系統(tǒng)時(shí)鐘即CPU的頻率),HCLK(一些高速設(shè)備所用到時(shí)鐘),PCLK(低速設(shè)備所用到的時(shí)鐘)這三者配置好后需要的上鎖延時(shí)。
MPLLCON:是配置外部晶振與系統(tǒng)時(shí)鐘之間關(guān)系的一個(gè)寄存器。之間的關(guān)系如下。
一定要要按照公式進(jìn)行嚴(yán)格的計(jì)算,比如MPLLCON = 0;MPLLCON |= (0x38<<12)|(0x2<<4)|(0x3);這樣MDIV=56,PDIV = 2, SDIV=3. mpll = (2*64*12)/(4*8)=48MHZ;
UPLLCON:是配置USB使用的時(shí)鐘的配置寄存器。配置方式與計(jì)算方式
其中對(duì)應(yīng)的位與MPLLCON相同。(現(xiàn)在還沒有使用到)
CLKCON:就是按照對(duì)應(yīng)的位配置哪些設(shè)備的時(shí)鐘使能了,對(duì)應(yīng)的時(shí)鐘更夠給他提供對(duì)應(yīng)的心跳。
CLKSLOW:可以對(duì)UPLL或者M(jìn)PLL進(jìn)行開關(guān),也能對(duì)他們進(jìn)行頻率的減小。按照默認(rèn)數(shù)值就行。
CLKDIVN:這是時(shí)鐘分頻寄存器。
可以看出來,僅僅只有HCLK會(huì)受CAMDIVN的影響,但是HCLK被影響后,會(huì)間接的對(duì)PCLK產(chǎn)生影響,
CAMDIVN:相機(jī)時(shí)鐘分頻寄存器。
CLKDIVN與CAMDIVN聯(lián)合起來進(jìn)行時(shí)鐘的分頻,推薦把HCLK配置到00,或者01上,這樣就可以實(shí)現(xiàn)由CLKDIVN來分頻。
在上面得到48MHZ的頻率后,現(xiàn)在繼續(xù)配置。CLKDIVN = 0; CLKDIVN |=0x1;進(jìn)行這樣的配置。CAMDIVN=0;
最后可以得到FCLK=48M, HCLK = 48M, PCLK = 24M,
二、對(duì)其中的一些原理性的東西做介紹。
頻率是如何進(jìn)行產(chǎn)生與分頻的。
在板子中有兩個(gè)鎖相環(huán)路。
第一個(gè)就是MPLL,這是對(duì)外部晶振(時(shí)鐘)進(jìn)行倍頻,因?yàn)楦哳l晶振價(jià)格高,所以就用鎖相環(huán)路來進(jìn)行倍頻。
從圖中也能看出來,倍頻后的頻率沒有進(jìn)過分頻就直接進(jìn)入到了FCLK這里了。
倍頻后,再經(jīng)過分頻就能得到HCLK與PCLK了。所以形成我們使用的頻率要進(jìn)過兩步
①倍頻,②分頻。
第二鎖相環(huán)路是UPLL,專門來為USB提高時(shí)鐘的,不作分析。
三、對(duì)于在后面編寫串口時(shí)會(huì)出現(xiàn)的問題注意點(diǎn)提出說明。
注意①S3C2440中文檔有誤
比如我們看第一個(gè) MDIV = 56---->m=64;PDIV=2------->p=4;SDIV=2------->s=2;按照公式計(jì)算出來頻率是96MHZ
(對(duì)于這個(gè)地方我理解是因?yàn)镸PLL得出來的頻率就是FCLK的頻率,所以在測(cè)試的時(shí)候把SDIV改成3才得到48M,不知道這里理解正確沒有,如果有錯(cuò),還希望指正)所以配置的時(shí)候,最好按照自己計(jì)算出的數(shù)字去配置。
注意② 系統(tǒng)在初始化代碼中會(huì)進(jìn)行時(shí)鐘的配置,
在后面配置的時(shí)候可以先進(jìn)行一下清零在重新配置,不要按照手冊(cè)上的初始值進(jìn)行與或操作來進(jìn)行配置,因?yàn)槌跏蓟a已經(jīng)改變這些時(shí)鐘的初始值了。
四、LED代碼
led.C代碼
#include
#include"led.h"
//
voidLed_Delay(void)
{
inti,j;
for(i=0;i<5000;i++)
{
for(j=0;j<50;j++);
}
}
//
voidLed_Init(void)
{
//GPB5-8都配置為輸出
GPBCON&=~(0x3FC00);
GPBCON|=(1<<10)|(1<<12)|(1<<14)|(1<<16);
}
voidLed(unsignedcharnum)
{
GPBDAT|=0x1E0;
switch(num)
{
case1:
GPBDAT&=~(0x20);break;
case2:
GPBDAT&=~(0x40);break;
case3:
GPBDAT&=~(0x80);break;
case4:
GPBDAT&=~(0x100);break;
}
Led_Delay();
GPBDAT|=0x1E0;
}
voidLed_Test(void)
{
unsignedchari;
for(i=1;i<5;i++)
{
Led(i);
}
}
LED.H的代碼
voidLed_Delay(void);//led中專用延時(shí)函數(shù)
voidLed_Init(void);//led中基本初始化操作
voidLed(unsignedcharnum);//第num個(gè)led被點(diǎn)亮
voidLed_Test(void);//led測(cè)試程序