先看一下原理圖:服務器
首先把按鍵對應的GPIO設置爲輸入模式,修改GPX3CON寄存器(板子不一樣,可能對應的GPIO管腳不一樣),經過上圖可知當沒有按下按鍵時,對應的GPIO狀態爲高電平,當有按鍵被按下時,對應的GPIO變爲低,咱們在程序一直檢測這幾個GPIO狀態便可。工具
其中Start.s文件同上一個實驗徹底相同;連接腳本key.lds的內容和led.lds徹底相同,只把名字改了改;Makefile的內容也大部分同樣,也只是改了改裏邊文件的名字,key.c的文件須要從新編寫,代碼以下:spa
/* * 程序說明 * 一上電,4個LED全亮,當某個按鍵被按下,則對應的LED熄滅(可同時按下多個鍵) * 對應關係:KEY1-LED1,KEY2-LED2,KEY3-LED3,KEY4-LED4 */ //按鍵對應的GPIO #define GPX3CON (*(volatile unsigned int *)0x11000C60) #define GPX3DAT (*(volatile unsigned int *)0x11000C64) //LED對應的GPIO #define GPM4CON (*(volatile unsigned int *)0x110002E0) #define GPM4DAT (*(volatile unsigned int *)0x110002E4) void delay(volatile int time) { for(; time > 0; time-- ); } int main(void) { unsigned long tmp = 0; unsigned char keyValue = 0; /* * GPX3_2-GPX3_5 設置爲輸入功能,用於檢測按鍵引腳的狀態 */ tmp = GPX3CON; tmp &= ~(0xffff << 8); GPX3CON = tmp; /* * GPM4_0-GPM4_3 設置爲輸出功能,用於控制LED的亮滅 */ tmp = GPM4CON; tmp &= ~0xffff; tmp |= 0x1111; GPM4CON = tmp; while(1) { //讀按鍵引腳狀態 keyValue = GPX3DAT; keyValue = (keyValue & (0xf << 2)) >> 2; if(keyValue != 0xf) //說明有按鍵被按下,再詳細判斷是哪一個按鍵被按下 { delay(1000); //防抖 keyValue = GPX3DAT; keyValue = (keyValue & (0xf << 2)) >> 2; GPM4DAT = ~keyValue; //設置LED亮、滅 } else { GPM4DAT = 0x00; } } return 0; }
其中註釋也比較詳細,控制原理上邊也說得很清楚了,這裏就很少說了,有問題能夠留言。code
1.編譯圖片
經過FTP或者其餘工具將Start.s、Makefile、key.lds 、key.c四個文件上傳到服務器上去,輸入make命令進行編譯將獲得key.bin文件。文件上傳
2.燒寫編譯
將SD卡插入電腦,並讓VmWare裏的Ubuntu識別出來,而後執行以下命令:class
./sd_fusing.sh /dev/sdb ../../hardware_code/key/led.bin
以下圖所示:原理
這裏就不貼圖片了,有興趣的能夠本身試驗。file