S3C2440之裸机之C语言存储控制器

虚拟机环境:Oracle VM VirtualBox
Linux系统:ubuntu_14.04.6
交叉编译工具:[100ask分享的所有文件](https://eyun.baidu.com/s/3b1UtLc)
100ask分享的所有文件 > 002_JZ2440资料光盘_20180516(免费) > 资料光盘 > A盘 > tools.zip > arm-linux-gcc-4.3.2.tar.bz2
gcc-3.4.5-glibc-2.3.6/bin

第一步:查看原理图

left middle right
nLED4 nLED2 nLED1
GPF6 GPF5 GPF4

输出低电平点亮LED灯
输出高电平熄灭LED灯

第二步:查看芯片手册

寄存器 地址 配置
BWSCON 0x48000000 0x22011110
BANKCON0 0x48000004 0x00000700
BANKCON1 0x48000008 0x00000700
BANKCON2 0x4800000C 0x00000700
BANKCON3 0x48000010 0x00000700
BANKCON4 0x48000014 0x00000700
BANKCON5 0x48000018 0x00000700
BANKCON6 0x4800001C 0x00018005
BANKCON7 0x48000020 0x00018005
REFRESH 0x48000024 0x008C07A3
BANKSIZE 0x48000028 0x000000B1
MRSRB6 0x4800002C 0x00000030
MRSRB7 0x48000030 0x00000030

第三步:编写程序
head.S:

.text
.global _start

.equ	MEM_CTL_BASE,	0x48000000
.equ	SDRAM_BASE,		0x30000000

_start:
	bl disable_watch_dog
	bl memsetup
	bl copy_steppingstone_to_sdram
	ldr pc,=on_sdram

on_sdram:
	ldr sp,=0x34000000
	bl main

halt_loop:
	b halt_loop

disable_watch_dog:
	mov r1,#0x53000000
	mov r2,#0x0
	str r2,[r1]
	mov pc, lr

copy_steppingstone_to_sdram:
	mov r1,#0
	ldr r2,=SDRAM_BASE
	mov r3,#4*1024

1:
	ldr r4,[r1],#4
	str r4,[r2],#4
	cmp r1,r3
	bne 1b
	mov pc,lr

memsetup:
	mov r1,#MEM_CTL_BASE
	adrl r2,mem_cfg_val
	add r3,r1,#52

1:
	ldr r4,[r2],#4
	str r4,[r1],#4
	cmp r1,r3
	bne 1b
	mov pc,lr

.align 4
mem_cfg_val:
	.long 0x22011110
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00000700
	.long 0x00018005
	.long 0x00018005
	.long 0x008C07A3
	.long 0x000000B1
	.long 0x00000030
	.long 0x00000300

leds.c:

#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)

static inline void wait(unsigned long dly)
{
	for (; dly > 0; dly --);
}

int main(void)
{
	unsigned long i = 0;

	GPFCON = 0x00001500;
	GPFDAT = 0x00000070;

	while (1) {
		wait(30000);
		GPFDAT = (~(i<<4));
		if (++ i == 8)
			i = 0;
	}

	return 0;
}

第四步:编写makefile
makefile:

ARM_LINUX_XXX=/home/xlbtlmy/Desktop/ARM_Linux/gcc-3.4.5-glibc-2.3.6/bin

CC=$(ARM_LINUX_XXX)/arm-linux-gcc
LD=$(ARM_LINUX_XXX)/arm-linux-ld
OBJCOPY=$(ARM_LINUX_XXX)/arm-linux-objcopy
OBJDUMP=$(ARM_LINUX_XXX)/arm-linux-objdump
TARGET=$(OPT)

src_c=$(shell ls *.c)
objs_c=$(patsubst %.c,%.o,$(src_c))

src_s=$(shell ls *.S)
objs_s=$(patsubst %.S,%.o,$(src_s))

objs=$(objs_c) $(objs_s)

BIN=$(TARGET).bin
ELF=$(TARGET).elf
DIS=$(TARGET).dis

$(BIN):$(objs)
	$(LD) -Ttext 0x30000000 head.o leds.o -o $(ELF)
	$(OBJCOPY) -O binary -S $(ELF) $(BIN)
	$(OBJDUMP) -D -m arm $(ELF) > $(DIS)

%.o:%.c
	$(CC) -c -o $@ $<

%.o:%.S
	$(CC) -c -o $@ $<

.PHONY:clean
clean:
	rm -f *.o *.bin *.elf *.dis

make OPT=leds

第五步:烧录运行
eop.bat:

@echo off

:JTAG(0:OpenJTAG 1:DongleJTAG 2:Wiggler)
SET JTAG=0
:CPU(0:S3C2410 1:S3C2440 2:S3C6410)
SET CPU=1
:Flash(0:Nand 1:Nor)
SET Flash=0
:Access(0:Write 1:Read)
SET Access=0
:Offset()
SET Offset=0
:File()
SET File=leds.bin

oflash %JTAG% %CPU% %Flash% %Access% %Offset% %File%

pause

注意问题:

1.编写makefile时,要注意链接时,要将head.o放在leds.o前面,否则现象异常

第五步:观察实验现象
流水灯

发布了50 篇原创文章 · 获赞 14 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/u011958166/article/details/95065312
今日推荐