GPIO 便是輸入輸出端口,S3C2440A 包含了 130 個多功能輸入/輸出口引腳而且它們爲以下顯示的八個端口:linux
GPIO 的功能便是用於 CPU 採集外設信號(INPUT),CPU 輸出控制信號(OUTPUT),還有一種功能稱爲管腳複用功能,便是 GPIO 用於其餘信號功能,好比地址,串口等共呢個,GPIO 屬於 SOC 的內部外設。shell
GPIO 的使用須要寄存器配置。緩存
makefile多線程
1 # 獲取當前工做目錄 2 CURRDIR = $(shell pwd) 3 4 # 頭文件所在目錄 5 INCDIR = $(CURRDIR) 6 7 # 交叉編譯工具鏈的絕對路徑 8 CROSS_COMPILE = ~/work/s3c2440/tools/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 9 10 # 編譯器工具 11 AS = $(CROSS_COMPILE)as 12 LD = $(CROSS_COMPILE)ld 13 CC = $(CROSS_COMPILE)gcc 14 CPP = $(CC) -E 15 AR = $(CROSS_COMPILE)ar 16 NM = $(CROSS_COMPILE)nm 17 STRIP = $(CROSS_COMPILE)strip 18 OBJCOPY = $(CROSS_COMPILE)objcopy 19 OBJDUMP = $(CROSS_COMPILE)objdump 20 21 # 編譯器標識位設置 22 CFLAGS := 23 AFLAGS := 24 LDFLAGS := 25 CFLAGS := 26 AFLAGSL := 27 28 # 目標文件設置 29 objs := startup.o led.o 30 31 all: clean s3c2440.bin 32 33 34 # 執行編譯的過程 35 s3c2440.bin: $(objs) 36 $(LD) -Ttext 0x00000000 -o s3c2440_elf $^ 37 $(OBJCOPY) -O binary -S s3c2440_elf $@ 38 $(OBJDUMP) -D -m arm s3c2440_elf > s3c2440.dis 39 40 41 %.o:%.c 42 $(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< 43 44 %.o:%.S 45 $(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< 46 47 clean: 48 rm -f *.bin *_elf *.dis *.o
startup.S函數
1 .text 2 .global _start 3 4 _start: 5 ldr r0, =0x53000000 @ WATCHDOG寄存器地址 6 mov r1, #0x0 7 str r1, [r0] @ 寫入0,禁止WATCHDOG,不然CPU會不斷重啓 8 9 ldr sp, =1024*4 @ 設置堆棧,注意:不能大於4k, 由於如今可用的內存只有4K 10 @ nand flash中的代碼在復位後會移到內部ram中,此ram只有4K 11 12 bl main @ 調用 C 程序的 main 函數 13 14 halt_loop: 15 b halt_loop
led.c工具
1 /** 2 * 將0x56000050 強轉爲 unsigned long 型指針,並取這個地址的值 3 * volatile 關鍵字:防止編譯器優化,在應用層上多線程變量,在嵌入式中外設寄存器 4 */ 5 #define GPFCON (*(volatile unsigned long *)0x56000050) 6 #define GPFDAT (*(volatile unsigned long *)0x56000054) 7 #define GPFUP (*(volatile unsigned long *)0x56000058) 8 9 /** 設置 GPFCON 的 4 5 6 引腳爲輸出 */ 10 #define GPF4_OUT (1 << (4 * 2)) 11 #define GPF5_OUT (1 << (5 * 2)) 12 #define GPF6_OUT (1 << (6 * 2)) 13 14 static void delay_ms(unsigned long ms); 15 16 int main(void) 17 { 18 /** 將LED1-3對應的GPF4/5/6三個引腳設爲輸出 */ 19 GPFCON = GPF4_OUT | GPF5_OUT | GPF6_OUT; 20 21 unsigned long i = 0; 22 while(1){ 23 delay_ms(500); 24 GPFDAT = (~(i<<4)); // 根據i的值,點亮LED1,2,4 25 if(++i == 8) 26 i = 0; 27 } 28 } 29 30 static void delay_ms(unsigned long ms) 31 { 32 unsigned int i; 33 34 while(ms--) { 35 for(i = 0; i < 1200; i++); 36 } 37 }