本部分有2个源文件,一个汇编文件,是工程的启动代码,另一个是C文件,是main函数部分。
;================================================
; crt.S
; 功能: 通过它转入C程序
;================================================
IMPORT main ; 声明C函数符号
CODE32
AREA Init, CODE, READONLY
ENTRY
ldr r0, =0x53000000 ; WATCHDOG寄存器
mov r1, #0x0
str r1, [r0] ; 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 ; 设置栈。注意:不能超过4K,因为是在SRAM上运行
; NAND FLASH中的代码,在复位后,硬件自动将其复制到内部SRAM
bl main ; 调用C函数
halt_loop
b halt_loop
END
//============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)
{
GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
while(1)
{
GPBDAT = 0x00000000; // 亮
wait(30000);
GPBDAT = 0xffffffff; // 灭
wait(30000);
}
return 0;
}
本代码用ADS编译完了后用超级终端+DNW烧入NAND FLASH,CPU复位后在内部内存SRAM上运行,因此在设置栈时要注意不要超过了4KB的大小。
在设置ADS的LINKER里面,RO应该设置为0x00000000. |