一: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, =0x1 10 str r0, [r3] 11 12 ldr r3, gpmdat 13 ldr r0, =0x0 14 str r0, [r3] 15 16 add sp, fp, #4 17 ldmdb sp, {fp, sp, pc} 18 19 gpmcon: 20 .word 0x110002e0 21 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 off 12 udelay(250000); 13 GPM4DAT &= ~0xf; 14 udelay(250000);//led on 15 } 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, =0x1 10 str r0, [r3] 11 12 ldr r3, gpmdat 13 ldr r0, =0x1 14 str r0, [r3] 15 16 add sp, fp, #4 17 ldmdb sp, {fp, sp, pc} 18 19 gpdcon: 20 .word 0x114000a0 21 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
+關注
關注
240文章
23134瀏覽量
658416 -
存儲器
+關注
關注
38文章
7452瀏覽量
163599 -
LED驅動
+關注
關注
72文章
989瀏覽量
137953 -
蜂鳴器
+關注
關注
12文章
889瀏覽量
45869
發布評論請先 登錄
相關推薦
評論