一、arm-9 TQ2440
key.h
1 #ifndef __KEY_H__ 2 #define __KEY_H__ 3 4 #define GPFCON (*(volatile unsigned long *)0x56000050) 5 #define GPFDAT (*(volatile unsigned long *)0x56000054) 6 7 extern void key_init(void); 8 extern int key1(void); 9 extern int key2(void); 10 extern int key3(void); 11 extern int key4(void); 12 13 #endif
key.c
1 #include "key.h" 2 3 void key_init(void){ 4 //设置key 1 2 3 4 为输入引脚 5 GPFCON = ~0x3 & ~(0x3<<4) & ~(0x3<<8) & ~(0x3<<2); 6 } 7 8 int key1(void){ 9 if(GPFDAT & (0x1<<1)){ 10 return 0; 11 } 12 else{ 13 return 1; 14 } 15 } 16 17 int key2(void){ 18 if(GPFDAT & (0x1<<4)){ 19 return 0; 20 } 21 else{ 22 return 1; 23 } 24 } 25 26 27 int key3(void){ 28 if(GPFDAT & (0x1<<2)){ 29 return 0; 30 } 31 else{ 32 return 1; 33 } 34 } 35 36 int key4(void){ 37 if(GPFDAT & (0x1)){ 38 return 0; 39 } 40 else{ 41 return 1; 42 } 43 }
buzzer.h
1 #ifndef __BUZZER_H__ 2 #define __BUZZER_H__ 3 4 #define GPBCON (*(volatile unsigned long *)0x56000010) 5 #define GPBDAT (*(volatile unsigned long *)0x56000014) 6 7 extern void buzzer_init(void); 8 extern void buzzer_on(void); 9 extern void buzzer_off(void); 10 11 #endif
buzzer.c
1 #include "buzzer.h" 2 3 void buzzer_init(void){ 4 GPBCON &= ~0x3; 5 GPBCON |= 0x1; 6 } 7 8 void buzzer_on(void){ 9 GPBDAT |= 1; 10 } 11 12 void buzzer_off(void){ 13 GPBDAT &= ~1; 14 }
led.h
1 #ifndef __LED_H__ 2 #define __LED_H__ 3 4 #define GPBCON (*(volatile unsigned long*)0x56000010) 5 #define GPBDAT (*(volatile unsigned long*)0x56000014) 6 7 extern void led_init(void); 8 extern void led1_on(void); 9 extern void led1_off(void); 10 extern void led2_on(void); 11 extern void led2_off(void); 12 extern void led3_on(void); 13 extern void led3_off(void); 14 extern void led4_on(void); 15 extern void led4_off(void); 16 17 #endif
led.c
1 #include "led.h" 2 3 //初始化led寄存器 4 void led_init(void){ 5 //设置 led 1 2 3 4 为输出引脚 6 GPBCON &= ~(0xFF<<10); 7 GPBCON = (1<<10) | (1<<12) | (1<<14) | (1<<16); 8 } 9 10 void led1_on(void){ 11 //GPBDAT &= ~(1<<5); 12 GPBDAT &= ~(1<<5); 13 } 14 void led1_off(void){ 15 GPBDAT |= 1<<5; 16 } 17 18 void led2_on(void){ 19 GPBDAT &= ~(1<<6); 20 } 21 void led2_off(void){ 22 GPBDAT |= (1<<6); 23 } 24 25 void led3_on(void){ 26 GPBDAT &= ~(1<<7); 27 } 28 void led3_off(void){ 29 GPBDAT |= (1<<7); 30 } 31 32 33 void led4_on(void){ 34 GPBDAT &= ~(1<<8); 35 } 36 void led4_off(void){ 37 GPBDAT |= (1<<8); 38 }
main.c
1 #include "led.h" 2 #include "key.h" 3 #include "buzzer.h" 4 5 void delay(void); 6 7 int main(void){ 8 led_init(); 9 key_init(); 10 //蜂鸣器 11 buzzer_init(); 12 while(1){ 13 if(key1()){ 14 led1_on(); 15 led2_on(); 16 } 17 else{ 18 led1_off(); 19 led2_off(); 20 } 21 if(key2()){ 22 led3_on(); 23 led4_on(); 24 } 25 else{ 26 led3_off(); 27 led4_off(); 28 } 29 if(key3()){ 30 buzzer_on(); 31 } 32 else{ 33 buzzer_off(); 34 } 57 } 58 } 59 60 void delay(void){ 61 int i; 62 for(i = 0; i < 0xf000; i++){ 63 ; 64 } 65 }
led.lds
1 SECTIONS 2 { 3 . = 0x30000000; 4 .text :{ 5 main.o (.text); 6 *.o (.text); 7 } 8 .data :{ 9 *.o (.data); 10 } 11 __bss_start = .; 12 .bss :{ 13 *.o (.bss); 14 } 15 __end = .; 16 };
Makefile
1 CC=arm-linux-gcc 2 LD=arm-linux-ld 3 OBJ=arm-linux-objcopy 4 keyled_c:keyled_c.o 5 $(LD) -nostartfiles -nostdlib -T led.lds -e main -o keyled_c keyled_c.o 6 $(OBJ) -O binary keyled_c keyled_c.bin 7 keyled_c.o:keyled_c.c 8 $(CC) -march=armv5te -nostdlib -c -o keyled_c.o keyled_c.c 9 clean: 10 @rm -vf keyled_c.o keyled_c keyled_c.bin
上面的 led.lds 是设置代码和数据段的地址区
二、arm-A8 S5PV210
1 #define GPC0CON (*(volatile unsigned long*)0xE0200060) 2 #define GPC0DAT (*(volatile unsigned long*)0xE0200064) 3 4 #define GPH0CON (*(volatile unsigned long*)0xE0200C00) 5 #define GPH0DAT (*(volatile unsigned long*)0xE0200C04) 6 7 #define GPD0CON (*(volatile unsigned long*)0xE02000A0) 8 #define GPD0DAT (*(volatile unsigned long*)0xE02000A4) 9 10 #define GPD01OUT (1<<(4*1)) 11 12 #define GPC03OUT (1<<(3*4)) 13 #define GPC04OUT (1<<(4*4)) 14 15 #define GPH00IN ~(0xF<<(4*0)) 16 #define GPH01IN ~(0xF<<(4*1)) 17 int main(void){ 18 //设置led1 2 GPC0CON 为输出引脚 19 GPC0CON = GPC03OUT | GPC04OUT; 20 //设置按键1 2 GPH0CON 为输入引脚 21 GPH0CON = GPH00IN & GPH01IN; 22 //设置蜂鸣器 GPD0CON 为输出引脚 23 GPD0CON = GPD01OUT; 24 25 while(1){ 26 if(GPH0DAT & 0x1){ 27 GPC0DAT = 0x00; 28 GPD0DAT = 0x00; 29 } 30 else{ 31 GPC0DAT = 0x08; 32 GPD0DAT = 0x02; 33 } 34 if(GPH0DAT & 0x02){ 35 GPC0DAT = 0x00; 36 } 37 else{ 38 GPC0DAT = 0x10; 39 } 40 } 41 }
以上的宏定义都是根据开发板电路图找到CPU相对应的管脚,然后设置管脚就可以实现相应的功能。
Makefile:
1 CC=arm-linux-gcc 2 LD=arm-linux-ld 3 OBJ=arm-linux-objcopy 4 keyled_c:keyled_c.o 5 $(LD) -nostartfiles -nostdlib -Ttext=0x20008000 -e main -o keyled_c keyled_c.o 6 $(OBJ) -O binary keyled_c keyled_c.bin 7 keyled_c.o:keyled_c.c 8 $(CC) -march=armv5te -nostdlib -c -o keyled_c.o keyled_c.c 9 clean: 10 @rm -vf keyled_c.o keyled_c keyled_c.bin