ycz9999的笔记 https://bbs.21ic.com/?662808 [收藏] [复制] [RSS]

日志

基于AT91RM9200的ARM 9开发板启动过程分析【原创】

已有 1678 次阅读2011-10-26 05:36 |个人分类:AT91RM9200平台|系统分类:ARM

基于AT91RM9200的同为ARM 9开发板启动过程分析:


1、首先要明确:


(1)、同为板子的NOR映射在0x1000 0000NAND映射在0x2000 0000地址处


同为的NOR是挂载在NCS0处,而NAND的控制引脚用的是普通GPIOPC0作为片选)


(2)NANDK9F1208U064M 8位并行数据)和NORSST39VF6401B8M 16位并行数据)都是属于非易失性存储器


(3)、附at91rm9200的内存映射局部图:





2、启动过程分析:


 (1)BMS=1时,启动过程分成2个阶段(BootloaderBoot Uploader):


Bootloader阶段(可细分为bootloader两个阶段):


板子从内部ROM(物理地址:0x10 0000)启动,此时内部128KROM映射为0x0000 00000x0010 0000两个地址,内部ROM的前32字节存放的是8个实现跳转的指令,并且在0x0000 00000x0010 0000均可访问到这些指令:




CPU复位后从0x0000 0000开始运行,首先会对一些硬件进行初始化(boot阶段):


-PLL初始化


       PLLB初始化用于产生48MHZUSB时钟


       PMC中的一个寄存器确定主振荡器频率和PLLB正确参数


-堆栈初始化


       为每种ARM模式设置相应的堆栈大小


-检测主振荡器频率


       同为开发板是18.432MHZ


-设置中断控制器


-C变量初始化


-跳转到main函数


初始化完成后,然后会搜索片外非易失性存储器中的有效代码(有效代码的标准:在前32字节中除第六条指令外,其余向量必须是B跳转指令 或 LDR 装载指令,第六条指令用于存储一些信息,如载入代码的大小及 DataFlash 器件类型),其搜索的顺序如下:





由于NAND启动方式比较实用,下面假设parallel boot成功(boot成功),即NCS0挂载了8位并行NAND,分析进一步的启动流程(loader阶段):


如果从NAND引导成功(找到了有效代码),CPU会载入外部NAND中的一段代码到内部SRAM16KB),载入代码的大小由NAND中前32Byte的向量六决定,然后恢复各外设的复位值、将PC指针设置为0x0000 0000、执行重映射(remap),完成这些后内部16KSRAM0x0020 0000(物理地址)被映射为0x0000 0000地址,内部128KROM被映射为0x0010 0000,然后CPU便跳转到0x0000 0000即内部SRAM中执行刚才复制进去的那段代码,这段代码可以是一段应用程序也可以是一个二级引导程序。如果是一段应用程序便可以直接在内部SRAM中运行,如果是一个二级引导,便可以对外设进行初始化,为运行大容量代码做硬件上的初始化,最终将代码拷贝到外部SDRAM中运行。


其实,最开始内部ROM中的引导可以看作是一个一级引导,且该段引导程序已经嵌入了几个可以被应用程序重复调用的函数,这样做是为了优化装载到SRAM中的代码的大小,另外要注意,这几个函数的调用只与PC指针有关不使用绝对地址,为访问这些函数,在内部ROM中固定地址定义了一个包含芯片说明与函数入口点的结构体。


实际上同为开发板的SPI挂的是M25PE20-AVMN6TPTWI挂的是LM75温度传感器,NCS0挂的是NOR,本来如果9200NCS0挂的是NAND的话,便可以从NAND启动,不知道是什么原因,同为的板子上NCS0挂的是NOR,而把NAND的控制引脚挂在了普通的GPIO上,如NAND的片选脚挂在了PC0引脚上,因此,如果SPI型存储器中M25PE20-AVMN6TP烧写了有效的代码的话,便可从这里启动,除此之外,TWIparallel boot型的启动方案便均不可行。


1-1有效代码的判断标准




1-2:关于第6个向量的示例说明




示例:



 


 



 


Boot Uploader阶段:


如果在前面没有找到有效的启动硬件,便会对串行通信器件初始化(DBGUUSB器件端口),然后Boot Uploader会执行DFUXmodem协议上传应用程序到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一般容量比较大,所以引导过程可以一步到位。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)