[ZLG-ARM] 2214用IAP更新程序后,无法运行

[复制链接]
2980|2
 楼主| icebin2003 发表于 2009-2-24 19:45 | 显示全部楼层 |阅读模式
iap, RAM, TI, AD, IO
参考周立功的&lt&ltLPC2000_FLASH.pdf&gt&gt说明,&nbsp;用IAP更新整个程序后,&nbsp;无法运行,&nbsp;请教大家不知是否有其他设置和方法解决此问题?<br />我把整个过程说明一下:<br /><br />LR_IROM1&nbsp;0x00000000&nbsp;0x00040000&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;load&nbsp;region&nbsp;size_region<br />&nbsp;&nbsp;ER_IROM1&nbsp;0x00000000&nbsp;0x00040000&nbsp;&nbsp;{&nbsp;&nbsp;;&nbsp;load&nbsp;address&nbsp;=&nbsp;execution&nbsp;address<br />&nbsp;&nbsp;&nbsp;*.o&nbsp;(RESET,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;*(InRoot$$Sections)<br />&nbsp;&nbsp;&nbsp;.ANY&nbsp;(+RO)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;RW_IRAM1&nbsp;0x40000000&nbsp;0x00001E00&nbsp;&nbsp;{&nbsp;&nbsp;;&nbsp;RW&nbsp;data<br />&nbsp;&nbsp;&nbsp;.ANY&nbsp;(+RW&nbsp;+ZI)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;RW_IRAM2&nbsp;0x40002000&nbsp;0x00001F00&nbsp;&nbsp;{&nbsp;&nbsp;;&nbsp;RW&nbsp;data<br />&nbsp;&nbsp;&nbsp;systemtick.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;menu.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;critical.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;bsp.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;uart.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;iap.o&nbsp;(+RO&nbsp;+ZI)<br />&nbsp;&nbsp;}<br />}<br />IAP,&nbsp;UART,&nbsp;以及调用IAP的critical模块都放在了内部RAM中,&nbsp;并且0x40001E00到0x40001FFF这512字节空出来用于IAP的写入缓存,0x40003F00到0x40003FFF这256字节RAM也没有使用,&nbsp;留给IAP用.<br />使用&nbsp;超级终端&nbsp;的xmodem协议把程序二进制bin文件下载到外部SRAM&nbsp;0x80000000&nbsp;处,&nbsp;关闭了中断,&nbsp;再把外部SRAM中的数据反复导入内部512字节的IAP写入缓存完成写入操作.<br />我用ulink2在keil中调试,&nbsp;观察写入flash后的程序并没有错误,&nbsp;重启后就是无法运行,&nbsp;奇怪奇怪!
 楼主| icebin2003 发表于 2009-2-24 19:50 | 显示全部楼层

部分程序:

部分程序:<br />/******************************************************************/<br />/*&nbsp;H&nbsp;*/<br />#ifndef&nbsp;_IAP_H<br />#define&nbsp;_IAP_H<br /><br />/*&nbsp;定义IAP命令字&nbsp;*/<br />#define&nbsp;IAP_SELSECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50<br />#define&nbsp;IAP_RAMTOFLASH&nbsp;&nbsp;&nbsp;&nbsp;51<br />#define&nbsp;IAP_ERASESECTOR&nbsp;&nbsp;&nbsp;52<br />#define&nbsp;IAP_BLANKCHK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53<br />#define&nbsp;IAP_READPARTID&nbsp;&nbsp;&nbsp;&nbsp;54<br />#define&nbsp;IAP_BOOTCODEID&nbsp;&nbsp;&nbsp;&nbsp;55<br />#define&nbsp;IAP_COMPARE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56<br /><br />/*&nbsp;定义IAP返回状态字&nbsp;*/<br />#define&nbsp;CMD_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;INVALID_COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;SRC_ADDR_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br />#define&nbsp;DST_ADDR_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br />#define&nbsp;SRC_ADDR_NOT_MAPPED&nbsp;&nbsp;&nbsp;4<br />#define&nbsp;DST_ADDR_NOT_MAPPED&nbsp;&nbsp;&nbsp;5<br />#define&nbsp;COUNT_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6<br />#define&nbsp;INVALID_SECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7<br />#define&nbsp;SECTOR_NOT_BLANK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br />#define&nbsp;SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION&nbsp;9<br />#define&nbsp;COMPARE_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10<br />#define&nbsp;BUSY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11<br />#define&nbsp;PARAM_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;/*&nbsp;Insufficient&nbsp;number&nbsp;of&nbsp;parameters&nbsp;*/<br />#define&nbsp;ADDR_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13&nbsp;/*&nbsp;Address&nbsp;not&nbsp;on&nbsp;word&nbsp;boundary&nbsp;*/<br />#define&nbsp;ADDR_NOT_MAPPED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14<br />#define&nbsp;CMD_LOCKED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;/*&nbsp;Command&nbsp;is&nbsp;locked&nbsp;*/<br />#define&nbsp;INVALID_CODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;/*&nbsp;Unlock&nbsp;code&nbsp;is&nbsp;invalid&nbsp;*/<br />#define&nbsp;INVALID_BAUD_RATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17<br />#define&nbsp;INVALID_STOP_BIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18<br /><br />void&nbsp;SelSector(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2);<br />void&nbsp;RamToFlash(unsigned&nbsp;int&nbsp;dst,&nbsp;unsigned&nbsp;int&nbsp;src,&nbsp;unsigned&nbsp;int&nbsp;no);<br />void&nbsp;EraseSector(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2);<br />void&nbsp;BlankCHK(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2);<br />void&nbsp;ReadParID(void);<br />void&nbsp;BootCodeID(void);<br />void&nbsp;Compare(unsigned&nbsp;int&nbsp;dst,&nbsp;unsigned&nbsp;int&nbsp;src,&nbsp;unsigned&nbsp;int&nbsp;no);<br /><br /><br />#endif<br /><br />/*******************************************************************/<br />/*&nbsp;C&nbsp;*/<br />#define&nbsp;iap_entry(a,&nbsp;b)&nbsp;((void&nbsp;(*)())(0x7ffffff1))(a,&nbsp;b)<br /><br />unsigned&nbsp;int&nbsp;paramin[8];&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;IAP入口参数缓冲区&nbsp;*/<br />unsigned&nbsp;int&nbsp;paramout[8];&nbsp;&nbsp;&nbsp;/*&nbsp;IAP出口参数缓冲区&nbsp;*/<br /><br />/****************************************************************************<br />*&nbsp;名称:SelSector()<br />*&nbsp;功能:IAP操作扇区选择,命令代码50。<br />*&nbsp;入口参数:sec1&nbsp;起始扇区<br />*&nbsp;sec2&nbsp;终止扇区<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;SelSector(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_SELSECTOR;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:RamToFlash()<br />*&nbsp;功能:复制RAM的数据到FLASH,命令代码51。<br />*&nbsp;入口参数:dst&nbsp;目标地址,即FLASH起始地址。以512字节为分界<br />*&nbsp;src&nbsp;源地址,即RAM地址。地址必须字对齐<br />*&nbsp;no&nbsp;复制字节个数,为512/1024/4096/8192<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;RamToFlash(unsigned&nbsp;int&nbsp;dst,&nbsp;unsigned&nbsp;int&nbsp;src,&nbsp;unsigned&nbsp;int&nbsp;no)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_RAMTOFLASH;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;dst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;src;<br />&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;no;<br />&nbsp;&nbsp;paramin[4]&nbsp;=&nbsp;44236;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当不使用PLL功能时,Fcclk=Fosc<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:EraseSector()<br />*&nbsp;功能:扇区擦除,命令代码52。<br />*&nbsp;入口参数:sec1&nbsp;起始扇区<br />*&nbsp;sec2&nbsp;终止扇区<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;EraseSector(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_ERASESECTOR;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;44236;&nbsp;//&nbsp;当不使用PLL功能时,Fcclk=Fosc<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:BlankCHK()<br />*&nbsp;功能:扇区查空,命令代码53。<br />*&nbsp;入口参数:sec1&nbsp;起始扇区<br />*&nbsp;sec2&nbsp;终止扇区<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;BlankCHK(unsigned&nbsp;char&nbsp;sec1,&nbsp;unsigned&nbsp;char&nbsp;sec2)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_BLANKCHK;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:ReadParID()<br />*&nbsp;功能:扇区查空,命令代码53。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;ReadParID(void)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_READPARTID;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:BootCodeID()<br />*&nbsp;功能:读取boot代码版本号,命令代码55。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;BootCodeID(void)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_BOOTCODEID;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:Compare()<br />*&nbsp;功能:校验数据,命令代码56。<br />*&nbsp;入口参数:dst&nbsp;目标地址,即RAM/FLASH起始地址。地址必须字对齐<br />*&nbsp;src&nbsp;源地址,即FLASH/RAM地址。地址必须字对齐<br />*&nbsp;no&nbsp;复制字节个数,必须能被4整除<br />*&nbsp;出口参数:IAP返回值(paramout缓冲区)<br />****************************************************************************/<br />void&nbsp;Compare(unsigned&nbsp;int&nbsp;dst,&nbsp;unsigned&nbsp;int&nbsp;src,&nbsp;unsigned&nbsp;int&nbsp;no)<br />{<br />&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_COMPARE;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;dst;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;src;<br />&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;no;<br />&nbsp;&nbsp;iap_entry(paramin,&nbsp;paramout);&nbsp;//&nbsp;调用IAP服务程序<br />}<br />
ZLG_Dengz 发表于 2009-2-28 10:56 | 显示全部楼层

RE

1.&nbsp;使用IAP时请关闭中断<br />2.&nbsp;IAP是Thumb指令编写的,编译时需要注意.<br />3.&nbsp;检查被更新部分代码与其他代码的关联关系.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部