以下裸機程式基於gt2440,編譯器為arm-linux-gcc-4.4.3。
程式結構:本程式只有乙個spi.s檔案。
程式流程:首先上電復位進入復位異常,在復位異常裡依次呼叫子程式關閉看門狗、初始化系統時鐘、初始化串列埠,最後呼叫spi傳送資料,spi傳送的資料在程式裡指定,對於本程式傳送資料為乙個位元組的字元『a』,最後spi將接收到的資料傳送到串列埠,在終端上顯示出來。
spi.s:
1//暫存器實體地址巨集定義
2#define wtcon 0x5300000034
#define locktime 0x4c000000
5#define mpllcon 0x4c000004
6#define upllcon 0x4c000008
7#define clkdivn 0x4c000014
8#define camdivn 0x4c000018910
#define ulcon0 0x50000000
11#define ucon0 0x50000004
12#define ufcon0 0x50000008
13#define utrstat0 0x50000010
14#define utxh0 0x50000020
15#define urxh0 0x50000024
16#define ubrdiv0 0x50000028
17//for uart io
18#define gphcon 0x56000070
1920
#define spicon0 0x59000000
21#define spsta0 0x59000004
22#define sppre0 0x5900000c
23#define sptdat0 0x59000010
24#define sprdat0 0x59000014
25//for spi0 io
26#define gpecon 0x56000040
2728
29.global _start
30_start:
31b reset
3233
//復位異常處理
34reset:
35bl disable_watchdog
36bl init_clock
37bl init_uart
38bl spi_send
39loop:
40b loop
4142
//關閉看門狗
43disable_watchdog:
44ldr r0,=wtcon
45bic r1,r0,#0x20
46str
r1,[r0]
4748
movpc,lr
4950
51//初始化時鐘
52//fclk=400mhz,hclk=100mhz,pclk=50mhz
53//uclk=48mhz
54init_clock:
55ldr r0,=locktime
56ldr r1,=0x00ffffff
57str
r1,[r0]
58ldr r0,=clkdivn
59ldr r1,=0x05
60str
r1,[r0]
61//設為非同步匯流排模式(因為fclk不等於hclk)
62 mrc p15,0,r1,c1,c0,0
63orr r1,r1,#0xc0000000
64 mcr p15,0,r1,c1,c0,0
6566
ldr r0,=mpllcon
67ldr r1,=0x5c011
68str
r1,[r0]
69ldr r0,=upllcon
70ldr r1,=0x38022
71str
r1,[r0]
7273
movpc,lr
7475
76//初始化串列埠
77init_uart:
78//io口設定為串列埠功能
79ldr r0,=gphcon
80ldr r1,=0xa0
81str
r1,[r0]
82//無檢驗位,1位停止位,8位資料位
83ldr r0,=ulcon0
84ldr r1,=0x03
85str
r1,[r0]
86//pclk作為時鐘源(50mhz)
87ldr r0,=ucon0
88ldr r1,=0x05
89str
r1,[r0]
90//115200bps
91ldr r0,=ubrdiv0
92ldr r1,=0x1a
93str
r1,[r0]
9495
movpc,lr
9697
spi_send:
98//設定io為spi模式
99 ldr r0,=((0x2<<26)|(0x2<<24)|(0x2<<22
))100
ldr r1,=gpecon
101str
r0,[r1]
102 //時鐘分頻數(pclk/2/(249+1
))103
ldr r0,=sppre0
104ldr r1,=0xf9
105str
r1,[r0]
106//polling模式,主機模式,使能sclk,自動傳送垃圾模式
107ldr r0,=spicon0
108ldr r1,=0x19
109str
r1,[r0]
110111
wait_send:
112//檢查狀態暫存器是否已經準備好
113ldr r2,=spsta0
114ldr r1,[r2]
115ldr r3,=0x01
116and
r3,r1,r3
117cmp
r3,#0x01
118bne wait_send
119//傳送乙個位元組
120ldr r0,=sptdat0
121ldr r1,=0x41 //字元a
122str
r1,[r0]
123124
wait_read:
125//檢查狀態暫存器是否已經準備好
126ldr r1,[r2]
127ldr r3,=0x01
128and
r3,r1,r3
129cmp
r3,#0x01
130bne wait_read
131//讀接收到的資料到r5
132ldr r0,=sprdat0
133ldr r5,[r0]
134//呼叫串列埠將接收到的資料傳送到終端
135bl aurt_send_one_byte
136137
movpc,lr
138139
140aurt_send_one_byte:
141wait_se:
142//讀傳送狀態位
143ldr r0,=utrstat0
144ldr r1,[r0]
145and
r1,r1,#0x4
146cmp
r1,#0x4
147//如果傳送狀態位不為0則不斷讀狀態位
148bne wait_se
149//寫入要傳送的資料
150ldr r3,=utxh0
151str
r5,[r3]
152153
mov pc,lr
makefile:
1 spi.bin:2arm-linux-gcc -g -c -o spi.o spi.s
3arm-linux-ld -ttext 0x00000000 -g spi.o -o spi_elf
4arm-linux-objcopy -o binary -s spi_elf spi.bin
5rm -f uart_elf spi.o67
clean:
8 rm -f spi.bin
執行make後將生成的spi.bin檔案通過bios燒寫到nand flash,將mosi和miso兩個引腳短接,從nand flash啟動。
ARM 裸機 02 ARM裸機開發流程
執行在不同平台上的程式,開發過程不盡相同。為了更好地理解 arm 裸機的開發流程,我們先和比較熟悉的 windows linux 應用程式開發對比。不同平台程式開發流程對比示意 編譯嵌入式程式的平台稱為宿主機,譬如執行 ubuntu 系統的 pc。執行嵌入式程式的平台稱為目標機,譬如 arm 開發板...
(五)arm裸機開發 主頻和時鐘配置
本節主要涉及imx6ull的時鐘配置,包括arm核心時鐘配置,外設時鐘配置,以及imx6ull的時鐘樹設定。主要參考的是imx6ull的reference imx6ull 參考手冊 二 編寫程式 imxull的時鐘 於倆部分,一部分是實時時鐘,32.768mhz,用於提供rtc的時鐘。另一部分是24...
ARM裸機開發快速體驗
一。linux平台 自己寫makefile 自己寫lds指令碼 自己搭建除錯環境 二。裸機開發流程 1 編寫裸機程式 2 除錯裸機程式 3 編譯 鏈結 格式轉換成二進位制映像 1.安裝交叉工具鏈 把課程裡面的工具包拷貝到linux,解壓arm linux gcc到根目錄 c 交叉工具在usr loc...