通过研究2440启动代码,发现这个启动代码压根就没有从nand
flash复制代码的功能,怪不得下载到nand flash 没现象呢!
用伪C代码来描述2440的正常的启动过程。
2440启动函数()
{
复位函数();
未定义模式函数() //这个是死循环
SWI函数(); //这个函数在其他文件中存在
PAbt_Addr函数();//又是个死循环函数
DAbt_Addr函数();//还是个死循环函数
......
}
复位函数()
{
if(关掉看门狗==1)
关掉看门狗;
Else
不关;
if(设置时钟==1)
设置好时钟;
Else
不设置时钟;
If(初始化储存控制器==1)
初始化内存控制器;
Else
不初始化储存控制器;
If(初始化I/O控制寄存器==1)
初始化I/O控制寄存器;
Else 不初始化I/O控制寄存器
If(异常中断向量复制到IRAM==1)
异常中断向量到IRAM; //IRAM为0x4000 0000;
Else 不复制;
配置相应模式堆栈的大小; //最后配置的是用户模式堆栈的大小,在用户模式下进入main函数
main(); //调用main函数,这就是为什么单片机裸奔的时候需要死循环了。
}
其实在2440中main函数中不用死循环,在执行main函数完毕之后,相当于复位函数()已经执行完毕,接下来执行的是未定义函数() ,由于刚才分析未定义函数是个死循环,相当于最坏的情况是,2440一直在未定义函数中停留着。当然并不希望看到这样的情况,所以2440裸奔时,最好在main函数中构成死循环!对于51单片机来说,没有死循环的话,这个51单片机程序会跑飞!!!
如果想从nand flash启动,并启动一个系统的话,需要在C函数之前加入初始化nandflash函数以及从nand flash代码复制到sdram的函数。如果再加一点其他的东西的话,一个小的bootloader就完成啦!
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』