專題6-新增除錯資訊(led)
阿新 • • 發佈:2019-01-07
下面將基於前面寫的start.S、gboot.lds、和makefile,加入led的除錯資訊,驗證程式是否完全正確。(比如:點亮led2、led4)
GPIO控制方法主要涉及到兩個暫存器:
資料暫存器裡面的值決定該IO口輸出高電平還是低電平。
2440的led是接在GPB上的:
由原理圖可知,當led的引腳接低電平時,led會亮。
暫存器:
控制暫存器(決定輸入輸出),共22位,每兩位控制一個引腳:
資料暫存器(決定高低電平):
程式如下:
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
light_led:
ldr r0 ,=GPBCON
ldr r1,=0x15400 #設定GPB5(led1)~GPB8(led4)為輸出模式,(01 01 01 01 00 00 00 00 00),其他預設為輸入
str r1,[r0]
ldr r0,=GPBDAT
ldr r1,=0x6BF #GPB5(led1)與GPB7(led3)為低電平,其他的預設設為高電平。(11010111111)
str r1,[r0]
mov pc,lr
將gboot.bin下載到處理器,可以觀察到led2和led4亮了。
對於6440的板子,在核心初始化中有一步忘記操作了,就是外設地址的初始化。核心初始化可參考專題5。
外設地址初始化:
70000000為外設基地址。
set_peri_port:
ldr r0, =0x70000000 #為外設的基地址
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4
mov pc, lr
6440點亮led:
GPKCON0每4位控制1位引腳:
程式碼:
#define GPKCON 0x7f008800
#define GPKDAT 0x7f008808
light_led:
ldr r0, =GPKCON
ldr r1, =0x11110000 #led1~led4配置為輸出
str r1, [r0]
ldr r0, =GPKDAT
ldr r1 , =0xa0 #10100000 led2 和led4 亮
str r1, [r0]
mov pc, lr