|
楼主 |
发表于 2014-7-1 23:08:48
|
显示全部楼层
贴部分我刚写好的笔记,或许有用:
ASM9260T开发笔记 ASM9260T的启动流程:芯片上电复位后,最先运行的是位于0xFFFF0000地址开始的BootCode,它使用[0x40001000,0x40001FFF]范围的片内SRAM作为Data段和Stack。BootCode检测GPIO2_[5,6,7]三个管脚,决定从哪里(例如:SPI-Flash、IIC-EEPROM、Nand-Flash、Nor-Flash)加载sysloader到SRAM的[0x40000000,0x40000FFF]内存,然后跳转到sysloader的入口向量。所以设计的sysloader代码必须小于4KB,一旦sysloader运行起来,就可以使用[0x40001000,0x40001FFF]范围的内存作为sysloader的Data段和Stack,因为BootCode使命已经完成。sysloader负责初始化系统PLL,进而设定CPU时钟、HCLK时钟;然后初始化片内32MB的SDRAM,并从设定的永久存储器读取程序镜像到SDRAM,最后跳转到位于SDRAM中的程序入口向量地址执行。
通常,我们将sysloader存放在SPI-Flash的0x0000首部位置,将应用程序镜像放在SPI-Flash的0x10000偏移处;而应用程序的执行地址安排在SDRAM的0x20008000开始处。应用程序运行后,将64字节异常向量表拷贝到0x20000000处,并利用MMU将0x20000000开始的1MB空间映射到虚拟地址0x00000000。[0x20004000,0x20007FFF]的16KB内存,用于存放MMU地址转换表,16KB可存放整个一级页表。
由于sysloader仅有4KB的代码空间,很难实现复杂的功能;我们需要在sysloader和应用程序之间,再设计一个bootloader,用于实现复杂的以太网ISP,升级,加密,调试等功能。执行的顺序是:BootCode→sysloader→bootloader→application。地址安排如下表:
程序名称 | SPI-Flash加载地址 | 执行地址 | 备注 | BootCode
| ----------
| 0xFFFF0000
| Code小于16KB
| sysloader
| 0x00000000
| 0x40000000
| Code小于4KB
| bootloader
| 0x00010000
| 0x20008000
| Code小于64KB
| application
| 0x00020000
| 0x20020000
| 与SDRAM容量有关
| Sysloader运行过程中,始终在SVC模式执行;不开任何中断,禁用MMU,禁用Icache和Dcache。
Bootloader运行环境与application很接近。但必须在跳转到application之前,回到SVC模式,关闭所使用过的外围设备时钟源(除了DMA和SDRAM)及其中断;并冲刷Dcache,清除Icache;等等。总而言之,就是要让application似乎是被sysloader所加载的一样,就好像没有bootloader执行过一样。
|
|