ARM裸機開發(五)SPI

2022-09-16 04:03:15 字數 4366 閱讀 5741

以下裸機程式基於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...