電路原理
對應的GPIO口默認硬件上拉,有按鍵按下時對應的IO口變為低電平,將對應的GPIO口設置為輸入,檢測對應的電平即可檢測按鍵的動作。
將LED、BEEP、KEY相關的GPIO都初始化,然后進入while(1)死循環,不停的判斷按鍵的動作,一旦有按鍵按下,執行對應的if-else語句,然后控制對應的LED、BEEP。
DATASHEET(寄存器詳解)
2.2.56 GPH0控制寄存器端口組
GPH0控制寄存器組包含4個控制寄存器:GPH0CON, GPH0DAT, GPH0PUD 和 GPH0DRV。
2.2.56.1 Port Group GPH0 Control Register (GPH0CON, R/W, Address = 0xE020_0C00)
2.2.56.2 Port Group GPH0 Control Register (GPH0DAT, R/W, Address = 0xE020_0C04)
2.2.56.3 Port Group GPH0 Control Register (GPH0PUD, R/W, Address = 0xE020_0C08)
2.2.56.4 Port Group GPH0 Control Register (GPH0DRV, R/W, Address = 0xE020_0C0C)
2.2.58 PORT GROUP GPH2 CONTROL REGISTER
GPH2寄存器組詳解(此處省略,具體可查看文檔S5PV210_UM_REV1.1.pdf 中相關部分)
代碼編寫
demo源碼工程目錄詳解
06-key/
├── Makefile
└── source
├── beep.c
├── include
│ ├── beep.h
│ ├── include_all.h
│ ├── key.h
│ └── led.h
├── key.c
├── led.c
├── main.c
└── start.S
2 directories, 10 files
其他(led、beep及start.S等)部分代碼請參考之前章節(裸機LED/BEEP)。
/*****************************************************
* > File Name: key.c
* > Author: fly
* > Create Time: 2021-07-02 5/26 13:57:16 +0800
*==================================================*/
#include #include #include typedef struct{ unsigned int GPH0CON; unsigned int GPH0DAT; unsigned int GPH0PUD; unsigned int GPH0DRV; }gph0; #define GPH0 (*(volatile gph0 *)0xE0200C00) typedef struct{ unsigned int GPH2CON; unsigned int GPH2DAT; unsigned int GPH2PUD; unsigned int GPH2DRV; }gph2; #define GPH2 (*(volatile gph2 *)0xE0200C40) void key_init(void) { /* * POWER -> EINT1 -> GPH0_1 * LEFT -> EINT2 -> GPH0_2 * DOWN -> EINT3 -> GPH0_3 * UP -> KP_COL0 -> GPH2_0 * RIGHT -> KP_COL1 -> GPH2_1 * BACK -> KP_COL2 -> GPH2_2 * MENU -> KP_COL3 -> GPH2_3 */ GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<4)) | (0x0<<4); GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<8)) | (0x0<<8); GPH0.GPH0CON = (GPH0.GPH0CON & ~(0xf<<12)) | (0x0<<12); GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<0)) | (0x0<<0); GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<4)) | (0x0<<4); GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<8)) | (0x0<<8); GPH2.GPH2CON = (GPH2.GPH2CON & ~(0xf<<12)) | (0x0<<12); } unsigned int keyPower_value(void) { return (GPH0.GPH0DAT & (0x1<<1)); } unsigned int key1_value(void) { return (GPH0.GPH0DAT & (0x1<<2)); } unsigned int key2_value(void) { return (GPH0.GPH0DAT & (0x1<<3)); } unsigned int key3_value(void) { return (GPH2.GPH2DAT & (0x1<<0)); } unsigned int key4_value(void) { return (GPH2.GPH2DAT & (0x1<<1)); } unsigned int key5_value(void) { return (GPH2.GPH2DAT & (0x1<<2)); } unsigned int key6_value(void) { return (GPH2.GPH2DAT & (0x1<<3)); } void tester_key(void) { key_init(); led_init(); beep_init(); while(1){ if(!key1_value()){ led_set_led1(1); }else{ led_set_led1(0); } if(!key2_value()){ led_set_led2(1); }else{ led_set_led2(0); } if(!key3_value()){ led_set_led3(1); }else{ led_set_led3(0); } if(!key4_value()){ led_set_led4(1); }else{ led_set_led4(0); } if(!key5_value()){ led_set_all_led(1); }else{ //led_set_all_led(0); } if(!key6_value()){ beep_set(1); }else{ beep_set(0); } #if 0 if(keyPower_value()) { beep_set(0); } #endif /* 測試NG */ } } /*************************************************** * > File Name: main.c * > Author: fly * > Create Time: 2021-07-02 5/26 12:45:25 +0800 *==================================================*/ #include int main(int argc, char* argv[]) { tester_key(); return 0; } Makefile文件: # 將所有的.o文件鏈接成.elf文件,“-Ttext 0x0” # 表示程序的運行地址是0x0,由于目前編寫的是位置 # 無關碼,可以在任一地址運行 # 將elf文件抽取為可在開發板上運行的bin文件 # 將elf文件反匯編保存在dis文件中,調試程序會用 # 添加文件頭 .PHONY: all clean tools CROSS ?= arm-linux- NAME := KEY LD := $(CROSS)ld OC := $(CROSS)objcopy OD := $(CROSS)objdump CC := $(CROSS)gcc MK := ../../tools/mk_image/mkv210_image CFLAGS := -nostdlib -Wall INCDIR := ./source/include SRCDIR := ./source OBJS := start.o beep.o led.o key.o main.o OUTDIR := output all:$(NAME).bin $(NAME).bin : $(OBJS) $(LD) -Ttext 0x0 -o $(NAME).elf $^ $(OC) -O binary $(NAME).elf $(NAME).bin $(OD) -D $(NAME).elf > $(NAME)_elf.dis $(MK) $(NAME).bin # 將當前目錄下存在的匯編文件及C文件編譯成.o文件 %.o : $(SRCDIR)/%.S $(CC) -o $@ $< -c $(CFLAGS) -I $(INCDIR) %.o : $(SRCDIR)/%.c $(CC) -o $@ $< -c $(CFLAGS) -I $(INCDIR) clean: $(RM) *.o *.elf *.bin *.dis *.sd tools: make -C ../../tools/mk_image/
上一篇:S5PV210 | 裸機蜂鳴器實驗
下一篇:S5PV210 | 安裝交叉編譯工具鏈(toolchain)
推薦閱讀最新更新時間:2025-06-22 16:29


設計資源 培訓 開發板 精華推薦
- 納祥科技2W 24位數字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調器的定義和工作原理
- 從性能與網絡傳輸出發,講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業與酒店業運營模式
- 跨國商務溝通困局破解之道:時空壺 W4Pro 全場景應用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構 AI 同傳技術標準?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區電梯場景等的冗余通信
- LoRa與UWB的“定位之戰”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領AI同傳新時代,革新演講翻譯體驗
- ARXML 規則下 ECU 總線通訊與 ADTF 測試方案