主题 : MINI2440相关的裸机代码实验mmu,nand无法循环点亮LED 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 119431
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2015-10-03
最后登录: 2015-11-17
楼主  发表于: 2015-11-13 18:13

 MINI2440相关的裸机代码实验mmu,nand无法循环点亮LED


下面是LED的代码,不知道是哪里的问题,请教大神
#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(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0;
    
    GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;        // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出

    while(1){
        wait(30000);
        GPBDAT = (~(i<<5));         // 根据i的值,点亮LED1-4
        if(++i == 16)
            i = 0;
    }

    return 0;
}
级别: 新手上路
UID: 119431
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2015-10-03
最后登录: 2015-11-17
1楼  发表于: 2015-11-13 18:14
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将第二部分代码复制到SDRAM,设置页表,启动MMU,
@       然后跳到SDRAM继续执行
@*************************************************************************      

.text
.global _start
_start:
    ldr sp, =4096                       @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  pre_lowlevel_init               @ 关闭WATCHDOG,否则CPU会不断重启
    bl  mem_ctrl_asm_init               @ 设置存储控制器(MMU要用这个)
    bl  create_page_table               @ 设置页表
    bl  mmu_init                        @ 启动MMUbn
    ldr sp, =4096                       @ 重设栈指针,指向内部SRAM顶端(使用虚拟地址)
    bl  main
halt_loop:
    b   halt_loop

/*
* 关看门狗
*/
pre_lowlevel_init:
    /* turn off the watchdog */
    #define pWTCON    0x53000000

    ldr    r0, =pWTCON
    mov    r1, #0x0
    str    r1, [r0]

    mov    pc, lr
/*$:  end_of pre_lowlevel_init */

/*
* 存储器控制器初始化函数
*/
#define BWSCON    0x48000000

mem_ctrl_asm_init:
    adrl    r0, SMRDATA            @这13个值的起始存储地址 这里的adrl不能简单的用ldr替代
    ldr        r1, =BWSCON            /* Bus Width Status Controller  存储控制器的13个寄存器的开始地址 */
    add     r2, r0, #13*4
0:
    ldr     r3, [r0], #4        @ 读取设置值,并让r0加4
    str     r3, [r1], #4        @ 将此值写入寄存器,并让r1加4
    cmp     r2, r0                @ 判断是否设置完所有13个寄存器
    bne     0b                    @ 若没有写成,继续

    mov    pc, lr


    .ltorg
/* the literal pools origin */

SMRDATA:
    .word   0x22011110      @ BWSCON
    .word   0x00000700      @ BANKCON0
    .word   0x00000700      @ BANKCON1
    .word   0x00000700      @ BANKCON2
    .word   0x00000700      @ BANKCON3
    .word   0x00000700      @ BANKCON4
    .word   0x00000700      @ BANKCON5
    .word   0x00018005      @ BANKCON6
    .word   0x00018005      @ BANKCON7
    .word   0x008C07A3      @ REFRESH
    .word   0x000000B1      @ BANKSIZE
    .word   0x00000030      @ MRSRB6
    .word   0x00000030      @ MRSRB7
/* end_of mem_ctrl_asm_init*/