本文是對韋東山嵌入式第一期學習的記錄之一,若有您須要查找的信息,能夠繼續往下閱讀。linux
想要用按鍵點亮LED燈,就須要知道按鍵和LED燈的相關信息,這樣才能夠進行以後的操做。閱讀JZ2440的原理圖,能夠獲得如下信息(見下方圖片)學習
JZ2440開發板用到了S2,S3,S4三個按鍵,nLED1,nLED2,nLED4三盞LED燈,它們對應的寄存器位分別是:spa
按鍵:S2(EINT0)——GPF0 S3(EINT2)——GPF2 S4(EINT11)——GPG3code
LED: nLED1——GPF4 nLED2——GPF5 nLED4——GPF6blog
知道這些以後,須要進一步瞭解相應寄存器的信息,閱讀S3C2440的芯片手冊,能夠獲得如下信息(見下方圖片)圖片
GPFCON和GPFDAT寄存器開發
GPGCON和GPGDAT寄存器it
對於LED:須要設置GPFCON的GPF4/5/6,讓它們變成輸出引腳【GPFCON的bit8/9設爲0b01,bit10/11設爲0b01,bit12/13設爲0b01】編譯
對於按鍵:須要設置GPFCON的GPF0(s2鍵),GPF2(s3鍵)以及GPGCON的GPG3(s4鍵),讓它們變成輸入引腳【GPFCON的bit0/1設爲0,bit4/5設爲0,GPGCON的bit6/7設爲0】class
因爲GPFCON與GPFDAT是對應的,GPGCON與GPGDAT是對應的,根據芯片手冊關於GPFDAT和GPGDAT的描述(上面的圖片)可知:
當端口配置爲輸入時,相應的位爲針狀態。當端口配置爲輸出時,引腳狀態爲與相應的位相同。 當端口配置爲功能引腳時,將讀取未定義的值。
由此能夠知道:
按鍵的狀態對應GPFDAT中位0和位2的值以及GPGDAT中位3的值,LED的狀態對應GPFAT中位6/5/4的值
按鍵和LED同樣,平時電位都處於拉高狀態,對應着鬆開和熄滅(也就是1),當按鍵按下時,或者LED點亮時,對應着低電位(也就是0)
所以,GPFDAT寄存器和GPGDAT寄存器也須要進行相關的設置(程序中體現)。
接下來僅對C程序進行解析:
1 #include "s3c2440_soc.h" //寫好了寄存器地址的宏,C程序中直接寫寄存器名稱便可 2 int main(void) 3 { 4 int val1,val2; 5 /*設置GPFCON的GPF4/5/6,讓它們變成輸出引腳*/ 6 GPFCON &=~((3<<8)|(3<<10)|(3<<12)); //先讓GPFCON的GPF4/5/6清零 7 GPFCON |=((1<<8)|(1<<10)|(1<<12)); //配置好GPFCON的GPF4/5/6,讓它們變成輸出引腳 8 9 /*設置GPFCON的GPF0(s2鍵),GPF2(s3鍵)以及GPGCON的GPG3(s4鍵),讓它們變成輸入引腳*/ 10 GPFCON &=~((3<<0)|(3<<4)); 11 GPGCON &=~(3<<6); 12 13 /*按下點亮*/ 14 while(1) 15 { 16 val1=GPFDAT; 17 val2=GPGDAT; 18 if(val1 & (1<<0)) //判斷S2鍵是否按下,對應GPF6的LED燈 19 { 20 GPFDAT |=(1<<6); //此時S2鍵爲鬆開,LED應該熄滅 21 } 22 else 23 { 24 GPFDAT &=~(1<<6); //此時S2鍵爲按下,LED應該點亮 25 } 26 if(val1 & (1<<2)) //判斷S3鍵是否按下,對應GPF5的LED燈 27 { 28 GPFDAT |=(1<<5); //此時S3鍵爲鬆開,LED應該熄滅 29 } 30 else 31 { 32 GPFDAT &=~(1<<5); //此時S3鍵爲按下,LED應該點亮 33 } 34 if(val2 & (1<<3)) //判斷S4鍵是否按下,對應GPF4的LED燈 35 { 36 GPFDAT |=(1<<4); //此時S4鍵爲鬆開,LED應該熄滅 37 } 38 else 39 { 40 GPFDAT &=~(1<<4); //此時S4鍵爲按下,LED應該點亮 41 } 42 } 43 return 0; 44 }
整個C程序到此就寫完了,連同其餘文件(start.S / s3c2440_soc.h / makefile 本文沒有附上)一塊兒上傳到linux編譯後,獲得的bin文件,燒寫到JZ2440開發板上,通過驗證,按鍵按下時,對應的LED亮,鬆開時熄滅。