主题 : 我的内存初始化为什么不成功? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 104644
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
综合积分: 16 分
注册时间: 2014-05-30
最后登录: 2015-01-11
楼主  发表于: 2014-06-08 19:41

 我的内存初始化为什么不成功?

我的开发板为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);
}
附件: ddr.tar.gz (3 K) 下载次数:0