標籤:
一:LED驅動編寫
要編寫LED驅動,首先的知道開發板的構造;開發板分為核心板與底板;編寫驅動的第一步就是要看開發板,找到LED燈在開發板上的位置及所對應的名字;第一步就要查看核心板電路圖,以及底板電路圖;最後就是查看開發板手冊,然後進行程式編寫:
通過看開發板我們可以知道LED燈的位置的核心板上,在核心板上找到LED的電路圖,Ctrl+F可以在文檔中快捷尋找:
通過電路圖我們可以看出:LED燈的一端已經接高電平,只要給另一端加低電平LED就會被點亮。
然後查看LED在核心板上的引腳:
由我們可以看出,LED1對應的是GPM4_0
然後通過晶片資料手冊可以查到它的具體用法:
通過手冊我們可以看出:GPM4CON 置一輸出,表示控制,置零輸入,表示檢測,GPM4DAT表示它的值和引腳的電壓狀態對於,值為一時表示高電平,值為零時表示底電平,下面貼出代碼:
1 .global main 2 main: 3 mov ip, sp 4 sub sp, sp, #12 5 stmdb sp!, {fp, ip, lr} 6 add fp, sp, #8 7 8 ldr r3, gpmcon 9 ldr r0, =0x110 str r0, [r3]11 12 ldr r3, gpmdat13 ldr r0, =0x014 str r0, [r3]15 16 add sp, fp, #417 ldmdb sp, {fp, sp, pc} 18 19 gpmcon:20 .word 0x110002e021 22 gpmdat:23 .word 0x110002e4
下面的用C語言代碼是實現四個LED燈的閃爍
1 #define GPM4CON (*(unsigned long *)0x110002e0)//宏定義 2 #define GPM4DAT (*(unsigned long *)0x110002e4) 3 4 void (*udelay)(int) = 0xc3e25f90; 5 int main() 6 { 7 GPM4CON &= ~0xffff; 8 GPM4CON |= 0x1111; 9 10 while(1) {11 GPM4DAT |= 0xf;//led off12 udelay(250000);13 GPM4DAT &= ~0xf;14 udelay(250000);//led on15 } 16 }
跑馬燈:
1 #define GPM4CON (*(unsigned long *)0x110002e0) 2 #define GPM4DAT (*(unsigned long *)0x110002e4) 3 4 void (*udelay)(int) = 0xc3e25f90; 5 6 int main() 7 { 8 9 GPM4CON &= ~0xffff;10 GPM4CON |= 0x1111;11 unsigned long tmp = 0xf;12 13 while(1) {14 15 if((tmp & 0xf) == 0) {16 tmp = 0xf;17 }18 19 GPM4DAT = tmp << 1;20 tmp = GPM4DAT;21 udelay(250000);22 23 }24 25 }
流水燈:
1 #define GPM4CON (*(unsigned long *)0x110002e0) 2 #define GPM4DAT (*(unsigned long *)0x110002e4) 3 4 void (*udelay)(int) = 0xc3e25f90; 5 6 int main() 7 { 8 9 GPM4CON &= ~0xffff;10 GPM4CON |= 0x1111;11 unsigned long i = 0;12 while(1) {13 GPM4DAT = 0xf;14 GPM4DAT &= ~(1 << i);//流水15 udelay(500000);//延時16 i++;17 if(i == 4) {18 i = 0;19 } 20 }21 22 }
上面程式總用到的延時函數udelay(),由於U-Boot作為嵌入式Linux系統的引導,不具有標準C庫中的內容。要使用像printf函數,延時函數udelay(),就需要u-boot中提供的。u-boot函數內容在u-boot源碼檔案中就需要u-boot中提供的。u-boot函數內容在u-boot源碼檔案中的System.map檔案中。System.map檔案是被核心所使用的符號表。符號表是一個在符號名稱與它們的儲存空間位置間的查詢表格。符號名稱可能是變數的名稱或是函數名稱。當要查詢符號名稱的位置或是特定位置的符號名稱時,就會需要System.map。找到函數的對應地址,就可以對它進行使用了;
二:蜂鳴器驅動編寫:
通過開發板我們可以看出蜂鳴器位於底板:
查看電路圖:
通過查看底板手冊可知,當XpwmTOUT0處於高電平是蜂鳴器就會響起;通過XpwmTOUT0我們在核心板上找到它的引腳
然後查看晶片手冊:
由圖我們可以看出GPD0CON為0x1時控制控制:GPD0DAT為1為高電平:下面貼出彙編代碼:
1 .global main 2 main: 3 mov ip, sp 4 sub sp, sp, #12 5 stmdb sp!, {fp, ip, lr} 6 add fp, sp, #8 7 8 ldr r3, gpdcon 9 ldr r0, =0x110 str r0, [r3]11 12 ldr r3, gpmdat13 ldr r0, =0x114 str r0, [r3]15 16 add sp, fp, #417 ldmdb sp, {fp, sp, pc} 18 19 gpdcon:20 .word 0x114000a021 22 gpmdat:23 .word 0x114000a4
C語言的代碼:
1 #define GPD0CON (*(volatile unsigned long*)0x114000a0) 2 #define GPD0DAT (*(volatile unsigned long*)0x114000a4) 3 4 void (*udelay)(int) = 0xc3e25f90; 5 int main(void) 6 { 7 GPD0CON = 0x0001; 8 while(1){ 9 GPD0DAT = 0x1;10 udelay(250000);11 GPD0DAT = 0x0;12 udelay(250000);//延時13 }14 15 return 0;16 }
蜂鳴器驅動與led燈驅動,按鍵驅動