一:LED驅(qū)動編寫
要編寫LED驅(qū)動,首先的知道開發(fā)板的構(gòu)造;開發(fā)板分為核心板與底板;編寫驅(qū)動的第一步就是要看開發(fā)板,找到LED燈在開發(fā)板上的位置及所對應(yīng)的名字;第一步就要查看核心板電路圖,以及底板電路圖;最后就是查看開發(fā)板手冊,然后進行程序編寫:
通過看開發(fā)板我們可以知道LED燈的位置的核心板上,在核心板上找到LED的電路圖,Ctrl+F可以在文檔中快捷查找:

通過電路圖我們可以看出:LED燈的一端已經(jīng)接高電平,只要給另一端加低電平LED就會被點亮。
然后查看LED在核心板上的引腳:

由上圖我們可以看出,LED1對應(yīng)的是GPM4_0
然后通過芯片數(shù)據(jù)手冊可以查到它的具體用法:

通過手冊我們可以看出:GPM4CON 置一輸出,表示控制,置零輸入,表示檢測,GPM4DAT表示它的值和引腳的電壓狀態(tài)對于,值為一時表示高電平,值為零時表示底電平,下面貼出代碼:
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語言代碼是實現(xiàn)四個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 }
上面程序總用到的延時函數(shù)udelay(),由于U-Boot作為嵌入式Linux系統(tǒng)的引導(dǎo),不具有標(biāo)準(zhǔn)C庫中的內(nèi)容。要使用像printf函數(shù),延時函數(shù)udelay(),就需要u-boot中提供的。u-boot函數(shù)內(nèi)容在u-boot源碼文件中就需要u-boot中提供的。u-boot函數(shù)內(nèi)容在u-boot源碼文件中的System.map文件中。System.map文件是被內(nèi)核所使用的符號表。符號表是一個在符號名稱與它們的存儲器位置間的查詢表格。符號名稱可能是變量的名稱或是函數(shù)名稱。當(dāng)要查詢符號名稱的位置或是特定位置的符號名稱時,就會需要System.map。找到函數(shù)的對應(yīng)地址,就可以對它進行使用了;

二:蜂鳴器驅(qū)動編寫:
通過開發(fā)板我們可以看出蜂鳴器位于底板:
查看電路圖:

通過查看底板手冊可知,當(dāng)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
+關(guān)注
關(guān)注
243文章
24618瀏覽量
691104 -
存儲器
+關(guān)注
關(guān)注
39文章
7739瀏覽量
171733 -
LED驅(qū)動
+關(guān)注
關(guān)注
73文章
1089瀏覽量
142613 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
900瀏覽量
47778
發(fā)布評論請先 登錄
深入解析LM3519:高頻升壓白光LED驅(qū)動器的卓越之選
TPS61042:高性能LED驅(qū)動芯片的深度解析
深入解析LM27952:高效白光LED驅(qū)動芯片的全方位洞察
LT1932:高效LED驅(qū)動芯片的設(shè)計與應(yīng)用解析
電子工程師必看:LTM8040 LED驅(qū)動模塊深度解析
LTC3212 RGB LED 驅(qū)動芯片深度解析
LT3746:高效32通道LED驅(qū)動芯片的解析與應(yīng)用
LT3478:高性能LED驅(qū)動芯片的深度解析
ADP8863:多功能LED驅(qū)動芯片的深度解析
ADP8860:多功能LED驅(qū)動芯片的全解析
LT3950:多功能LED驅(qū)動芯片的全面解析
LT3909:高性能2MHz升壓LED驅(qū)動器的深度解析
LED1642GW:16通道LED驅(qū)動芯片的深度解析
深入解析LED7708:高效LED驅(qū)動的理想之選
關(guān)于有源蜂鳴器及無源蜂鳴器的區(qū)別及驅(qū)動各類單片機案例
一文解析蜂鳴器驅(qū)動及LED驅(qū)動編寫
評論