标签:
第零步:设置OM PIN引脚,就可以选择启动方式了,譬如从SD卡启动,emmc启动,norflash启动等等,我们这里假设从SD卡启动。
第一步:IROM内的代码(BL0)对SOC进行初步的初始化工作
第二步:从SD卡中复制BL1到SOC内的SRAM,执行BL1内的代码
第三步:从SD卡中复制BL2到SOC内的SRAM,执行BL2内的代码(作用:初始化SDRAM控制器,那样我们就可以用DDR内存了)
第四步:把我们的操作系统OS复制到SDRAM中
第五步:我们在BL2中进行一个长跳转,跳转到SDRAM中去执行程序,这样我们整个启动过程就完成了。
从图上我们可以看到,只要我们的OM[0-5]设置为:100000或000000(1代表的就是供电,0代表接地)的时候,我们就选择了essd介质的启动方式
当我们OM[0-5]设置为:001100或者101100的时候,我们选择的就是SD/MMC的模式。这就看你需要什么启动方式了。
我的开发板(九鼎X210)支持SD卡启动和USB启动:
SD卡启动:001100或者101100
USB启动:1XXXX1(x表示没有)
所以,我们在切换的时候,只需要在SD卡的基础上进行改动(因为OM[1-4]位为什么并不影响USB启动的),拨动引脚OM5就可以了,OM为1就是USB启动,OM为0就是SD卡启动。
第一步:关看门狗
第二步:初始化iCache
第三步:初始化栈区域
第四步:初始化堆区域
第五步:初始化块设备拷贝功能
第六步:初始化PLL并设置系统时钟
第七步:检查OM PIN引脚,看看从哪种介质(如SD/MMC)中复制BL1到SRAM,这里就和第零步的工作相照应了,选择了启动方式了
第八步:检查BL1中的checksum,如果checksum失败,就尝试以第二种启动方式启动(SD/MMC 通道2)
第九步:检查是不是安全模式启动(这步比较少应用)
第十步:跳到BL1的起始地址去执行程序
从上图我们可以看到,我们的启动凡事可以有6种,找到启动方式后,就从那介质中复制BL1到SDRAM中,然后执行BL1,,执行完BL1之后,查看它是不是唤醒状态,不是就载入BL2到SRAM中,然后就不是安全模式,就跳转到BL2执行,然后判断是不是唤醒状态,不是就开始初始化DRAM了,然后就把操作系统OS载入到DRAM中,之后就跳转到DRAM中去了,然后就是操作系统启动了。(这里就是后面步骤的示意图了)
从上图我们可以看到:第一种启动方式失败之后,就会跳转到第二种启动方式,然后检查checkSum(校验和),如果正常的话,就跳转到从第二种启动介质里面复制过来的BL1去执行,如果不正常,就跳转到了串口启动的方式去执行,串口成功的话,那就跳转到串口上传过来的BL1去执行,还是不行的话,就跳转到USB启动的方式去执行,可以就跳转到USB下载下来的BL1执行,还是不行的话就是启动失败了。
1.我们可以使用DNW工具,看看我们的USB是否接好(看到上面的USB:OK字样)
2.设置好具体的值:波特率是115200,你用的是哪个COM端口,就设哪个COM端口,具体的COM端口可以看右键我的电脑->管理->设备管理器->usbdnw处
3.下载具体的程序就好了
注意:因为我们的UART/USB启动模式都不需要头校验的,所以,我们的下载地址是:0xD0020000,像SD卡那些的,需要头校验和的,他们的下载地址就是:0xD0020010
看着这个图:我们就知道了我们的下载地址为什么是0xD0020000和0xD0020010了,因为SRAM的头地址就是这些。
Exception Vector Table:中断异常向量表
Heap:堆,申请堆的时候,在这里申请
Global Variable:全局变量放在这里
IRQ stack:中断模式下的栈
SVC stack:SVC模式下的栈,我们平时就是SVC模式下的,所以我们说的设置栈的时候,就是设置这里的栈
参考资料:朱老师物联网大教程
参考的IROM数据手册的翻译博客:http://blog.csdn.net/a627088424/article/details/9149671
标签:
原文地址:http://www.cnblogs.com/nibuyaoni/p/5723634.html