ARM裸機知識

2021-09-29 21:02:50 字數 2828 閱讀 6111

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...