ARM嵌入式學習--OK6410裸板程序--1.GPIO控制LED

基本概念:linux

1.GPIO--通用IO口,經過芯片針腳來控制或讀取外設的數據。ide

2.GPIO口的使用原理,經過設置GPXXCON, GPXXDAT, GPXXPUL等寄存器來設置GPIO口的狀態。oop

原理圖:spa

跟硬件相關的部分,必定要閱讀原理圖,而後經過查找SoC的用戶手冊來查找相應的寄存器設置便可。code

底板電路圖:blog

核心板電路圖:內存

可知在OK6410上4個LED燈是經過GPM這一組的GPIO口控制的,分別是GPM0-GPM3四組。開發

而後打開S3C6410X User's Manual,查找GPM相關的寄存器:event

經過上面內容找到:class

GPMCON 地址 0x7F008820

GPMDAT 地址 0x7F008824

因爲LED鏈接着GPM0-GPM3,因此經過上面的內容能夠知道,GPMCON設置的值應該爲0x00001111,意思是將GPM0-GPM3設置爲輸出,這樣經過設置GPMDAT[5:0]來控制響應針腳的高低電平,使LED亮或滅。

 

代碼:(如下代碼參考了友善之臂Tiny6410的彙編代碼,並不是原創)

彙編代碼:

 1 .global _start
 2 
 3 _start:
 4         // 把外設的基地址告訴CPU
 5         ldr r0, =0x70000000//對於6410來講,內存(0x000000000x60000000),外設(0x70000000-0x7fffffff)
 6         orr r0, r0, #0x13                      //外設大小:256M
 7         mcr p15,0,r0,c15,c2,4               //把r0的值(包括了外設基地址+外設大小)告訴cpu
 8     
 9         // 關看門狗
10         ldr r0, =0x7E004000
11         mov r1, #0
12         str r1, [r0] 
13 
14         // 設置GPMCON0                                                                                   
15         ldr r1, =0x7F008820                                                                                   
16         ldr r0, =0x00001111                                                                                         
17         str r0, [r1]
18 
19         mov r2, #0x1000
20 led_blink:
21         // 設置GPMDAT,使GPM_0/1/2/3引腳輸出低電平,LED亮
22         ldr r1, =0x7F008824 
23         mov r0, #0
24         str r0, [r1]
25 
26         // 延時
27         bl delay
28 
29         // 設置GPMDAT,使GPM_0/1/2/3引腳輸出高電平,LED滅
30         ldr r1, =0x7F008824 
31         mov r0, #0x0f
32         str r0, [r1]
33 
34         // 延時
35         bl delay
36 
37         sub r2, r2, #1
38         cmp r2,#0
39         bne led_blink
40 
41 halt:
42         b halt
43 
44 
45 delay:
46         mov r0, #0x1000000
47 delay_loop:
48         cmp r0, #0
49         sub r0, r0, #1
50         bne delay_loop
51         mov pc, lr
start.S

Makefile:

 1 led.bin: start.o
 2         arm-linux-ld -Ttext 0x50008000 -o led.elf $^
 3         arm-linux-objcopy -O binary led.elf led.bin
 4         arm-linux-objdump -D led.elf > led_elf.dis
 5 %.o : %.S
 6         arm-linux-gcc -o $@ $< -c
 7 
 8 %.o : %.c
 9         arm-linux-gcc -o $@ $< -c 
10 
11 clean:
12         rm *.o *.elf *.bin *.dis  -rf

而後make,能夠獲得led.bin,經過tftp下載到開發板中:

而後就能夠看到OK6410板上的四個LED燈開始一塊兒閃爍。

 

總結:

1.GPIO口的使用實際上是SoC外設控制中最簡單的,只要抓住GPIO的幾個寄存器,將他們的值設置正確,就能夠完成相應的控制功能。

2.必定要學會查看SoC的User's Manual的方法,這樣當SoC換成其餘品牌時,能夠以不變應萬變。

3.使用ld來連接.o文件時,通常會指定-Ttext選項,表示該代碼會在內存的哪一個地址加載,經過查看User's Manual,你能夠決定這個地址的範圍,以下圖,0x50000000-0x6FFFFFFF地址區間映射到DRAM上,因此絕大部分的資料中,S3C6410中的內存地址都是0x5xxxxxxx相似的地址。也有一些0xcxxxxxxx相似的地址,這是打開SoC中的MMU後進行物理地址和虛擬地址映射後的結果,若是打開了MMU,就可使用0xcxxxxxxx這樣的地址,不然沒法使用。

相關文章
相關標籤/搜索