2 3 裸機部分 掌握ARM晶元時鐘體系

2021-09-16 22:17:49 字數 3445 閱讀 7820

cpu-fclk:400mhz

ahb匯流排-hclk:136mhz

apb匯流排-pclk:68mhz

文件解釋:

中文翻譯:fclk、hclk和pclk,fclk由arm920t使用。hclk用於ahb匯流排,由arm920t、記憶體控制器、中斷控制器、lcd控制器、dma和usb主機塊。pclk用於apb匯流排,用於wdt、iis、i2c、pwm定時器、mmc介面等外圍裝置,adc、uart、gpio、rtc和spi。

(假設我們要使用fclk=400mhz,hclk=100mhz,pclk=50mhz——>1:4:8)

/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */

講解:

設定clkdiv的hdivn[2:1]=10且camdivn[9]=0(預設為0,如果沒使用可以不修改):hclk=fclk/4

設定clkdiv的[0]為1:pclk=hclk/2

所以設定完後clkdiv=0x101

講解:設定mpllcon:fclk=400m→mdiv=92,pdiv=1 ,sdiv=1

m=mdiv+8=92+8=100,p=pdiv+2=1+2=3,s=sdiv=1+2=3

mpll=2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400m=fclk

/* 設定mpllcon(0x4c000004) = (92<<12)|(1<<4)|(1<<0)

*  m = mdiv+8 = 92+8=100

*  p = pdiv+2 = 1+2 = 3

*  s = sdiv = 1

*  fclk = 2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400m

*/ldr r0, =0x4c000004

ldr r1, =(92<<12)|(1<<4)|(1<<0)

str r1, [r0]

所以我們還需要將這段**拷貝到我們的start.s中去,讓cpu處於非同步模式

mmu_setasyncbusmode

mrc p15,0,r0,c1,c0,0

orr r0,r0,#r1_nf:or:r1_ia

mcr p15,0,r0,c1,c0,0

.text

.global _start

_start:

/* 關閉看門狗 */

ldr r0, =0x53000000

ldr r1, =0

str r1, [r0]

/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */

/* locktime(0x4c000000) = 0xffffffff */

ldr r0, =0x4c000000

ldr r1, =0xffffffff

str r1, [r0]

/* clkdivn(0x4c000014) = 0x5, tfclk:thclk:tpclk = 1:4:8  */

ldr r0, =0x4c000014

ldr r1, =0x5

str r1, [r0]

/* 設定cpu工作於非同步模式 */

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000   //r1_nf:or:r1_ia

mcr p15,0,r0,c1,c0,0

/* 設定mpllcon(0x4c000004) = (92<<12)|(1<<4)|(1<<0)

*  m = mdiv+8 = 92+8=100

*  p = pdiv+2 = 1+2 = 3

*  s = sdiv = 1

*  fclk = 2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400m

*/ldr r0, =0x4c000004

ldr r1, =(92<<12)|(1<<4)|(1<<0)

str r1, [r0]

/* 一旦設定pll, 就會鎖定lock time直到pll輸出穩定

* 然後cpu工作於新的頻率fclk

*//* 設定記憶體: sp 棧 */

/* 分辨是nor/nand啟動

* 寫0到0位址, 再讀出來

* 如果得到0, 表示0位址上的內容被修改了, 它對應ram, 這就是nand啟動

* 否則就是nor啟動

*/mov r1, #0

ldr r0, [r1] /* 讀出原來的值備份 */

str r1, [r1] /* 0->[0] */

ldr r2, [r1] /* r2=[0] */

cmp r1, r2   /* r1==r2? 如果相等表示是nand啟動 */

ldr sp, =0x40000000+4096 /* 先假設是nor啟動 */

moveq sp, #4096  /* nand啟動 */

streq r0, [r1]   /* 恢復原來的值 */

bl main

halt:

b halt

2 3樹 Java實現部分演算法

2 3樹是一種樹結構型別的檢索樹,符合下面的定義 1 乙個節點包含乙個或兩個關鍵碼 2 每個內部結點有兩個子女 如果它包含乙個關鍵碼 或三個子女 如果它包含三個關鍵碼 3 所有葉結點都在樹的同一層,因此樹的高度總是平衡的 4 對於每個結點,其左子樹的所有後繼結點都小於第乙個關鍵碼的值,而其中間子樹的...

第23課 跟蹤系統事件,充分掌握系統執行動態

在本節課,我們要介紹 linux 上兩個非常有用的工具 ltrace 和 strace。在分析軟體的執行過程 除錯疑難 bug 執行效能分析和調優等方面,它們都是非常有用的輔助工具。另外,我們還會介紹與之相關的乙個功能強大的系統呼叫 ptrace。充分理解並掌握 ptrace 的使用,能夠實現一些很...

牛客小白月賽23 部分題解

e 水題簽到 include using namespace std intmain j 水題 include using namespace std int a 100005 intmain sort a,a n cout a 0 i 題意 尋找字典序最大的子串 思路 遍歷兩個for,然後把所有的...