片内FLASH
LPC2000系列ARM的片内FLASH通过128位宽度的总线与ARM内核相连,具有很高的速度,加上后面要介绍的存储器加速功能,可以使程序直接在FLASH上运行,而不需要象其它公同的ARM微控制器一样把程序复制到RAM中运行
对处内FLASH的编程有三种方法来实现
(1)使用JTAG仿真/调试,通过芯片的JTAG接口下载程序
(2)使用在系统编程技术(ISP),通过UART0接口下载程序
(3)使用在应用编程技术(IAP)使用这种方式,可以实现用户程序运行时对FLASH进行擦除/编程,这样就为数据存储和现场固件的升级都带来极大的灵活性.
片内静态RAM
LPC2000系列ARM的片内RAM为静态的RAM,它可以用作代码和数据的存储.
片外存储器
CPU外部扩展连接的存储器芯片称为片外存储器.它们都具有数据线、地址线和控制线。(LPC2100系列不存在这种总线接口:所以只能通过I/O口的模拟总线时序来操作片外存储器,或者使用I2C、SPI等串行接口来连片外存储器)
LPC2200系列ARM微控制器具备符合ARM公司的外部存储器接口,通过它可以连接8位、16位或32位的片外存储器。最多可以扩展4个BAND 的存储器组,每存储器组寻址范围最大为16M。实际庆用中,使用16位总线宽度的存储器可以获得较好的性价比
片外存储器的读写
对于外扩的SRAM存储器只需要一条LDR(STR)指令就可以进行读写操作。
对于外扩的FLASH(NOR型),可以使用LDR指令读取数据,但是不能使用STR指令直接写数据,需要根据FLASH芯片写操作时序进行控制,实现FLASH的擦除编程。如果需要将程序代码烧写到FLASH芯片内,则需要在CPU内运行一个装载程序Loder程序.
存储器映射
给存储器分配地址的过程称为存储器映射。
存储器的重映射:有部分存储器单元可以出现在不同听地址上
注意:这个重映射不是将对映射单元内容的复制,而只是将多个地址指向了同一个存储单元,这个效果是通过芯片内部的"存储器管理部件"实现的.
引导块(Boot Block)及其得映射
BOOT BLOCK是芯片设计厂家在LPC2000系列ARM内部固定的一段代码,用户无法对其修改或删除.代码在芯片复位后首先运行.其功能为 判断运行哪个存储器上的程序\检查用户代码是否有效\判断芯片是否加密\芯片的在应用编程以及在系统编程.
BOOT BLOCK占用了片内FLASH的空间(除LPC2138的BOOT BLOCK不占用FLASH空间),其大小为8KB..但由于各个芯片内部FLASH的空间不同所以BOOT BLOCK的位置也有所不同.,而BOOT BLOCK中的有一些程序是可以被用户所调用的,为了增加用户代码的可移植性则将BOOT BLOCK 程序得映射在内部存储器的最高位置!即接近2G(0x80000000)的地方
注意:部分器件内部虽然没有用户FLASH空间,但是它们仍然存在BOOT BLOCK ,并且复位后首先运行.
***************************************************************************
LPC2000系列ARM芯片启动过程LPC2000处理器启动过程是:Memory Map--Remap--Boot--Remap四步。以LPC2292为例:片内Flash的最高8kB在芯片出厂前写入了Bootload程序和64字节的中断向量表,这是启动过程中重要的内容。
1.Memory Map(不受控制)LPC2292上电复位后,Flash和SRAM映射:SRAM占据0x40000000~0x40003FFF;Flash占据0x0~0x0003FFFF。此过程不受开发人员控制。 Memory Map是一个逻辑概念,是计算机系统在(上电)复位后才建立起来的。Memory Map相当于这样一个数学函数:函数的输入量是地址编码,输出量被寻址单元中的数据。当计算机系统掉电后或复位时,这个数学函数不复存在,只剩下计算机系统中实现这个数学函数的物理基础——电路连接。也可以这样认为:Memory Map是计算机系统(上电)复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
2.Remap(不受控制)Boot Block被整体Remap到了0x7fffe000~0x7fffffff。同时,0x0~0x3f的64字节中断向量区被暂时注销映射关系,由Boot Block中的中断向量代替。此过程不受开发人员控制。此时地址空间分配: 除去Remap暂时注销映射关系的64字节,Flash整体占用0x40~0x3ffff。 Boot Block占用0x7fffe000~0x7fffffff,Boot Block中断向量表占用0x0~0x3f。 事实上,Boot Block中断向量表占用了三段地址编码空间:0x0~0x3f,0x3e000~0x3e03f,0x7fffe000~0x7fffe03f。
3.Boot(不受控制)复位后Boot运作就是从0x0处起始字中取出跳转指令,开始程序的执行。由于Boot Block中断向量映射到0x0,CPU实际执行的是Boot Block内的程序。然后,程序首先检查看门狗溢出标志,置位表明系统内部软复位。再检查BOOT1和BOOT0是不是都为1,如果不是,则CPU从片外BANK0(0x80000000)执行用户代码,如果BOOT1和BOOT0是都为1,则CPU将对内部Flash中的中断向量表进行加和校验,检查用户代码是否有效,如果结果为0,Bootload程序将撤消Boot Block中断向量表在0x0~0x3f地址空间的映射,恢复Flash中断向量表在这64字节地址空间的映射,然后跳转到地址0x00处转入用户程序的执行。如果加和校验结果不为0,Bootload程序将进行UART0接口的波特率自动侦测,随时响应ISP宿主机的编程请求,执行ISP编程工作。若Bootload没有发现看门狗溢出标志置位,则表明当前系统是外部硬复位,CPU将采样P0.14引脚外部逻辑电平输入。如为0,Bootload执行UART0的自动波特率侦测,随时响应ISP宿主机的编程请求,执行ISP编程工作;如为1,Bootload的后续运作将与前面检测到看门狗溢出标志置位的程序执行完全相同。 这部分复位流程具体可参见《ARM嵌入式基础教程(上)》
4.Remap(可以控制)Remap的对象是片内SRAM存储器的异常向量部分。用户可编程决定何时Remap,Remap后是否再修改中断向量表等等。引发Remap运作指令与建立SRAM块中异常向量的所有功能代码全部驻留在Flash块的用户编程区中,是用户软件的一部分。另:此Remap对IAP操作有重要意义。 整个过程存储器变化如下:1.Memory Map(不受控制)芯片上电复位后,CPU给各个物理存储器块分配地址编码资源。这时不存在多个地址对应同一个物理内存的现象。2.Remap(不受控制)在执行了Memory Map 后,Boot Block整体被Remap到了0x7fffe000~0x7fffffff,也就是将地址空间0x7fffe000~0x7fffffff用来表示Boot Block同一段物理内存。同时,0x0~0x3f的64字节中断向量区被暂时注销映射关系(因为在判断用户代码存在于哪个存储空间之前,能存放异常向量表的存储空间有两个,一个在片内flash的0x00-0x3f,另个在片内flash的顶端即bootblock区,所以在同一时间,二者只能有一个起作用。),由Boot Block中的中断向量代替。这时Boot Block中断向量表占用了三段地址编码空间:0x0~0x3f,0x3e000~0x3e03f,0x7fffe000~0x7fffe03f,即这三段地址编码空间都指向bootblock中的中断向量表。3与4同上所述。
上一篇:对ARM7 LPC2210的Bootloader源码分析
下一篇:关于ARM汇编中字符串表达式及运算符总结
推荐阅读最新更新时间:2024-03-16 15:01