先进行存储器的映射,然后通过 ADS(或 SDT)调试环境下载,显然,这个过程对
普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运
行程序,也只能采用这种方法。
如果能在用户设计的系统板上烧写一段 BootLoader程序,就可以将该过程屏蔽
起来,让用户通过一些简单的操作,就可完成程序的下载、调试等工作。在嵌入式
系统中,BootLoader的作用与 PC 机上的 BIOS 类似,通过 BootlLoader可以完成对
系统板上的主要部件如 CPU、SDRAM、Flash、串行口等进行初始化,也可以下载
文件到系统板、对 Flash 进行擦除与编程。事实上,一个功能完善的 BootLoader 已
经相当于一个微型的操作系统了。
BootLoader 作为系统复位或上电后首先运行的代码,一般应写入 Flash 存储器
中并从起始物理地址 0x0 开始。BootLoader 根据实现的功能不同,不相同。一个简单的 BootLoader程序可以仅仅完成串行口的初始化,并进行
通信,而功能完善的 BootLoader可以支持比较复杂的命令集,对系统的软硬件资源
进行合理的配置与管理。因此,用户可根据自身的需求实现相应的功能
使用DCD 定义这个标号
A:因为LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样
在LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异
常服务程序的地址,这样可以实现4GB 全范围跳转
如:在PROTEUS 中的芯片组:
芯片复位后,MAP=00,启动boot装载程序,boot装载程序检测P0.14口的状态和用户的异常向量表,判断是进入ISP还是启动用户程序,若启动用户程序,则自动设置MAP=1或3。若用户程序需要更改异常向量表,可以将异常向量表复制到片内0x40000000,然后设置MAP=2进行重新映射,0x40000000地址上的向量表就可以更改了。
LPC2220在复位运行的第一段程序并不是用户程序,而是boot block(引导模块),是设计厂家在ARM内部固化的一段代码,用户无法修改或删除,其主要功能为:
判断运行那个存储器上的程序。
检查用户代码是否有效。(主要检测异常向量表的机器码值之和是否为0)
判断芯片是否被加密。
芯片的在应用编程(IAP)和在系统编程(ISP)
boot block(包括bootload 和64字节异常向量表)。
对于LPC2220,复位后(也即是运行完Boot Block后),用户所能见到的存储空间,及其各存储空间上的内容。
0xF0000000----0xFFFFFFFF:AHB外设;
0xE0000000----0xEFFFFFFF:VPB外设;
0x80000000----0xDFFFFFFF;保留给外部存储器;
0x7FFFDFFF---0x7FFFE000;BOOT BLOCK;
0x40004000----0x4000FFFF;64KB片内RAM;
0x00000000—0x0000003f,ARM异常向量位置;
存储器映射控制
MAP=00:由任何硬件复位激活,boot block中断向量映射到存储器的底部以允许处理异常。
MAP=01:中断向量表没有被重新映射,它位于存储器的底部。
MAP=10:由用户程序激活,中断向量表重新映射到静态RAM的底部。
MAP=11:用户外部模式,由BOOT[1:0]来控制存储器的引导方式,中断向量表重新映射到外部存储器的底部。
例如:每当产生一个软件中断,ARM内核就从0x00000008处取出32位数据,当MAP=0x11时,这就意味着从0x00000008处取值既是对0x80000008处取值。
存储器重新映射控制用于改变从地址0x00000000开始的中断向量表的映射,使就使得运行在不同存储器空间中的代码对中断的控制。
bootblock 出厂时固化的Loader 主要实现ISP功能!
bootloader 自己写的程序
再到main()
上电后bootblock 检测是否有ISP的相关引脚被设定,如果设定进入ISP模式,如果没有设定 运行用户程序(一般来说时用户的BootLoader),然后启动内核或者其他的。
关于异常向量表,配置好你自己的就可以了,不用管 bootblock 上的!