GPIO_LED.c //点亮开发板上的LED灯
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define WDCON (*(unsigned long*)0x53000000)
#define SDRAMCON 0x48000000
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*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; // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出
while(1){
wait(30000);
GPFDAT = (~(i<<4)); // 根据i的值,点亮LED1,2,4
if(++i == 8)
i = 0;
}
return 0;
}
void disable_watchdog()
{
WDCON = 0 ; //禁用watchdog
}
void sdram_setup()
{
unsigned long const sdramfig[] = {
0x22011110,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00018005,
0x00018005,
0x008c07a3,
0x000000b1,
0x00000030,
0x00000030,
};
int i = 0;
volatile unsigned long *p = (volatile unsigned long *) SDRAMCON;
for(;i<13;i++)
{
p
= sdramfig;
}
}
void nandcopy2sdram()
{
volatile unsigned long *p = (volatile unsigned long *) 0x0;
volatile unsigned long *q = (volatile unsigned long *) 0x30000000;
int i = 0;
for(;i<4096;i++)
q = p;
}
如果我将程序中的sdram_setup换成汇编语言的代码,就能正常运行。
汇编版本的sdram_set程序如下:
.equ mem_ctl_base 0x48000000
sdram_setup:
ldr r1, =mem_ctl_base @mov r1, #mem_ctl_base
adr r2, mem_cfg_val @adrl r2, mem_cfg_val
add r3, r1, #52
1:
ldr r4, [r2],#4
str r4, [r1],#4
cmp r1, r3
bne 1b
mov pc, lr
.align 4
mem_cfg_val:
.long 0x22011110 @BWCOM
.long 0x00000700 @BANKCON0
.long 0x00000700 @BANKCON1
.long 0x00000700 @BANKCON2
.long 0x00000700 @BANKCON3
.long 0x00000700 @BANKCON4
.long 0x00000700 @BANKCON5
.long 0x00018005 @BANKCON6
.long 0x00018005 @BANKCON7
.long 0x008c07a3 @BANKCON5
.long 0x000000b1 @BANKSIZE
.long 0x00000030 @MRSRB6
.long 0x00000030 @MRSRB6
实在不知道是哪里出的问题,请大侠不吝赐教!!![ 此帖被duhan666在2016-03-24 22:43重新编辑 ]