历史上的今天
今天是:2025年04月26日(星期六)
2019年04月26日 | 2440裸板程序之内存初始化及重定位
2019-04-26 来源:eefocus
LED对应的引脚是GPF4、GPF5、GPF6。
使用的编译器为arm-linux-gcc-4.5.1。
包括四个文件head.S main.c main.lds Makefile。
实验目的:把点灯的程序搬运到内存中执行。
2440使用nand启动时,会将nand前4k硬件搬运到内部4ksram中。如果需要运行大型程序的话,还要初始化外部内存。

与nGCS6或7片选相连的可以是内存,且6或7只能接同一种大小的内存。
JZ2440v2采用的是两个钰创EM63A165TS-6G的SDRAM,每个4M word x 16-bit x 4-bank,共512Mbit,也就是64M。两个16bit的组成一个32位bit的内存,共同使用nGCS6。
连接方式如下:
head.S
@memory controller
.equ BWSCON ,0x48000000
.equ BANKCON0 ,0x48000004
.equ BANKCON1 ,0x48000008
.equ BANKCON2 ,0x4800000C
.equ BANKCON3 ,0x48000010
.equ BANKCON4 ,0x48000014
.equ BANKCON5 ,0x48000018
.equ BANKCON6 ,0x4800001C
.equ BANKCON7 ,0x48000020
.equ REFRESH ,0x48000024
.equ BANKSIZE ,0x48000028
.equ MRSRB6 ,0x4800002C
.equ MRSRB7 ,0x48000030
.text
.global _start
_start:
ldr r0, =0x53000000 @Close WATCHDOG
mov r1, #0x0
str r1, [r0]
ldr r0,=BWSCON @Init sdram
ldr r1,=0x22011110
str r1,[r0]
ldr r0,= BANKCON6
ldr r1,=0x00018005
str r1,[r0]
ldr r0,=REFRESH
ldr r1,=0x008c07a3
str r1,[r0]
ldr r0,=BANKSIZE
ldr r1,=0x000000b1
str r1,[r0]
ldr r0,=MRSRB6
ldr r1,=0x00000030
str r1,[r0]
mov r1,#0x400 @Relacate
ldr r2,=0x30000000
mov r3,#0x600
1:
ldr r4,[r1],#4
str r4,[r2],#4
cmp r1,r3
bne 1b
ldr sp, =1024*4 @Call C
ldr lr,=loop
@bl main
ldr pc,=0x30000038 @main @0x800
loop:
b loop
main.c
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
#define GPF7_out (1<<(7*2))
void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}
int main(void)
{
unsigned long i = 0;
GPFCON = GPF4_out|GPF5_out|GPF6_out; //Configure the gpio of led
while(1){
wait(30000);
GPFDAT = (~(i<<4)); //Turn
if(++i == 8)
i = 0;
}
return 0;
}
man.lds
SECTIONS {
. = 0x0;
first 0x00000000 : { head.o }
second 0x30000000 : AT(0x400){ main.o }
}
Makefile
objs = head.o main.o
all: $(objs)
#arm-linux-ld -T main.lds $^ libgcc.a -o main.elf
arm-linux-ld -T main.lds $^ -o main.elf
arm-linux-objcopy -O binary -S main.elf main.bin
arm-linux-objdump -D main.elf > main.dis
clean:
rm -f *.bin $(objs) *.elf *.dis
%.o : %.c
arm-linux-gcc -march=armv4 -c -o $@ $<
%.o : %.S
arm-linux-gcc -march=armv4 -c -o $@ $<
下一篇:2440裸板程序之代码重定位
史海拾趣
|
关于__irq 的使用 __irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq; 但是其意义一 ...… 查看全部问答> |
|
请教一下我手头有个电路板上有个IC,5脚封装,上面两脚下面三脚,特小的封装,上面的字符貌似是CO-60Y又或者是CO-GOY,字太小看不清楚,搜索这两个都找不到相关资料。通过测量得知它的功能大概是这样:电源从3脚输入1脚输出,1脚跟5脚是通路,4脚输 ...… 查看全部问答> |
|
http://topic.eeworld.net/u/20071201/18/a2aaf09f-7fa2-419c-93c1-77b51f9713d8.html?seed=1107526537… 查看全部问答> |
|
iar环境下,uCosII在stm32下的运行机理是怎样的? 编译器的iar EWARM,uCosII 通过初始化下面的向量表,在程序复位时将程序定位到__program_start(void)函数,但该函数是个空函数呀,程序到底是怎么进行到正常状态的呢?请大虾们指点。另外,向量表__vector_table[] 的第一行{ ...… 查看全部问答> |
|
活不多的时候闲着看个书怎么就不对了? 而且我看的还是《编程匠艺》《uCos 操作系统》…… 怎么这就惹领导不高兴了?虽然工作上分配给我的是硬件,但看个代码就不对了? 就叫软件不软硬件不硬了??? 什么制度,做事就是给领导看,什么领导看到你 ...… 查看全部问答> |
|
EEWORLD大学堂----WEBENCH FPGA Architect功能导览 WEBENCH FPGA Architect功能导览:https://training.eeworld.com.cn/course/165… 查看全部问答> |





