Tiny4412之蜂鳴器驅動與led燈驅動


  一: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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM