其實,Exynos 4412的IROM代碼已經設置了PLL,我們可以通過串口把IROM設置的PLL寄存器值打印出來,這些值打印出來是這樣的(摘自韋東山老師的《嵌入式Linux系統開發完全手冊_基于4412__上冊》):
CLK_SRC_CPU = 0x01000001
CLK_DIV_DMC0 = 0x00111713
CLK_DIV_DMC1 = 0x01011171
CLK_SRC_TOP0 = 0x01110000
CLK_SRC_TOP1 = 0x00001000
CLK_DIV_TOP = 0x00015470
CLK_SRC_LEFTBUS = 0x00000001
CLK_DIV_LEFTBUS = 0x00000013
CLK_SRC_RIGHTBUS = 0x00000001
CLK_DIV_RIGHTBUS = 0x00000013
APLL_LOCK = 0x00000960
MPLL_LOCK = 0x00000000
EPLL_LOCK = 0x00000FFF
VPLL_LOCK = 0x00000FFF
CLK_DIV_CPU0 = 0x00773730
CLK_DIV_CPU1 = 0x00000077
APLL_CON1 = 0x00003800
APLL_CON0 = 0xA0640301
MPLL_CON1 = 0x00003800
MPLL_CON0 = 0xA0640301
EPLL_CON2 = 0x00000080
EPLL_CON1 = 0x66010000
EPLL_CON0 = 0x00600302
VPLL_CON2 = 0x00000080
VPLL_CON1 = 0x66016000
VPLL_CON0 = 0x006F0302
CLK_SRC_CPU = 0x01000001
CLK_SRC_DMC = 0x00111000
CLK_SRC_TOP0 = 0x01110000
CLK_SRC_TOP1 = 0x00001000
現在來計算 ARMCLK的時鐘頻率:
由上一節《Exynos4412時鐘體系分析》的介紹我們知道,ARMCLK 有如下計算公式:
如下圖所示:
由上邊打印的寄存器CLK_SRC_CPU 的值為:
十六進制:0x01000001
二進制:0000 0001 0000 0000 0000 0000 0000 0001
BIT[0] 控制第1個MUX (即 MUXAPLL) ,該位值為1.
BIT[16]控制 第2個 MUX( 即MUXCORE) ,該位值為0.
所以由此看出ARMCLK時鐘走的是如下的路線:
所以:ARMCLK = MUXCORE的輸出 / DIVCORE / DIVCORE2
ARMCLK = MDIV x FIN / (PDIV x 2 ^ SDIV) / (CORE_RATIO + 1) / (CORE2_RATIO + 1)
= 0x64 x 24MHz / (3 x 2 ^ 1) / (0 + 1) / (0 + 1)
= 400 MHz
本次實驗涉及3個小實驗:
system_clock_disable_apll:不使用 APLL,讓CPU運行于 24MHz 頻率,觀察 LED 閃爍是否變慢
system_clock_apll:重新設置APLL,讓 CPU 運行于1.4GHz頻率,觀察 LED 閃爍是否變快
system_clock_plls:參考廠家提供的u-boot代碼,設置所有PLL供后續章節使用
第一個小實驗
實現的目標:不使用 APLL,讓CPU運行于 24MHz 頻率,觀察 LED 閃爍是否變慢
一、程序說明
我們在前一個實驗,《Tiny4412之C語言實現流水燈》的基礎上修改。
start.S大部分相同,只是增加一條函數調用語句
bl system_clock_init // 調用時鐘初始化函數
如下圖所示:
鏈接腳本system_clock.lds的內容和上一個實驗key.lds完全相同,只把名字改了改;Makefile的內容也大部分一樣,也只是改了改里邊文件的名字,led.c文件和LED實驗時完全相同,新增加了文件system_clock.c,代碼如下:
/* CMU_CPU */
#define CLK_SRC_CPU (*(volatile unsigned int *)0x10044200)
#define CLK_DIV_CPU0 (*(volatile unsigned int *)0x10044500)
#define CLK_DIV_CPU1 (*(volatile unsigned int *)0x10044504)
/* CMU_DMC */
#define CLK_SRC_DMC (*(volatile unsigned int *)0x10040200)
#define CLK_DIV_DMC0 (*(volatile unsigned int *)0x10040500)
#define CLK_DIV_DMC1 (*(volatile unsigned int *)0x10040504)
/* CMU_TOP */
#define CLK_SRC_TOP0 (*(volatile unsigned int *)0x1003C210)
#define CLK_SRC_TOP1 (*(volatile unsigned int *)0x1003C214)
#define CLK_DIV_TOP (*(volatile unsigned int *)0x1003C510)
/* CMU_LEFTBUS */
#define CLK_SRC_LEFTBUS (*(volatile unsigned int *)0x10034200)
#define CLK_DIV_LEFTBUS (*(volatile unsigned int *)0x10034500)
/* CMU_RIGHTBUS */
#define CLK_SRC_RIGHTBUS (*(volatile unsigned int *)0x10038200)
#define CLK_DIV_RIGHTBUS (*(volatile unsigned int *)0x10038500)
/* locktime */
#define APLL_LOCK (*(volatile unsigned int *)0x10044000)
#define MPLL_LOCK (*(volatile unsigned int *)0x10044008)
#define EPLL_LOCK (*(volatile unsigned int *)0x1003C010)
#define VPLL_LOCK (*(volatile unsigned int *)0x1003C020)
/* APLL */
#define APLL_CON1 (*(volatile unsigned int *)0x10044104)
#define APLL_CON0 (*(volatile unsigned int *)0x10044100)
/* MPLL */
#define MPLL_CON0 (*(volatile unsigned int *)0x10040108)
#define MPLL_CON1 (*(volatile unsigned int *)0x1004010c)
/* EPLL */
#define EPLL_CON2 (*(volatile unsigned int *)0x1003C118)
#define EPLL_CON1 (*(volatile unsigned int *)0x1003C114)
#define EPLL_CON0 (*(volatile unsigned int *)0x1003C110)
/* VPLL */
#define VPLL_CON0 (*(volatile unsigned int *)0x1003C120)
#define VPLL_CON1 (*(volatile unsigned int *)0x1003C124)
#define VPLL_CON2 (*(volatile unsigned int *)0x1003C128)
/*
* 函數名:
* system_clock_init
* 功能: 初始化4412的系統時鐘
*/
void system_clock_init(void)
{
/* IROM或BL1設置了APLL,
* 本程序設置不啟動APLL,
* 而是使在晶振時鐘, 以體驗一下LED閃燈變慢
*/
CLK_SRC_CPU = 0x0;
}
沒什么可說的,很簡單,前部分是后期會用到的一些寄存器地址的定義,主要的是下邊system_clock_init這個函數,在這個函數中將CLK_SRC_CPU寄存器的值設為0,這樣ARMCLK的頻率將走下面這條路徑,設置為24MHZ:
二、編譯、燒寫實驗
按照前幾節介紹的方法,將程序上傳到服務器編譯,并燒寫到SD卡上,給開發板上電,可以明顯感覺到LED閃爍的頻率大大降低,說明我們設置的時鐘起作用了,這里就不上圖了(上了圖大家也看不出來)。
第二個小實驗
實現的目標:重新設置APLL,讓 CPU 運行于1.4GHz頻率,觀察 LED 閃爍是否變快
一、程序說明
文件同第一個小實驗,只是在它的基礎上對system_clock.c文件中的system_clock_init函數進行修改:
/*
* 函數名: system_clock_init
* 功 能: 初始化4412的系統時鐘
* 最終結果: APLL=1.4GHz
*/
void system_clock_init(void)
{
/*
* 1. 在設置APLL之前, 先設置時鐘源為晶振
*/
CLK_SRC_CPU = 0x0;
/*
* 2. 設置APLL
*/
/* 2.1 設置鎖定時間: APLL_CON0中PDIV=3, 所以APLL_LOCK = 270x3 */
APLL_LOCK = 270 * 3;
/* 2.2 設置分頻參數 */
/*
* CORE2_RATIO = 0;
* APLL_RATIO = 2;
* PCLK_DBG_RATIO = 1;
* ATB_RATIO = 6;
* PERIPH_RATIO = 7;
* COREM1_RATIO = 7;
* COREM0_RATIO = 3;
* CORE_RATIO = 0;
*/
CLK_DIV_CPU0 = ((0<<28) | (2<<24) | (1<<20) | (6<<16) | (7<<12) | (7<<8) | (3<<4) | 0);
/*
* CORES_RATIO = 5;
* HPM_RATIO = 0;
* COPY_RATIO = 6;
*/
CLK_DIV_CPU1 = ((5 << 8) |(0 << 4) | (6));
/* 2.3 設置控制參數并使能PLL */
/* 默認值 */
APLL_CON1 = 0x00803800;
/*
* 設置APLL的M,P,S值, APLL輸出 = 0xAF x 24MHz / (3 x 2 ^ 0) = 1.4GHz
* 使能APLL
*/
APLL_CON0 = (1<<31 | 0xAF<<16 | 3<<8 | 0x0);
/* 3. 設置MUX, 使用APLL的輸出 */
CLK_SRC_CPU = 0x01000001;
}
注釋的已經很清楚了,需要注意的就是:上電之后 IROM設置了APLL ,CPU工作于APLL提供的時鐘;當我們要改變 APLL時,要先使得CPU工作于另一個時鐘源,即晶振。設置完APLL后,再讓CPU重新工作于APLL提供的時鐘。
二、編譯、燒寫實驗
按照前幾節介紹的方法,將程序上傳到服務器編譯,并燒寫到SD卡上,給開發板上電,可以明顯感覺到LED閃爍的頻率大大提高(比《Tiny4412之C語言實現流水燈》時閃爍的還要快,因為當時CPU運行在400MHZ,現在運行在1.4GHZ),說明我們設置的時鐘起作用了,這里就不上圖了(上了圖大家也看不出來)。
第三個小實驗
實現的目標:參考廠家提供的u-boot代碼,設置所有PLL供后續章節使用
一、程序說明
文件同第一個小實驗,只是在它的基礎上對system_clock.c文件中的system_clock_init函數進行修改:
/*
函數名:
system_clock_init
功能:
初始化4412的系統時鐘
最終結果:
A=1400000000, M=800000000, E=96000000 V=350000000
ARMCLK=1500000000, DMC=400000000, ACLK200=160000000
ACLK100=100000000, ACLK160=160000000, ACLK133=133333333
*/
void system_clock_init(void)
{
/* 1.設置CMU_CPU相關 */
CLK_SRC_CPU = 0x0; // 設置CMU_CPU部分中所有的MUX的源
/* 2.設置CMU_DMC相關 */
/*
CORE_TIMERS_RATIO = 0x0;
COPY2_RATIO = 0x0;
DMCP_RATIO = 0x1;
DMCD_RATIO = 0x1;
DMC_RATIO = 0x1;
DPHY_RATIO = 0x1;
ACP_PCLK_RATIO = 0x1;
ACP_RATIO = 0x3;
*/
CLK_DIV_DMC0 = ((0x0 << 28) | (0x0 << 24) | (0x1 << 20) | (0x1 << 16) | (0x1 << 12) | (0x1 << 8) | (0x1 << 4) | (0x3));
CLK_DIV_DMC1 = 0x07071713;
/* 3.設置CMU_TOP相關 */
/*
MUX_ONENAND_SEL = 0x0;
MUX_ACLK_133_SEL = 0x0;
MUX_ACLK_160_SEL = 0x0;
MUX_ACLK_100_SEL = 0x0;
MUX_ACLK_200_SEL = 0x0;
MUX_VPLL_SEL = 0x1;
MUX_EPLL_SEL = 0x1;
*/
CLK_SRC_TOP0 = ((0x0 << 28) | (0x0 << 24) | (0x0 << 20) | (0x0 << 16) | (0x0 << 12) | (0x1 << 8) | (0x1 << 4));
CLK_SRC_TOP1 = 0x01111000;
/*
ACLK_400_MCUISP_RATIO = 0x1;
ACLK_266_GPS_RATIO = 0x2;
ONENAND_RATIO = 0x1;
ACLK_133_RATIO = 0x5;
ACLK_160_RATIO = 0x4;
ACLK_100_RATIO = 0x7;
ACLK_200_RATIO = 0x4;
*/
CLK_DIV_TOP = ((0x1 << 24) | (0x2 << 20) | (0x1 << 16) | (0x5 << 12) | (0x4 << 8) | (0x7 << 4) | (0x4));
/* 3.設置CMU_LEFTBUS相關 */
CLK_SRC_LEFTBUS = 0x10;
/*
GPL_RATIO = 0x1;
GDL_RATIO = 0x3;
*/
CLK_DIV_LEFTBUS = ((0x1 << 4) | (0x3));
/* 4.設置CMU_RIGHTBUS相關 */
CLK_SRC_RIGHTBUS = 0x10;
/*
GPR_RATIO = 0x1;
GDR_RATIO = 0x3;
*/
CLK_DIV_RIGHTBUS = ((0x1 << 4) | (0x3));
/* 5.設置各個鎖相環(PLL)的locktime */
APLL_LOCK = (0x3 * 270);
MPLL_LOCK = (0x3 * 270);
EPLL_LOCK = (0x2 * 3000);
VPLL_LOCK = (0x2 * 3000);
/*
APLL_RATIO = 0x2;
CORE_RATIO = 0x0;
CORE2_RATIO = 0x0;
COREM0_RATIO = 0x3;
COREM1_RATIO = 0x7;
PERIPH_RATIO = 0x7;
ATB_RATIO = 0x6;
PCLK_DBG_RATIO = 0x1;
*/
CLK_DIV_CPU0 = ((0x0 << 28) | (0x2 << 24) | (0x1 << 20) | (0x6 << 16) | (0x7 <<12) | (0x7 << 8) | (0x3 << 4) | (0x0));
/*
CORES_RATIO = 0x5;
HPM_RATIO = 0x0;
COPY_RATIO = 0x6;
*/
CLK_DIV_CPU1 = ((0x5 << 8) |(0x0 << 4) | (0x6));
/* 6.設置APLL = 1400000000 */
APLL_CON1 = 0x00803800;
APLL_CON0 = (1<<31 | 0xAF<<16 | 0x3<<8 | 0x0);
/* 7.設置MPLL = 800000000 */
MPLL_CON1 = 0x00803800;
MPLL_CON0 = (1<<31 | 0x64<<16 | 0x3<<8 | 0x0);
/* 8.設置EPLL = 96000000 */
EPLL_CON2 = 0x00000080;
EPLL_CON1 = 0x66010000;
EPLL_CON0 = (1<<31 | 0x40<<16 | 0x2<<8 | 0x3);
/* 9.設置VPLL = 350000000 */
VPLL_CON2 = 0x00000080;
VPLL_CON1 = 0x66010000;
VPLL_CON0 = (1<<31 | 0x48<<16 | 0x2<<8 | 0x3);
/*10.修改源*/
CLK_SRC_CPU = 0x01000001;
CLK_SRC_DMC = 0x00011000;
CLK_SRC_TOP0 = 0x00000110;
CLK_SRC_TOP1 = 0x01111000;
}
二、編譯、燒寫實驗
按照前幾節介紹的方法,將程序上傳到服務器編譯,并燒寫到SD卡上,給開發板上電,現象和第二個小實驗完全相同。
上一篇:tiny4412 時鐘測試
下一篇:Tiny4412裸機程序之操作ICache
推薦閱讀
史海拾趣
磁聯達(CND-tek)公司成立于2002年,正值中國電子行業的蓬勃發展期。創始人王雪霞憑借對市場敏銳的洞察力和對技術的深厚理解,決定專注于網絡通訊類變壓器和濾波器的研發與生產。初創時期,公司面臨著資金短缺、技術積累不足和市場競爭激烈等多重挑戰。然而,王雪霞帶領團隊堅持不懈地研發新產品,不斷優化生產工藝,逐漸在市場上贏得了客戶的認可。
隨著電子行業的快速發展,Aborn Electronics意識到只有不斷創新才能在競爭中保持領先。公司加大了對研發的投入,引進了一批高素質的研發人才,并在多個技術領域取得了重要突破。其中,一項關于高效能電源管理技術的創新成果,不僅提高了產品的能效比,還為公司帶來了可觀的經濟效益。這一技術的成功應用,進一步提升了Aborn Electronics在行業內的影響力。
隨著航空業的逐漸發展,福特汽車公司意識到航空通信技術的重要性。在20世紀30年代,福特開始投資研發航空無線電通信系統,旨在提高飛行中的通信效率和安全性。這一舉措不僅促進了福特在航空技術領域的進一步拓展,也為后來的航空通信標準制定提供了參考。
在品牌建設方面,中微股份(Cmsemicon)同樣取得了顯著成果。公司注重品牌形象的塑造和傳播,通過參加國內外行業展會、發布新產品、加強與客戶和合作伙伴的溝通等方式,不斷提升品牌知名度和美譽度。同時,公司還積極拓展市場,與全球眾多知名企業建立了長期穩定的合作關系。這些努力不僅為公司帶來了更多的商業機會,也為公司的長遠發展奠定了堅實基礎。
在快速發展的過程中,DART公司也遇到了不少挑戰和危機。例如,某個時期全球電子元器件供應緊張,導致公司面臨嚴重的原材料短缺問題。面對這一挑戰,DART公司迅速調整采購策略,積極尋找新的供應商和替代品,并加強與現有供應商的合作和溝通。通過這些措施,公司成功度過了危機,并保持了業務的穩定增長。
Amplitronix LLC的創立,源于兩位年輕工程師對電子技術的熱愛與執著。他們發現市場上存在一種需求,即高性能、高精度的電子測量儀器。于是,他們決定攜手創業,將這個想法付諸實踐。初創時期,資金短缺、技術難題、市場競爭激烈,每一道關卡都考驗著他們的決心和毅力。但他們憑借著對技術的熱情和對市場的敏銳洞察,不斷研發創新,最終成功推出了首款產品,贏得了市場的初步認可。
在環境問題日益迫切的今天,以信息化促進環境保護、建設美麗家園已成為最有效有力的舉措之一。 北京xx科技有限公司的Q2406B型 GPRS無線數據傳輸產品,在環境監測、氣象、汛情測報中得到良好應用,成為了: 環境監測的"特種信號兵"; ...… 查看全部問答∨ |
|
六位電子鐘我想是每個初學電子或者初學單片機程序的朋友必做的項目吧,大家基本都在學習板上利用小尺寸數碼管做過,但是如果讓大家用1.8寸以上數碼管甚至20寸數碼管制作,大家覺得會什么問題呢?下面開始就大尺寸數碼管電子鐘制作談談個人的設計思 ...… 查看全部問答∨ |
|
請問用 ethereal 的時候識別不到網卡,是怎么回事? 在選擇網卡的interface處只有下面一行,發現并不是我機器上的網卡。 Generic dialup adapter: \\Device\\NPF_GenericDialupAdapter 這個現象 是由于我用優化工具優化電腦,之后抓包工具就找不 ...… 查看全部問答∨ |
|
evc DirectDraw 中DirectDrawCreate創建失敗 LPDIRECTDRAW pDD = NULL; hRet = ::DirectDrawCreate(NULL, &pDD, NULL); 返回-2005532450 不知道什么原因? 高手指點啊。… 查看全部問答∨ |
PC采用TCP&UDP測試工具接收2440發送的數據 新手求助 大家幫忙看看 問題:1.若發送內容只是一行字符的文件 只收到文件內容的第一個字符 TCP&UDP測試工具 計數顯示的數 是文件字符數2倍 2.若發送分辨率640X480 600K的b ...… 查看全部問答∨ |
本帖最后由 paulhyde 于 2014-9-15 09:27 編輯 50hz3v左右正弦波變方波,送430測頻率,方波效果最好的是哪種方法,最好和函數發生器效果一樣,因為我們能測函數發生器出來的方波,正弦波過零比較后的方波就不行了,方波上升沿那里放大后有小波動是 ...… 查看全部問答∨ |