娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月16日(星期一)

正在發生

2021年12月16日 | TINY4412裸機程序,時鐘操作

發布者:中華古風 來源: eefocus關鍵字:TINY4412  裸機程序  時鐘操作 手機看文章 掃描二維碼
隨時隨地手機看文章

其實,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裸機程序,時鐘操作

上一篇:TINY4412裸機程序,按鍵檢測
下一篇:tiny4412 裸機程序 一、說明

推薦閱讀

集微網消息,早前三星宣布與美國運營商Verizon聯手,宣布于2019年上半年推出5G手機。又有爆料消息指出,三星Galaxy S10系列手機將很有可能支持5G功能。根據荷蘭網站GalaxyClub報道,三星S10+的5G美版型號為SM-G977U,韓版5G型號則為SM-G977N。據悉,三星S10+的5G歐版機型型號將是SM-G977F,預計上市時間要晚于美版和韓版,最快也會于2019年6月才發布。但...
隨著人工智能、物聯網、機器學習等新興數字技術的更多應用,汽車正向著智能化、網聯化的方向快速發展,智能網聯汽車將徹底改變人們的出行方式。而中國憑借龐大的汽車消費群體也將成為全球最大的智能網聯汽車市場。據有關機構的數據,2020年中國乘用智能網聯汽車市場規模將為558億美元,2025年達到1347億美元,遠高于全球水平。 面對如此巨大的市場規模,如...
當電機較大時,啟動是個必須注意的問題。比較簡單且用的很多的是星三角啟動,這里寫出了星三角啟動的核心部分。每一個IO口接上繼電器,再控制交流接觸器,就OK了。但,要注意,星、角交流接觸器一定要互鎖,否則一旦某個交流接觸器粘連,就造成短路了。#include <reg51.h>sbit K1=P3^1; //按鍵1,控制第1個繼電器啟動sbit K2=P3^2; //按鍵2,控制第2...
東芝推出業界最小封裝類型之一[1]的4-Form-A電壓驅動光繼電器,進一步減小半導體測試儀的尺寸中國上海,2021年12月16日——東芝電子元件及存儲裝置株式會社(“東芝”)今日宣布,推出三款采用業界最小封裝類型之一[1]的4-Form-A電壓驅動光繼電器---“TLP3407SRA4”、“TLP3412SRHA4”與“TLP3475SRHA4”,這三款器件于今日開始支持批量出貨。新產品是東芝...

史海拾趣

問答坊 | AI 解惑

移植6.0的BSP,終于看到桌面了, 狂喜散分

搞了近二星期, 終于看到6.0的桌面了, 也就是說我的OAL部分和LCD驅動部分已移植成功. 板子是優龍的FS2410, 原來提供的是5.0的BSP. 用的還是4.2的目錄結構, 移植過程那就一痛苦. 我的方法是先clone的一個6.0的自帶的BSP, 用的是DEVICEEMULATOR. 我 ...…

查看全部問答∨

wince中支持電源管理的驅動?

怎么才能使一個設備支持電源管理呢, 驅動注冊表中的IClass有什么用處 謝謝…

查看全部問答∨

如何用硬件實現視頻疊加?

如何在攝像中添加一些圖像和字符,怎樣確定圖像和字符的位置?實現的原理是怎樣的,謝謝!…

查看全部問答∨

eboot.nb0與eboot.bin????

請教高手,同一板子上有兩個不同版本的BSP,A版的EBOOT.NB0和EBOOT.BIN都是好的,B版要用A版的EBOOT.NB0燒B版的EBOOT.BIN,EBOOT才能起來,也就是說,為什么用B版的EBOOT.NB0燒B版的EBOOT.BIN后,EBOOT起不來,EBOOT.BIN又沒有問題,請問高手是什么 ...…

查看全部問答∨

TXM,AD公司DSP原裝開發套件在國內有代理公司嗎?

AD公司DSP原裝開發套件在國內有代理公司嗎? 聯系方式是什么,知道的TX幫幫我吧,先謝了。 …

查看全部問答∨

踏踏實實做個電子人

直到現在,已經進入學校實驗室有三個月了,打第一天起,算是開始了我的電子生涯,這三個月來,經歷了很多,雖然沒有參加今年的電子大賽,但是從協助師哥師姐們參賽的經歷中學到了很多,也懂得了很多,我覺得最大一點是:實力才是王道!任何時候,天 ...…

查看全部問答∨

上傳點M051的資料

M051全系列的片子價格不會超過10元,而且性能可以,所以感覺以后可能會發展起來,特意想代理商要了些入門的資料,希望對壇友有用!~…

查看全部問答∨

UCOS移植問題

請問在Micrium網站上下的Port文件uCOSII-ST-STM32F103ZE-SK.exe如何解壓出源碼文件? 鏈接是http://micrium.com/download/uCOSII-ST-STM32F103ZE-SK.exe…

查看全部問答∨

非常奇怪的I2C地址問題,召喚達人!

如圖片,這是我的芯片的I2C的地址說明。我讓芯片作為從,主機(STM32的I2C2)作為主。上面說了可以用:通用地址:0000000或者11XXXXHW,我把HW接高電平了,HW=1.但是我試遍了11XXXX1,主機都得不到ACK,用0000000曾經試通過,并且讀到信息。現在 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 澄江县| 竹溪县| 海南省| 新兴县| 洛宁县| 收藏| 扶绥县| 三河市| 焦作市| 板桥市| 光山县| 曲靖市| 综艺| 张家港市| 舟曲县| 濮阳县| 德庆县| 高陵县| 怀来县| 长宁区| 库尔勒市| 汾阳市| 淮北市| 石门县| 昭觉县| 榆林市| 彰化县| 墨竹工卡县| 长子县| 鄂托克前旗| 姜堰市| 焦作市| 本溪市| 东辽县| 凌海市| 民乐县| 海丰县| 宁波市| 靖州| 沂南县| 无极县|