我的开发板为Tiny6610ADK(1312),内存为K4X2G32FD代码文件为:init_ddr.c led.lds Makefile show.c start.S sys_time.S。这些附件中有
ddr.tar.gz (3 K) 下载次数:0 我的想法是,从SD卡启动,启动后代码会被映射到0xc000000处,因此从0xc000000处拷贝代码,拷贝到0x50000000处,并转移到show处执行代码(点亮LED),但是没有成功,这是怎么回事?谁可以告诉我,希望知道的老师可以加我QQ与我讨论一下,我的QQ是2456642630
主要代码如下:start.S
.text
.globl _start
_start:
/*关MMU*/
ldr r0,=0x70000000
orr r0,r0,#0x13
mcr p15,0,r0,c15,c2,4
/*关看门狗*/
ldr r1,=0x7e004000
mov r0,#0x0
str r0,[r1]
/*初始化时钟*/
bl _sys_clock_init
/*设置堆栈*/
ldr sp,=0xc004000
/*初始化内存*/
bl ddr_init
/*重定位*/
ldr r0,=0xc000000
ldr r1,=_start
cmp r0,r1
beq clean_bss
ldr r2,=bss_start
copy_loop:
ldr r3,[r0],#4
str r3,[r1],#4
cmp r1,r2
ble copy_loop
/*将bss清零*/
clean_bss:
ldr r1,=bss_start
ldr r2,=bss_end
mov r3,#0
cmp r1,r2
beq on_ddr
clean_loop:
str r3,[r1],#4
cmp r1,r2
ble clean_loop
on_ddr:
ldr pc,=show
halt:
b halt
init_ddr.c代码:
#define MEM1CONSTOP (*(volatile unsigned int *)0x7F0081B4)
#define MEM1CONSLP (*(volatile unsigned int *)0x7F0081C4)
#define SPCONSLP (*(volatile unsigned int *)0x7F008880)
#define P1MEMSTAT (*(volatile unsigned int *)0x7E001000)
#define P1MEMCCMD (*(volatile unsigned int *)0x7E001004)
#define P1DIRECTCMD (*(volatile unsigned int *)0x7E001008)
#define P1MEMCFG (*(volatile unsigned int *)0x7E00100C)
#define P1REFRESH (*(volatile unsigned int *)0x7E001010)
#define P1CASLAT (*(volatile unsigned int *)0x7E001014)
#define P1T_DQSS (*(volatile unsigned int *)0x7E001018)
#define P1T_MRD (*(volatile unsigned int *)0x7E00101C)
#define P1T_RAS (*(volatile unsigned int *)0x7E001020)
#define P1T_RC (*(volatile unsigned int *)0x7E001024)
#define P1T_RCD (*(volatile unsigned int *)0x7E001028)
#define P1T_RFC (*(volatile unsigned int *)0x7E00102C)
#define P1T_RP (*(volatile unsigned int *)0x7E001030)
#define P1T_RRD (*(volatile unsigned int *)0x7E001034)
#define P1T_WR (*(volatile unsigned int *)0x7E001038)
#define P1T_WTR (*(volatile unsigned int *)0x7E00103C)
#define P1T_XP (*(volatile unsigned int *)0x7E001040)
#define P1T_XSR (*(volatile unsigned int *)0x7E001044)
#define P1T_ESR (*(volatile unsigned int *)0x7E001048)
#define P1MEMCFG2 (*(volatile unsigned int *)0x7E00104C)
#define P1_chip_0_cfg (*(volatile unsigned int *)0x7E001200)
#define P1_chip_1_cfg (*(volatile unsigned int *)0x7E001204)
/*#define nsToMT(ns) (ns*0.2+1)*/
#define nsToMT(ns) (((200000000 / 1000 * ns) - 1) / 1000000 + 1)
/*ns*10^-9=T/200*10^6<==>T=ns*0.2*/
//#define nsToAT(ns) (ns*0.8+1)/*ns*10^-9=T/800*10^6<==>ns*0.8*/
/*ACLK=800MHZ HCLK=200MHZ*/
/*参数参考
http://hard.zol.com.cn/2004/0330/90618.shtml*/
void ddr_init()
{
int A_time;
int M_time;
P1MEMCCMD=0x4;/*使得存储器进入配置状态*/
/*配置时间参数*/
P1REFRESH=nsToMT(7800);/*刷新周期为7.8us*/
P1CASLAT=(3<<1);/*列地址选通延迟为2or3tCK*/
P1T_DQSS=1;/*数据选通延迟为0.75tCK~1.25tCK*/
P1T_MRD=0x2;/*读写转换时间2tCK*/
P1T_RAS=nsToMT(40);/*行活动时间40ns*/
P1T_RC=nsToMT(55);/*行地址循环时间*/
M_time=nsToMT(15);
A_time=M_time-3;
P1T_RCD=(A_time<<3)|M_time;/*从行有效到读写命令的发出之间的间隔*/
M_time=nsToMT(120);
A_time=(M_time-3);
P1T_RFC=(A_time<<5)|M_time;/*自动刷新周期*/
M_time=nsToMT(15);
A_time=(M_time-3);
P1T_RP=(A_time<<3)|M_time;/*设置行延迟时间*/
P1T_RRD=nsToMT(10);/*设置库之间跳转时间*/
P1T_WR=nsToMT(12);/*设置写延迟时间*/
P1T_WTR=2;/*从写转到读所要的时间,这里只找不到参数,只能用默认值*/
P1T_XP=2;/*Power down exit time*/
P1T_XSR=nsToMT(120);/* 退出时自我刷新时间*/
P1T_ESR=nsToMT(120);/*退出时刷新命令时间*/
/*存储器芯片配置*/
P1MEMCFG=((1<<30) | (2<<15) | (3<<3) | (2<<0));/*=0x801A;0000 1000 0000 0001 1010*/
P1MEMCFG2=0xb41;/*1011 0100 0001*/
P1_chip_0_cfg=0x150f0;/*设置为行,页,列结构*/
/*MEM1CONSTOP|=(1<<18);
MEM1CONSLP&=~((1<<0)|(1<<25));
SPCONSLP|=(1<<4);*/
/*存储器初始化序列*/
P1DIRECTCMD=0xC0000;/*NOP*/
P1DIRECTCMD=0x00000;/*Prechargeall*/
P1DIRECTCMD=0x40000;/*自动刷新*/
P1DIRECTCMD=0x40000;/*自动刷新*/
P1DIRECTCMD=0xA0000;/*EMSR 1010 0000 0000 0000 0000*/
P1DIRECTCMD=0x80032;/*MSR 1000 0000 0000 0011 0001*/
P1_chip_1_cfg=0x154FC;
P1DIRECTCMD=0x1C0000;/*NOP*/
P1DIRECTCMD=0x100000;/*Prechargeall*/
P1DIRECTCMD=0x140000;/*自动刷新*/
P1DIRECTCMD=0x140000;/*自动刷新*/
P1DIRECTCMD=0x1A0000;/*EMSR 1010 0000 0000 0000 0000*/
P1DIRECTCMD=0x180032;/*MSR 1000 0000 0000 0011 0001*/
/*准备好*/
P1MEMCCMD=0x00;
while((P1MEMSTAT&0x3)!=1);
}