韦东山Linux嵌入式课程社区
直播中

李昕萌

7年用户 245经验值
私信 关注

SDRAM裸机用C初始化跳转失败

SDRAM裸机参考mmu那章的C初始化,编译成功后运行灯不亮,感觉head.S中ldr pc, =on_sdram没跳转成功,请问是什么原因,谢谢!
文件:head.S
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************      


.text
.global _start
_start:
    ldr sp, =4096                       @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup                        @ 设置存储控制器
    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中
    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:
    ldr sp, =0x34000000                 @ 设置堆栈
    bl  main
halt_loop:
    b   halt_loop


文件:init.c
/*
* init.c: 进行一些初始化,在Steppingstone中运行
* 它和head.S同属第一部分程序,此时MMU未开启,使用物理地址
*/

/* WATCHDOG寄存器 */
#define WTCON           (*(volatile unsigned long *)0x53000000)
/* 存储控制器的寄存器起始地址 */
#define MEM_CTL_BASE    0x48000000


/*
* 关闭WATCHDOG,否则CPU会不断重启
*/
void disable_watch_dog(void)
{
    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
}

/*
* 设置存储控制器以使用SDRAM
*/
void memsetup(void)
{
    /* SDRAM 13个寄存器的值 */
    unsigned long  const    mem_cfg_val[]={ 0x22011110,     //BWSCON
                                            0x00000700,     //BANKCON0
                                            0x00000700,     //BANKCON1
                                            0x00000700,     //BANKCON2
                                            0x00000700,     //BANKCON3  
                                            0x00000700,     //BANKCON4
                                            0x00000700,     //BANKCON5
                                            0x00018005,     //BANKCON6
                                            0x00018005,     //BANKCON7
                                            0x008C07A3,     //REFRESH
                                            0x000000B1,     //BANKSIZE
                                            0x00000030,     //MRSRB6
                                            0x00000030,     //MRSRB7
                                    };
    int     i = 0;
    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;
    for(; i < 13; i++)
        p = mem_cfg_val;
}

/*
* 将第二部分代码复制到SDRAM
*/
void copy_steppingstone_to_sdram(void)
{
    unsigned int *pdwSrc  = (unsigned int *)0;
    unsigned int *pdwDest = (unsigned int *)0x30000000;

    while (pdwSrc < (unsigned int *)4096) {
        *pdwDest = *pdwSrc;
        pdwDest++;
        pdwSrc++;
    }
}

文件:leds.c

#define    GPBCON        (*(volatile unsigned long *)0x56000010)
#define    GPBDAT        (*(volatile unsigned long *)0x56000014)

#define    GPB5_out    (1<<(5*2))
#define    GPB6_out    (1<<(6*2))
#define    GPB7_out    (1<<(7*2))
#define    GPB8_out    (1<<(8*2))

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

int main(void)
{
    unsigned long i = 0;
   
    GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;        // 灏哃ED1-4瀵瑰簲鐨凣PB5/6/7/8鍥涗釜寮曡剼璁句负杈撳嚭

    while(1){
        wait(30000);
        GPBDAT = (~(i<<5));         // 鏍规嵁i鐨勫

回帖(3)

崔业萍

2019-5-9 08:44:52
看 裸板调试 的视频,你可以学到调试方法
举报

马祥

2019-5-9 08:55:58
回复 2楼thisway.diy的帖子

感谢版主大大,确实是要按你说的实验才成功。不过还是不太理解为什么mmu那章就可以用数组,感觉两者是一样的。。。看来还是要继续努力学习,哈哈~~
举报

贾桂林

2019-5-9 09:07:19
回复 2楼thisway.diy的帖子

“因为这个数组的初始值是用链接地址去访问的”   怎么理解的?是任何数组都不能定义吗?是任何变量都是用链接地址去访问的吗?麻烦讲一下哪些可以定义哪些不能定义,。谢谢!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分