||
基于AT91RM9200的同为ARM 9开发板启动过程分析:
1、首先要明确:
(1)、同为板子的NOR映射在0x1000 0000,NAND映射在0x2000 0000地址处
同为的NOR是挂载在NCS0处,而NAND的控制引脚用的是普通GPIO(PC0作为片选)
(2)、NAND(K9F1208U0:64M 8位并行数据)和NOR(SST39VF6401B:8M 16位并行数据)都是属于非易失性存储器
(3)、附at91rm9200的内存映射局部图:
2、启动过程分析:
(1)、BMS=1时,启动过程分成2个阶段(Bootloader和Boot Uploader):
Bootloader阶段(可细分为boot和loader两个阶段):
板子从内部ROM(物理地址:0x10 0000)启动,此时内部128K的ROM映射为0x0000 0000和0x0010 0000两个地址,内部ROM的前32字节存放的是8个实现跳转的指令,并且在0x0000 0000和0x0010 0000均可访问到这些指令:
CPU复位后从0x0000 0000开始运行,首先会对一些硬件进行初始化(boot阶段):
-PLL初始化
PLLB初始化用于产生48MHZ的USB时钟
PMC中的一个寄存器确定主振荡器频率和PLLB正确参数
-堆栈初始化
为每种ARM模式设置相应的堆栈大小
-检测主振荡器频率
同为开发板是18.432MHZ
-设置中断控制器
-C变量初始化
-跳转到main函数
初始化完成后,然后会搜索片外非易失性存储器中的有效代码(有效代码的标准:在前32字节中除第六条指令外,其余向量必须是B跳转指令 或 LDR 装载指令,第六条指令用于存储一些信息,如载入代码的大小及 DataFlash 器件类型),其搜索的顺序如下:
由于NAND启动方式比较实用,下面假设parallel boot成功(boot成功),即NCS0挂载了8位并行NAND,分析进一步的启动流程(loader阶段):
如果从NAND引导成功(找到了有效代码),CPU会载入外部NAND中的一段代码到内部SRAM(16KB),载入代码的大小由NAND中前32Byte的向量六决定,然后恢复各外设的复位值、将PC指针设置为0x0000 0000、执行重映射(remap),完成这些后内部16K的SRAM从0x0020 0000(物理地址)被映射为0x0000 0000地址,内部128K的ROM被映射为0x0010 0000,然后CPU便跳转到0x0000 0000即内部SRAM中执行刚才复制进去的那段代码,这段代码可以是一段应用程序也可以是一个二级引导程序。如果是一段应用程序便可以直接在内部SRAM中运行,如果是一个二级引导,便可以对外设进行初始化,为运行大容量代码做硬件上的初始化,最终将代码拷贝到外部SDRAM中运行。
其实,最开始内部ROM中的引导可以看作是一个一级引导,且该段引导程序已经嵌入了几个可以被应用程序重复调用的函数,这样做是为了优化装载到SRAM中的代码的大小,另外要注意,这几个函数的调用只与PC指针有关不使用绝对地址,为访问这些函数,在内部ROM中固定地址定义了一个包含芯片说明与函数入口点的结构体。
实际上同为开发板的SPI挂的是M25PE20-AVMN6TP,TWI挂的是LM75温度传感器,NCS0挂的是NOR,本来如果9200的NCS0挂的是NAND的话,便可以从NAND启动,不知道是什么原因,同为的板子上NCS0挂的是NOR,而把NAND的控制引脚挂在了普通的GPIO上,如NAND的片选脚挂在了PC0引脚上,因此,如果SPI型存储器中M25PE20-AVMN6TP烧写了有效的代码的话,便可从这里启动,除此之外,TWI和parallel boot型的启动方案便均不可行。
附1-1:有效代码的判断标准
附1-2:关于第6个向量的示例说明
示例:
如果在前面没有找到有效的启动硬件,便会对串行通信器件初始化(DBGU与USB器件端口),然后Boot Uploader会执行DFU或Xmodem协议上传应用程序到SRAM的起始地址0x0020 0000处。引导程序为变量与堆栈在内部SRAM开辟一片存储区域。为防止上载错误,载入的应用程序至少要小于SRAM 3K。下载完成后,外设寄存器复位,中断禁用并重新映射。重新映射后,内部SRAM地址为0x0000 0000,内部ROM地址为0x0010_0000。然后将PC设置为0x0000 0000。另外,可以利用DFU协议对固化在内部ROM中的那段fireware进行升级。
(2)、BMS=0:
此时,开发板从外部NOR启动(针对同为ARM9开发板),NOR首地址被映射为0x0000 0000,接下来的启动过程和片内启动过程相似,但是此时启动代码要自己写(也就是每次在跑裸机时,都要加入的那个.S汇编代码以及一个对存储器进行初始化的.hfc文件),并且因为外面的NOR一般容量比较大,所以引导过程可以一步到位。