試過了GPIO的輸出功能,再來測試下GPIO的輸入功能。開發板上有四個用戶按鍵,使用這四個按鍵來控制四個LED的狀態。linux
我們的按鍵在底板上,因此須要看底板的原理圖
web
打開底板原理圖(Tiny4412SDK-1506-Schematic.pdf)
svg
用戶按鍵KEY一、KEY二、KEY三、KEY4分別對應了GPX3_二、GPX3_三、GPX3_四、GPX3_5,而且按鍵引腳日常是高電平,按鍵被按下變爲低電平。工具
由原理圖可知,程序只進行了兩步操做。測試
第一步:GPX3CON功能配置寄存器,地址爲0x11000000+0x00000C60=0x11000C60,每四位控制一個引腳,0輸入,1輸出等等,這裏咱們用到的是輸入功能。spa
Base Address: 0x1100_0000code
Address = Base Address + 0x0C60, Reset Value = 0x0000_0000
orm
第二步:GPX3DAT數據寄存器,讀取對應的位便可。
xml
Key控制對應的LEDblog
gpio.h文件
#ifndef __GPIO_H__ #define __GPIO_H__ typedef volatile unsigned int U32; typedef volatile unsigned short U16; typedef volatile unsigned char U8; //LED #define GPM4CON *(U32*)0x110002e0 #define GPM4DAT *(U32*)0x110002e4 //Key #define GPX3CON *(U32*)0x11000c60 #define GPX3DAT *(U32*)0x11000c64 //Buzzer #define GPD0CON *(U32*)0x114000a0 #define GPD0DAT *(U32*)0x114000a4 //LED初始化 int led_init(void); //LED 全亮 int led_allon(void); //LED 全滅 int led_alloff(void); //Buzzer初始化 int bell_init(void); //Buzzer 開 int bell_on(void); //Buzzer 關 int bell_off(void); //Key初始化 int key_init(void); //key value獲取 int key_get(void); #endif/*__GPIO_H__*/
key.c文件
#include "gpio.h" //Key初始化 int key_init(void) { GPX3CON &= ~(0xffff << 8); return 0; } //key value獲取 int key_get(void) { return (GPX3DAT >> 2) & 0xf; }
led.c文件
#include <gpio.h> //LED初始化 int led_init(void) { GPM4CON &= ~0xffff; GPM4CON |= 0x1111; return 0; } //LED 全亮 int led_allon(void) { GPM4DAT &= ~0xf; return 0; } //LED 全滅 int led_alloff(void) { GPM4DAT |= 0xf; return 0; } //LED one 亮 int led_on(U32 i) { GPM4DAT &= ~(1 << i); return 0; } //LED one 滅 int led_off(U32 i) { GPM4DAT |= (1 << i); return 0; } int led_set(U32 val) { GPM4DAT &= ~0xf; GPM4DAT |= val; return 0; } U32 led_get(void) { return GPM4DAT & 0xf; }
lib.c文件
int delay(unsigned int i) { while(--i) ; } int delay1() { unsigned int i = 0xfffff; while(--i) ; }
test.c文件
#include "gpio.h" int main(void) { int val = 0; led_init(); key_init(); while(1) { val = key_get(); led_set(val); delay1(); } return 0; }
Makefile文件
CROSS_COMPILE = arm-linux- CC = $(CROSS_COMPILE)gcc CC_FLAGS = -c -I ./ LD = $(CROSS_COMPILE)ld LD_FLAGS = -T start.lds -Ttext 0x40000000 OBJCOPY = $(CROSS_COMPILE)objcopy COPY_FLAGS = -O binary OBJDUMP=$(CROSS_COMPILE)objdump DUMP_FLAGS=-D TARGET=test OBJS=start.o led.o lib.o test.o bell.o key.o all: $(OBJS) $(LD) $(LD_FLAGS) $(OBJS) -o $(TARGET) $(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin $(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis rm -rf *.o %.o:%.s $(CC) $(CC_FLAGS) $< %.o:%.S $(CC) $(CC_FLAGS) $< %.o:%.c $(CC) $(CC_FLAGS) $< .PHONY:clean clean: rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)
led控制蜂鳴器 key1控制蜂鳴器開,key2控制蜂鳴器關
test.c文件
#include "gpio.h" int (*print)(const char *format, ...) = (void*)0x43e11a2c; int main(void) { U32 val = 0; bell_init(); key_init(); while(1) { val = key_get(); print("val = %p\n", val^0xf); if (0x1 == (val^0xf)) { bell_on(); } else if (0x2 == (val^0xf)) { bell_off(); } delay1(); } return 0; }
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf