蜂鳴器驅動與led燈驅動,按鍵驅動

來源:互聯網
上載者:User

標籤:

  一: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燈驅動,按鍵驅動

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.