Tiny4412裸機按鍵控制LED燈
試過了GPIO的輸出功能,再來測試下GPIO的輸入功能。開發板上有四個使用者按鍵,使用這四個按鍵來控制四個LED的狀態,發現使用位操作真的是非常方便。
- 開發板:Tiny4412SDK標準版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平臺:Ubuntu 14.04
1. 在原理圖上找到按鍵對應的GPIO
在上一篇中,通過原理圖已經知道了使用者LED1-4,對應了GPM4_0-GPM4_3,再來看下KEY1-4對應的管腳。

使用者按鍵

GPX3
使用者按鍵KEY1、KEY2、KEY3、KEY4分別對應了GPX3_2、GPX3_3、GPX3_4、GPX3_5,並且按鍵引腳平常是高電平,按鍵被按下變為低電平。
2. 晶片手冊查詢GPIO相關暫存器
控制暫存器GPX3CON:

GPX3CON
資料暫存器GPX3DAT:

GPX3DAT
配置GPX3所對應的位為0,即為輸入模式。
3. 編寫程式
#define GPIOBASE0x11000000 #define GPM4CON(*(volatile unsigned long *)(GPIOBASE + 0x02E0)) #define GPM4DAT(*(volatile unsigned long *)(GPIOBASE + 0x02E4)) #define GPX3CON(*(volatile unsigned long *)(GPIOBASE + 0x0C60)) #define GPX3DAT(*(volatile unsigned long *)(GPIOBASE + 0x0C64)) int key(void) { unsigned long value; /*設定LED1-4對應GPIO為輸出模式*/ GPM4CON &= ~((0xF<<0) | (0xF<<4) | (0xF<<8) | (0xF<<12)); GPM4CON |= ((1<<0) | (1<<4) | (1<<8) | (1<<12)); /*設定KEY1-4對應GPIO為輸入模式*/ GPX3CON &= ~((0xF<<8) | (0xF<<12) | (0xF<<16) | (0xF<<20)); while(1) { value = GPX3DAT; //讀取GPX3電平狀態 if(value & (1<<2)) //Key1 --> GPX3_2 { GPM4DAT |= (1<<0); //LED1 --> GPM4_0 }else{ GPM4DAT &= ~(1<<0); } if(value & (1<<3)) //Key2 --> GPX3_3 { GPM4DAT |= (1<<1);//LED2 --> GPM4_1 }else{ GPM4DAT &= ~(1<<1); } if(value & (1<<4)) //Key3 --> GPX3_4 { GPM4DAT |= (1<<2);//LED3 --> GPM4_2 }else{ GPM4DAT &= ~(1<<2); } if(value & (1<<5)) //Key4 --> GPX3_5 { GPM4DAT |= (1<<3); //LED4 --> GPM4_3 }else{ GPM4DAT &= ~(1<<3); } } return 0; }
Makefile程式碼如下:
default: arm-linux-gcc -c key.c-o key.o arm-linux-ld-Ttext=0x70003000key.o-o key arm-linux-objcopy-O binarykeykey.bin clean: rm -f key.okeykey.bin*~
執行make clean,然後make,生成key.bin二進位制檔案。

生成二進位制檔案
4. 上傳程式到開發板
- 在串列埠中執行:
dnw 70003000
等待dnw下載。

等待下載
- 在ubuntu下檔案目錄下執行:
dnw key.bin

上傳

完成
- 檔案通過dnw下載到開發板記憶體地址0x70003000,執行:
go 70003000
程式執行。

執行
5. 按鍵控制LED狀態

LED

KEY