ram/rom:ram掉電丟失,rom掉電不丟失;
ram中又分兩大類,dram/sram;
sram:static ram執行速度飛快,記憶體小,昂貴;
dram:dynamic ram 執行速度比rom快,比sram慢,便宜(電腦記憶體);
flash:又稱快閃儲存器,它結合了rom和ram的長處,不僅具備電子可擦除可程式設計(eeprom)的效能,還不會斷電丟失資料同時可以快速讀取資料(nvram的優勢);
flash:又分為nor flash和nadn flash兩種
1.nor flash的讀取和我們常見的sdram的讀取是一樣,使用者可以直接執行裝載在nor flash裡面的**,這樣可以減少sram的容量從而節約了成本。
2.nand flash沒有採取記憶體的隨機讀取技術,它的讀取是以一次讀取一塊的形式來進行的,通常是一次讀取512個位元組,採用這種技術的flash比較廉價。使用者不能直接執行nand flash上的**,因此好多使用nand flash的開發板除了使用nand flah以外,還作上了一塊小的nor flash來執行啟動**。
emmc = nand快閃儲存器+快閃儲存器控制晶元+標準介面封裝。
2440max-----(fclk:400mhz\hclk:136mhz\pclk:68mhz)
由12mhz晶振(osc),通過鎖相環(pll)分別得到。
mpll:main pll
upll:usb pll
fclk = 晶振->mpll
hclk(ahb匯流排) = 晶振->mpll->hdivn(分頻)
pclk(apb匯流排) = 晶振->mpll->pdivn(分頻)
2440啟動流程:
1.復位引腳等待電源穩定
2.fclk起振 = 晶振頻率
3.電源穩定,復位晶元輸出高電平,鎖存om[3:2]引腳訊號,同時cpu開始執行
4.設定pll->cpu停止,pll工作,fclk停止(lock time)
5.locktime結束後->fclk = pll新設的時鐘,cpu執行
目標:fclk執行於400m,hclk = fclk/4(100m),pclk=fclk/8(50m)。
查閱2440晶元手冊;
clock divider control (clkdivn) register:
00 : hclk = fclk/1.
01 : hclk = fclk/2.
10 : hclk = fclk/4 when camdivn[9] = 0.
hclk= fclk/8 when camdivn[9] = 1.
11 : hclk = fclk/3 when camdivn[8] = 0.
hclk = fclk/6 when camdivn[8] = 1
1.設定clkdivn 的 1、2位為』1』'0』且第9位為0,可使hclk為fclk的1/4;設定0位為』1』可使pclk = fclk/2。
clkdivn = 0x5;
2.設定pllcon = 0x5c11,可使fclk = 400m。
3.查閱2440手冊 244page ,當hdvin不為0時,cpu要設定為非同步模式,否則就會以hclk執行。
//設定為非同步模式,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*/
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)*/
ldr r0, =0x4c000004
ldr r1, =0x5c011
str r1,[r0]
/*一旦設定pll,就會鎖定locktime直到pll輸出穩定*/
/*設定記憶體:sp棧,判斷是nand or nor啟動*/
mov r1,#0
ldr r0,[r1] /*先讀0位址,留作備份*/
str r1,[r1] /*將#0存入[0]位址*/
ldr r2,[r1] /*r2 = [0]*/
cmp r1,r2 /*比較r1,r2,相等則為nand啟動*/
ldr sp, = 0x40000000+4096 /*先假設nor啟動*/
moveq sp, #4096 /*如果相等*/
streq r0,[r1] /*恢復原先的值*/
bl main
halt:
b halt
ARM 裸機 02 ARM裸機開發流程
執行在不同平台上的程式,開發過程不盡相同。為了更好地理解 arm 裸機的開發流程,我們先和比較熟悉的 windows linux 應用程式開發對比。不同平台程式開發流程對比示意 編譯嵌入式程式的平台稱為宿主機,譬如執行 ubuntu 系統的 pc。執行嵌入式程式的平台稱為目標機,譬如 arm 開發板...
學習arm裸機程式
兩個星期,打通了以mini2440為基礎,找別人借了個見jlink,編譯軟體用的是mdk4.22,打通了arm裸機的大部分程式,包括io 定時器 串列埠 中斷 ad等等,其中最重要的和微控制器的不同是位址問題 原先微控制器的c語言不需要管位址,但現在需要了,特別是rom ram的設定 其中比較重要的...
ARM裸機led控制
define gpj0con 0xe0200240 define gpj0dat 0xe0200244 global start 將 start設定為外部屬性 start ldr r0,0x11111111 偽指令編譯器判斷是否為合法立即數 一般都是偽指令 ldr r1,gpj0con str r0...