最近用LPC11U35的单片机做BootLoader升级,在通过IAPCopyRAMToFlash向Flash中写.bin文件时发现待写的地址区域总是0xFF,证明写失败。

        在IAP的库函数中,u32IAPCopyRAMToFlash函数有提供一个uint32_t 的返回值,其存储的就是IAP操作中的返回码,通过调试得到每次进行Copy操作时返回码都为4,库函数中定义返回码SRC_ADDR_NOT_MAPPED值为4,也就是说在写Flash时出现源地址没有存储器映射的错误。这里的源地址就是我自己定义的write_buffer[256]的地址。

        打开工程编译后的.map文件中,查看write_buffer数组的地址发现它被映射到0x2000 4000以上的存储区中了,LPC11U35的存储器映射中很清晰地指明了0x2000 4000 - 0x2000 4800区域是USB RAM区,查看Options选项配置如下图所示:

IAP升级过程中出现 SRC_ADDR_NOT_MAPPED 错误

 我在这里勾选了IRAM2区,也就是默认是可以使用IRAM2区的 ,但其实这是不推荐我们使用的,因为如果USB有数据存在这里就会起冲突。

正常情况下,如果存储空间足够,编译器编译时会自动分配变量到IRAM1的存储空间中,不需要用到IRAM2。由此可见,我的程序变量定义超过了IRAM1的空间大小。

事实也是如此,我在程序里定义了一个buffer[1984]的数组用来存放USB发送过来的bin文件,所以导致某些变量只能被映射到IRAM2中存储。而我猜测IAPCopyRAMToFlash这个函数读取的源地址应该只是在IRAM1这个范围,因此才会出现返回SRC_ADDR_NOT_MAPPED这个错误代码。

 

解决办法:

重新定义buffer的大小,分几次接收和存储USB传过来的数据即可

相关文章: