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