|
情况:
单独点亮任何一个led都可以点亮, 但是用程序控制点亮就不可以,代码如下:
代码是 韦东山的《嵌入式linux应用开发手册》上的代码
我只是稍作修改 把点亮一个led 改成了流水灯
crt0.S中的代码
.text @是不是这里出的问题呢??
.global _start
_start:
ldr r0, =0x56000010 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
led.c里的代码
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
void delay()
{
int i,j;
for(i=0;i<2;i++);
}
int main()
{
GPBCON = 0x00015400; // 设置GPB5为输出口, 位[11:10]=0b01
GPBDAT |= (1<<5 | 1<<6 | 1<<7 | 1<<8); // GPB5输出0,LED1点亮
while(1)
{
GPBDAT &= ~(1<<5);
delay();
GPBDAT |= (1<<5);
delay();
GPBDAT &= ~(1<<6);
delay();
GPBDAT |= (1<<6);
delay();
GPBDAT &= ~(1<<7);
delay();
GPBDAT |= (1<<7);
delay();
GPBDAT &= ~(1<<8);
delay();
GPBDAT |= (1<<8);
delay();
}
return 0;
}
通过jlink将文件烧写到 Nor Flash中,上电后只有 GPBDAT &= ~(1<<5); 被点亮
经过测试发现程序运行到 delay(); 就停住了
所以我怀疑是不是 .text的问题,导致 i 这个变量不能被改动
我主要问题的问题是,怎么解决他呢?
|
|