下面這張圖,就是6410的系統時鐘原理圖:
的
6410的時鐘頻率決定公式:FOUT
= MDIV * FIN / (PDIV * 2^SDIV) 其中這幾個值(MDIV,PDIV,SDIV)都在APLL_CON和MPLL_CON中。 FIN就是我們系統輸入時鐘,ok6410是12Mhz。
要得到最後的輸出時鐘都要設定 DIV分頻器
ARMCLK = DOUTAPLL / (ARM_RADIO + 1)
CLK_DIV0 mainly controls the system clocks and special
clocks of multimedia IP s. The output frequencies of
APLL and MPLL are divided by ARM_RATIO and MPLL_RATIO. HCLKX2 clock is the base clock of other
operating system clocks and divided by HCLKX2_RATIO. There is operating frequency limitation. The maximum
operating frequency of HCLKX2, HCLK, and PCLK are 266MHz, 133MHz, and 66MHz, respectively. NAND,
SECUR, JPEG operating clock cannot exceed 66MHz. MFC and CAM operating clock cannot exceed 133MHz.
This operating clock condition must be met through CLK_DIV0 configuration.
這是手冊上的一段話,也就是HCLK*2的頻率不能超過266Mhz。jpeg,cam頻率都有限制。
APLL給ARM
CPU使用
MPLL給主裝置、HCLK(記憶體,DDR),PCLK(外設片上模組)
EPLL給其它模組
非同步模式: OTHERS寄存器設定為非同步模式
讀入OTHERS記憶體的值,並bic清0xc0
當arm時鐘和Hclk不一樣的時候使,要設定成非同步
迴圈判斷,等待設定完成
分頻設定:要使我們的時鐘正常工作,還要設定相應的分頻參數,具體如下:
分頻參數主要在CLK_DIV0裡面設定。
設定CLK_DVIO
設定ARM_RATIO 0 主核分頻為1分頻
設定HCLCKX2_RATIO 1 將輸入的時鐘進行2分頻
設定HCLK_RATIO 1 再將輸入的時鐘2分頻,能供記憶體使用量
設定PCLK_RATIO 3 其他RATIO的設定
設定流程:
/*************************************************************************//*名稱:系統時鐘設定 *//*參數:ARM_CLK=532 HCLK=133 HCLKX2=266 PCLK=66.5 *//*************************************************************************/#define rAPLL_LOCK (*((volatile unsigned long *)0x7E00F000))#define rMPLL_LOCK (*((volatile unsigned long *)0x7E00F004))#define rEPLL_LOCK (*((volatile unsigned long *)0x7E00F008))#define rAPLL_CON (*((volatile unsigned long *)0x7E00F00C))#define rMPLL_CON (*((volatile unsigned long *)0x7E00F010))#define rCLK_SRC (*((volatile unsigned long *)0x7E00F01C))#define rCLK_DIV0 (*((volatile unsigned long *)0x7E00F020))#define rCLK_DIV1 (*((volatile unsigned long *)0x7E00F024))#define rCLK_DIV2 (*((volatile unsigned long *)0x7E00F028))#define rOTHERS (*((volatile unsigned long *)0x7E00F900))#define ARM_RATIO 0 /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1) */#define HCLKX2_RATIO 1 /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */#define HCLK_RATIO 1 /* HCLK = HCLKX2 / (HCLK_RATIO + 1) */#define PCLK_RATIO 3 /* PCLK = HCLKX2 / (PCLK_RATIO + 1) */#define MPLL_RATIO 0 /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1) */#define SDIV 1#define PDIV 3#define MDIV 266#define EN 1 //使能PLLvoid Clock_Init(){rAPLL_LOCK = 0x0000ffff;rMPLL_LOCK = 0x0000ffff;rEPLL_LOCK = 0x0000ffff; //時鐘鎖存時間設定rOTHERS &= ~( 3 << 6); //將時鐘設定成非同步模式while( (rOTHERS & 0xf00) != 0 );//等待進入非同步模式rCLK_DIV0 = ARM_RATIO | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);//設定CLK_DIV0的分頻參數rAPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//設定FOUT=532MrMPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//設定FOUT=532MrCLK_SRC = 0x03;//時鐘源選擇}
在彙編啟動代碼中,在跳轉到main函數之前,加上一下一句,即可設定時鐘
bl clock_init
main函數,我就按照韋東山老師的視頻教學上說的,寫流水燈代碼,可以看到如果延時不夠,則流水燈跑得非常快。