通过研究2440启动代码,发现这个启动代码压根就没有从nandflash复制代码的功能,怪不得下载到nandflash没现象呢!用伪C代码来描述2440的正常的启动过程。
本文引用地址:
https://www.eepw.com.cn/article/201611/321602.htm
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为0x40000000;
Else不复制;
配置相应模式堆栈的大小;//最后配置的是用户模式堆栈的大小,在用户模式下进入main函数
main();//调用main函数,这就是为什么单片机裸奔的时候需要死循环了。
}
其实在2440中main函数中不用死循环,在执行main函数完毕之后,相当于复位函数()已经执行完毕,接下来执行的是未定义函数(),由于刚才分析未定义函数是个死循环,相当于最坏的情况是,2440一直在未定义函数中停留着。当然并不希望看到这样的情况,所以2440裸奔时,最好在main函数中构成死循环!对于51单片机来说,没有死循环的话,这个51单片机程序会跑飞!!!
如果想从nandflash启动,并启动一个系统的话,需要在C函数之前加入初始化nandflash函数以及从nandflash代码复制到sdram的函数。如果再加一点其他的东西的话,一个小的bootloader就完成啦!
评论