[ZLG-ARM] 关于IAP

[复制链接]
 楼主| move 发表于 2007-1-3 11:33 | 显示全部楼层 |阅读模式
在ZLG的书上有一个LPC2131下的例子,是Thumb指令下的,为什么我放在一个用ARM指令的工程就不能了?<br />源程序如下<br />/****************************************Copyright&nbsp;(c)**************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Guangzou&nbsp;ZLG-MCU&nbsp;Development&nbsp;Co.,LTD.<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graduate&nbsp;school<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.zlgmcu.com<br />**<br />**--------------File&nbsp;Info-------------------------------------------------------------------------------<br />**&nbsp;File&nbsp;name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.c<br />**&nbsp;Last&nbsp;modified&nbsp;Date:&nbsp;&nbsp;2004-09-16<br />**&nbsp;Last&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0<br />**&nbsp;Descriptions:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;main()&nbsp;function&nbsp;example&nbsp;template<br />**<br />**------------------------------------------------------------------------------------------------------<br />**&nbsp;Created&nbsp;by:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chenmingji<br />**&nbsp;Created&nbsp;date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2004-09-16<br />**&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0<br />**&nbsp;Descriptions:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;original&nbsp;version<br />**<br />**------------------------------------------------------------------------------------------------------<br />**&nbsp;Modified&nbsp;by:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chenxibing<br />**&nbsp;Modified&nbsp;date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2005-02-16<br />**&nbsp;Version:<br />**&nbsp;Descriptions:<br />**<br />*******************************************************************************************************<br />*/<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br /><br />#define&nbsp;BEEP&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;7)<br /><br />#define&nbsp;IAP_ENTER_ADR&nbsp;&nbsp;&nbsp;0x7FFFFFF1&nbsp;&nbsp;//&nbsp;IAP入口地址定义<br /><br />/*&nbsp;定义IAP命令字&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_SELECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;//&nbsp;选择扇区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【起始扇区号、结束扇区号】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_RAMTOFLASH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;//&nbsp;拷贝数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【FLASH目标地址、RAM源地址、写入字节数、系统时钟频率】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_ERASESECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52&nbsp;&nbsp;//&nbsp;擦除扇区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【起始扇区号、结束扇区号、系统时钟频率】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_BLANKCHK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;53&nbsp;&nbsp;//&nbsp;查空扇区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【起始扇区号、结束扇区号】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_READPARTID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;54&nbsp;&nbsp;//&nbsp;读器件ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【无】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_BOOTCODEID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;55&nbsp;&nbsp;//&nbsp;读Boot版本号&nbsp;【无】<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP_COMPARE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56&nbsp;&nbsp;//&nbsp;比较命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【Flash起始地址、RAM起始地址、需要比较的字节数】<br /><br />/*&nbsp;定义IAP返回状态字&nbsp;*/<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INVALID_COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRC_ADDR_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DST_ADDR_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRC_ADDR_NOT_MAPPED&nbsp;&nbsp;4<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DST_ADDR_NOT_MAPPED&nbsp;&nbsp;5<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INVALID_SECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SECTOR_NOT_BLANK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION&nbsp;9<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMPARE_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BUSY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11<br /><br /><br />/*&nbsp;定义CCLK值大小,单位为KHz&nbsp;*/<br />#define&nbsp;&nbsp;IAP_FCCLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11059<br /><br />/*&nbsp;定义函数指针&nbsp;*/<br />void&nbsp;(*IAP_Entry)(uint32&nbsp;param_tab[],&nbsp;uint32&nbsp;result_tab[]);<br /><br />uint32&nbsp;&nbsp;paramin[8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IAP入口参数缓冲区<br />uint32&nbsp;&nbsp;paramout[8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IAP出口参数缓冲区<br /><br />/*<br />*********************************************************************************************************<br />**&nbsp;函数名称:SelSector()<br />**&nbsp;函数功能:IAP操作扇区选择,命令代码50。<br />**&nbsp;入口参数:sec1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;起始扇区<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;终止扇区<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;SelSector(uint8&nbsp;sec1,&nbsp;uint8&nbsp;sec2)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_SELECTOR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:RamToFlash()<br />**&nbsp;函数功能:复制RAM的数据到FLASH,命令代码51。<br />**&nbsp;入口参数:dst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目标地址,即FLASH起始地址。以512字节为分界<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源地址,即RAM地址。地址必须字对齐<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复制字节个数,为512/1024/4096/8192<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;RamToFlash(uint32&nbsp;dst,&nbsp;uint32&nbsp;src,&nbsp;uint32&nbsp;no)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_RAMTOFLASH;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;dst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;src;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;no;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[4]&nbsp;=&nbsp;IAP_FCCLK;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:EraseSector()<br />**&nbsp;函数功能:扇区擦除,命令代码52。<br />**&nbsp;入口参数:sec1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;起始扇区<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;终止扇区<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;EraseSector(uint8&nbsp;sec1,&nbsp;uint8&nbsp;sec2)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_ERASESECTOR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;IAP_FCCLK;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:BlankCHK()<br />**&nbsp;函数功能:扇区查空,命令代码53。<br />**&nbsp;入口参数:sec1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;起始扇区<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;终止扇区<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;BlankCHK(uint8&nbsp;sec1,&nbsp;uint8&nbsp;sec2)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_BLANKCHK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;sec1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;sec2;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:ReadParID()<br />**&nbsp;函数功能:扇区查空,命令代码53。<br />**&nbsp;入口参数:无<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;ReadParID(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_READPARTID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:BootCodeID()<br />**&nbsp;函数功能:读取boot代码版本号,命令代码55。<br />**&nbsp;入口参数:无<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;BootCodeID(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_BOOTCODEID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:Compare()<br />**&nbsp;函数功能:校验数据,命令代码56。<br />**&nbsp;入口参数:dst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目标地址,即RAM/FLASH起始地址。地址必须字对齐<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源地址,即FLASH/RAM地址。地址必须字对齐<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复制字节个数,必须能被4整除<br />**&nbsp;出口参数:IAP操作状态码<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAP返回值(paramout缓冲区)<br />*******************************************************************************************************<br />*/<br />uint32&nbsp;&nbsp;Compare(uint32&nbsp;dst,&nbsp;uint32&nbsp;src,&nbsp;uint32&nbsp;no)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[0]&nbsp;=&nbsp;IAP_COMPARE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置命令字<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[1]&nbsp;=&nbsp;dst;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[2]&nbsp;=&nbsp;src;<br />&nbsp;&nbsp;&nbsp;&nbsp;paramin[3]&nbsp;=&nbsp;no;<br />&nbsp;&nbsp;&nbsp;&nbsp;(*IAP_Entry)(paramin,&nbsp;paramout);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用IAP服务程序<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return(paramout[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回状态码<br />}<br /><br />/*<br />*******************************************************************************************************<br />**&nbsp;函数名称:main()<br />**&nbsp;函数功能:IAP函数调用,测试<br />*******************************************************************************************************<br />*/<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;管脚连接GPIO<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;=&nbsp;BEEP;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;BEEP;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IAP_Entry&nbsp;=&nbsp;(void(*)())IAP_ENTER_ADR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化函数指针IAP_Entry<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ReadParID();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读器件ID<br />&nbsp;&nbsp;&nbsp;&nbsp;BootCodeID();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读Boot版本号<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SelSector(1,1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;选择扇区1<br />&nbsp;&nbsp;&nbsp;&nbsp;EraseSector(1,1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;擦除扇区1<br />&nbsp;&nbsp;&nbsp;&nbsp;BlankCHK(1,1)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;查空扇区1<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SelSector(1,1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;选择扇区1<br />&nbsp;&nbsp;&nbsp;&nbsp;RamToFlash(0x00001000,&nbsp;0x40001000,&nbsp;256);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写数据到扇区1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;Compare(0x00001000,&nbsp;0x40001000,&nbsp;256);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;比较数据<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(err&nbsp;==&nbsp;CMD_SUCCESS)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;成功,蜂鸣一声&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;BEEP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt0x3FFFFF;&nbsp;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;BEEP;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;失败,一直蜂鸣&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;BEEP;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />}<br />
btiger2000 发表于 2007-1-3 12:40 | 显示全部楼层

设置如图。

 楼主| move 发表于 2007-1-3 13:12 | 显示全部楼层

还不成功,请求大侠

你的意思是IAP的子程序用16其它的还用ARM指令,是在原工程下这样设吗?<br />我试了一下,只要设置一个,别的都跟着变化。
btiger2000 发表于 2007-1-3 14:16 | 显示全部楼层

什么意思?不懂

只要设置一个,别的都跟着变化。<br />
 楼主| move 发表于 2007-1-3 14:45 | 显示全部楼层

我的意思是

按您说的对ATPC设置后,再到ARM&nbsp;Assembler中对我的一个子程序进行设置为Thumb指令,别的也跟着设置变化。<br />我再试下。<br />请您也再跟我多讲几步,只说一个地方我不明白。谢谢
btiger2000 发表于 2007-1-4 15:46 | 显示全部楼层

只需要设置C compiler即可!

另IAP占用堆栈的高32字节,所以要保证不被其它占用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

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