s3c2440 gpio实验

来源:互联网 发布:mac壁纸软件推荐 编辑:程序博客网 时间:2024/05/22 00:44

实验一

目的:用汇编点亮一个led灯

代码:

led_on.s

. text
.global _start
_start:
ldr r1, =0x56000050;此处用mov报错
mov r2, #0x100
str r2,[r1]
ldr r1, =0x56000054
mov r2, #0x00
str r2, [r1]
MAIN_LOOP:
B       MAIN_LOOP

Makefile:

led_on.bin:led_on.s
arm-linux-gcc -c led_on.s -o led_on.o
arm-linux-ld -Ttext  0x0000000 led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f   led_on.bin led_on_elf *.o

将程序下载到nand flash并以nand flash方式启动,nand flash的前4k内容会自动拷贝到片内的SRAM中,以SRAM为0地址开始执行。


实验二

目的:用c语言点亮一个led

代码:

crt0.s

.text 
.global _start
_start:
ldr r1, =0x53000000 @关闭看门狗
mov r2, #0x00
str r2, [r1]
mov sp, #1024*4@设置堆栈,由于是nand flash启动,现在程序在片内SDRAM中,最大为4k
bl main
halt_loop:
b halt_loop

led_on_c.c

#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main(void)
{
GPFCON = 0X100;
GPFDAT = 0X00;
return 0;
}

Makefile:

led_on_c.bin:crt0.o led_on_c.o
arm-linux-ld -Ttext 0x0 crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
crt0.o:crt0.s
arm-linux-gcc -c -g -o crt0.o crt0.s
led_on_c.o:led_on_c.c
arm-linux-gcc -c -g -o led_on_c.o led_on_c.c
clean:
rm -f   led_on.bin led_on_elf *.o 

实验三

目的:轮流点亮三个led

crt0.s

.text
.global _start
_start:
ldr r0, =0x53000000@关闭看门狗
mov r1, #0x00
str r1, [r0]

ldr sp, =1024*4@此时为nand flash启动,4kb程序自动拷贝到内部SRAM,此时内存最大为1024*4
bl main
halt_loop:
b halt_loop


leds.c

//三个灯D10~D12分别对应引脚GPF4~GPF6
#define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT  (*(volatile unsigned long *)0x56000054)
void delay(unsigned int dly)
{
for(; dly > 0; dly--);
}


int main(void)
{
int led_pin_num;
GPFCON = 0x1500;
for(led_pin_num = 4; led_pin_num < 7; led_pin_num++){
delay(30000);
GPFDAT = 1<<led_pin_num;
if(led_pin_num == 6)
led_pin_num = 3;
}
return 0;
}

Makefile:

leds.bin : crt0.S  leds.c
arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c
arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf
arm-linux-objcopy -O binary -S leds_elf leds.bin
arm-linux-objdump -D -m arm  leds_elf > leds.dis
clean:
rm -f   leds.dis leds.bin leds_elf *.o

实验四:

目的:按下按键点亮led,松开熄灭led

crt0.s

.text
.global _start
_start:
ldr r0, =0x53000000@关闭看门狗
mov r1, #0x00
str r1, [r0]
ldr sp, 1024*4@设置堆栈
bl main
halt_loop:
b halt_loop

key_led.c

//三个led灯D10~D12分别对应引脚GPF4~GPF6,按键S2~S4分别对应引脚GPF0、GPF2、GPG3
#define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT  (*(volatile unsigned long *)0x56000054)


#define GPGCON  (*(volatile unsigned long *)0x56000060)
#define GPGDAT  (*(volatile unsigned long *)0x56000064)


#define GPF4_OUT (1<<8)
#define GPF5_OUT (1<<10)
#define GPF6_OUT (1<<12)
#define GPF4_MSK (3<<8)
#define GPF5_MSK (3<<10)
#define GPF6_MSK (3<<12)


#define GPF0_IN  (0)
#define GPF2_IN  (0<<4)
#define GPG3_IN  (0<<6)
#define GPF0_MSK (3)
#define GPF2_MSK (3<<4)
#define GPG3_MSK (3<<6)
int main()
{
unsigned char key_value = 1;
//GPF4~GPF6为输出
GPFCON &= ~(GPF4_MSK | GPF5_MSK GPF6_MSK);
GPFCON |= (GPF4_OUT | GPF5_OUT | GPF6_OUT);
//GPF0和GPF2位输入
GPFCON &= ~(GPF0_MSK | GPF2_MSK);
GPFCON |= (GPF0_in | GPF2_in);
//GPG3为输入
GPGCON &= ~(GPG3_MSK);
GPGCON |= GPG3_IN;
while(1){
key_value = GPFDAT;
if(key_value & (1))
GPFDAT |= (1<<4);
else
GPFDAT &= (~(1<<4));
if(key_value & (1<<2))
GPFDAT |= 1<<5;
else
GPFDAT &= (~(1<<5));
key_value = GPGDAT;
if(key_value & (1<<3))
GPFDAT |= 1<<6;
else
GPFDAT &= 1<<6;
}
return 0;
}

Makefile:

key_led.bin : crt0.S  key_led.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o key_led.o key_led.c
arm-linux-ld -Ttext 0x0000000 -g  crt0.o key_led.o -o key_led_elf
arm-linux-objcopy -O binary -S key_led_elf key_led.bin
arm-linux-objdump -D -m arm  key_led_elf > key_led.dis
clean:
rm -f   key_led.dis key_led.bin key_led_elf *.o

原创粉丝点击