1.bootstrap
复位后,LPC3250从内部ROM开始执行。内置的16KB ROM中包含有一段启动程序,称为bootstrap,它将代码从UART5、SSP0(SPI模式)、EMC静态CS0存储器或者NAND FLASH中加载到内部RAM(IRAM)。
Bootstrap首先读取SERVICE_N(GPI_1)的状态(该引脚状态在V2.6仪表中可通过拨码开关控制)。如果SERVICE_N为低,则进行系统引导(service boot),即仪表中的下载模式;如果SERVICE_N为高,则进行正常引导(normal boot)。
如果系统引导(即UART5引导)成功,UART5处的代码就被加载到了IRAM中,对于V2.6仪表来说,即成功下载了bootloader,此时bootstrap会将IRAM映射到0x00000000处并开始从该地址执行。
即使系统引导不成功,最终也会跳转到正常引导过程。这也就是即使拨码开关拨到下载模式,V2.6仪表也能正常启动的原因。
正常引导过程首先检测连接到SSP0的可引导SPI存储器,如果成功则将代码拷贝到IRAM并跳转过去执行。如果SPI引导失败,则会检测EMC静态CS0存储器,如果静态存储器中有可用的启动代码,则跳转到0xE0000004开始执行。如果静态存储器处无可用启动代码,则检测NAND Flash,如果有启动代码,则被加载到IRAM并且开始执行。这里需要注意一点,从EMC静态CS0存储器引导的话,代码不会被加载到IRAM中去执行,而是从0xE0000004处执行。
2.UART5启动
Bootstrap首先检测UART5是否连接了串口Transceiver或者OTG兼容的Transceiver(USB Transceiver)。如果连接的是USB Transceiver,则完成初始化后自动将其连接到UART5。即无论连接的是哪种Transceiver,数据下载最终都是通过UART5完成的。
Bootstrap通过UART5发送boot_id(’5’(0x35)),外部设备需回复’A’(0x41)。如果收到’A’,UART5再次发送boot_id,外部设备需回复’U’(0x55)和’3’(0x33)。如果收到’U’和’3’,UART5发送’R’(0x52)。外部设备在收到’R’后,应发送代码要被加载的起始地址以及要被加载的代码的字节数。然后加载过程开始,代码加载完成后bootstrap会跳转到代码被加载的起始地址处执行。
以上过程在V2.6仪表应用中是借助WJYBUpdater软件实现的。从其源码中可以看到,设置的代码被加载的起始地址是0x08000000,代码大小为bootloader程序生成的bin文件的大小。查看LPC3250的内存映射图,可以看到0x08000000处是IRAM的空间,也就是说bootloader是被加载到IRAM中执行的。
3.Bootloader
Bootloader的主要功能是进行Norloader与仪表程序的下载,下载时使用WJYBUpdater软件通过UART5完成。
V2.6仪表硬件电路中,NOR FLASH使用的片选信号为EMC_CS0,由内存映射图可以看到EMC_CS0对应的地址空间的首地址为0xE0000000。Bootloader程序将从UART5收到的Norloader.bin中的数据放到0xE0000000处,将仪表程序bin文件的数据放到0xE0000000+0x10000+4处,从0xE0000000+0x10000开始的4个字节用于保存字节数。
4.Norloader
通过bootloader将Norloader与仪表程序下载完成后,就可以给仪表重新上电开始启动了。仪表刚上电时最先执行的仍然是bootstrap,由bootstrap的流程图可知,无论V2.6仪表的拨码开关拨到什么模式(1和2都为ON除外,此时由于仪表启用了外部看门狗而反复复位),最终都会跳转到EMC引导过程。
Bootstrap首先从0xE0000000处读取存储器数据宽度并检测,如果合法,则跳转到0xE0000004处执行。0xE0000000处的存储器数据宽度要符合一定格式,必须为0x13579BDm,其中m为0对应8位数据宽度,m为1对应16位数据宽度,m为2对应32位数据宽度。
V2.6仪表中采用的NOR FLASH使用16条数据线,所以对应的数据宽度应为0x13579BD1。在Norloader工程的startup.s中通过以下指令保证生成的bin文件的最开始4个字节为数据宽度。
SNorFlahMW_16 EQU 0x13579BD1 ;/* 外部存储器16位宽度有效字 */
…
Reset IF :DEF: OUT_CHIP
DCD SNorFlahMW_16
ENDIF
LDR PC, ResetAddr
…
OUT_CHIP可以在工程配置选项中进行定义。
从内存映射图中可以看到,SDRAM对应的地址空间的首地址为0x80000000,那么Norloader的工作就是将从0xE0000000+0x10000+4开始的N个字节搬移到0x80000000处,其中N的值由0xE0000000+0x10000处的4个字节指定。
在Norloader程序的最后,通过
AppEntry(); //跳转至SDRam中的地址
跳转到SDRAM中执行,即跳转到0x80000000处执行。
至此,仪表程序就跑起来了,在其startup.s中会将SDRAM的时钟配置成108MHz。
最后,总结一下各个程序的执行存储器类型,bootstrap在IROM中执行,bootloader在IRAM中执行,Norloader在NOR FLASH中执行,仪表程序在SDRAM中执行。
用户1602177 2013-10-22 09:51