原创 AT91RM9200的启动过程

2011-5-19 13:52 2165 6 7 分类: MCU/ 嵌入式
AT91RM9200的启动过程


系统上电,检测BMS,选择系统的启动方式,如果BMS为高电平,则系统从片内ROM启动。AT91RM9200的ROM上电后被映射到了0x0和0x100000处,在这两个地址处都可以访问到ROM。由于9200的ROM中固化了一个BOOTLOAER程序。所以PC从0X0处开始执行这个BOOTLOAER(准确的说应该是一级BOOTLOADER)。这个BOOTLOER依次完成以下步骤:


1.              PLL SETUP


设置PLLB产生48M时钟频率提供给USB DEVICE。同时DEBUG USART也被初始化为48M的时钟频率。


2.              相应模式下的堆栈设置


3.              检测主时钟源(Main oscillator)


4.              中断控制器(AIC)的设置


5.              C 变量的初始化


6.              跳到主函数


完成以上步骤后,我们可以认为BOOT过程结束,接下来的就是LOADER的过程,或者也可以认为是装载二级BOOTLOER。9200按照DATAFLASH、EEPROM、连接在外部总线上的8位并行FLASH的顺序依次来找合法的BOOT程序。所谓合法的指的是在这些存储设备的开始地址处连续的存放的32个字节,也就是8条指令必须是跳转指令或者装载PC的指令,其实这样规定就是把这8条指令当作是异常向量表来处理。必须注意的是第6条指令要包含将要装载的映像的大小。关于如何计算和写这条指令可以参考用户手册。一旦合法的映像找到之后,则BOOT程序会把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超过16K-3K的大小。当BOOT程序完成了把合法的映像搬到SRAM的任务以后,接下来就进行存储器的REMAP,经过REMAP之后,SRAM从映设前的0X200000地址处被映设到了0X0地址并且程序从0X0处开始执行。而ROM这时只能在0X100000这个地址处看到了。至此9200就算完成了一种形式的启动过程。如果BOOT程序在以上所列的几种存储设备中找到合法的映像,则自动初始化DEBUG USART口和USB DEVICE口以准备从外部载入映像。对DEBUG口的初始化包括设置参数115200 8 N 1以及运行XMODEM协议。对USB DEVICE进行初始化以及运行DFU协议。现在用户可以从外部(假定为PC平台)载入你的映像了。在PC平台下,以WIN2000为例,你可以用超级终端来完成这个功能,但是还是要注意你的映像的大小不能超过13K。一旦正确从外部装载了映像,接下来的过程就是和前面一样重映设然后执行映像了。我们上面讲了BMS为高电平,9200选择从片内的ROM启动的一个过程。如果BMS为低电平,则9200会从片外的FLASH启动,这时片外的FLASH的起始地址就是0X0了,接下来的过程和片内启动的过程是一样的,只不过这时就需要自己写启动代码了,至于怎么写,大致的内容和ROM的BOOT差不多,不同的硬件设计可能有不一样的地方,但基本的都是一样的。由于片外FLASH可以设计的大,所以这里编写的BOOTLOADER可以一步到位,也就是说不用像片内启动可能需要BOOT好几级了,目前9200上使用较多的bootloer是u-boot,这是一个开放源代码的软件,用户可以自由下载并根据自己的应用配置。


总的说来,笔者以为9200的启动过程比较简单,ATMEL的服务也不错,不但提供了片内启动的功能,还提供了UBOOT可供下载。笔者写了一个BOOTLODER从片外的FLASHA启动,效果还可以。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

xucun915_925777961 2011-5-19 15:52

走过路过,来学习学习^_^
相关推荐阅读
cz81_503897891 2011-11-21 17:13
博客备份--查找
大家好:     各位朋友现在博客如何备份?如何指定关键词进行查找?     以前的版本可以,现在新版以来我一直找这个功能,找不到. 谢谢...
cz81_503897891 2011-11-01 11:20
查看Keil MDK-ARM各种数据类型占用的字节数
  笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的定义,但对于Keil MDK编译器的数据类型定义还是很模糊,主要就是区分不了short int、i...
cz81_503897891 2011-10-28 16:44
理解指针函数 区别:*(pfun(int, int))与 (*pfun)(int, int)
1.int *(pfun(int, int)):一个返回值为整型指针的函数 2.int (*pfun)(int, int):是一个指向返回值为int的函数的指针 3.#define  IAP_ENT...
cz81_503897891 2011-10-20 15:49
各种接口与管脚 232,VGA、USB、DVI、PS/2 RJ45网线、HDMI 的接口引脚定义
232,VGA、USB、DVI、PS/2 RJ45网线、HDMI 的接口引脚定义 学习 2010-06-07 20:20:15 阅读82 评论0 字号:大中小 经常看到网络上很多人要各种电脑接口引...
cz81_503897891 2011-10-20 11:50
ARM 中断编程入门 寄存器介绍及编写过程
最近一直在和ARM2200打交道,总结了下在ARM zlg模版中如和编写中断的方法(涉及了向量中断,非向量中断和外部中断的编写方法) 本人初学,以下为本人观点,若有错误,请与我联系交流 一.   ...
cz81_503897891 2011-10-18 17:17
LPC2478 向量中断控制器(VIC)
简介:         VIC是处于芯片外设和ARM内核之间的一个模块,对芯片所有外设中断进行管理,决定哪些中断源可以产生中断、产生哪种类型的中断以及中断后执行哪段服务程序。  ARM处理器内核具...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条