打印
[ZLG-ARM]

2214用IAP更新程序后,无法运行

[复制链接]
2239|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icebin2003|  楼主 | 2009-2-24 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iap, RAM, TI, AD, IO
参考周立功的<<LPC2000_FLASH.pdf>>说明, 用IAP更新整个程序后, 无法运行, 请教大家不知是否有其他设置和方法解决此问题?
我把整个过程说明一下:

LR_IROM1 0x00000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x00000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00001E00  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x40002000 0x00001F00  {  ; RW data
   systemtick.o (+RO +ZI)
   menu.o (+RO +ZI)
   critical.o (+RO +ZI)
   bsp.o (+RO +ZI)
   uart.o (+RO +ZI)
   iap.o (+RO +ZI)
  }
}
IAP, UART, 以及调用IAP的critical模块都放在了内部RAM中, 并且0x40001E00到0x40001FFF这512字节空出来用于IAP的写入缓存,0x40003F00到0x40003FFF这256字节RAM也没有使用, 留给IAP用.
使用 超级终端 的xmodem协议把程序二进制bin文件下载到外部SRAM 0x80000000 处, 关闭了中断, 再把外部SRAM中的数据反复导入内部512字节的IAP写入缓存完成写入操作.
我用ulink2在keil中调试, 观察写入flash后的程序并没有错误, 重启后就是无法运行, 奇怪奇怪!

相关帖子

沙发
icebin2003|  楼主 | 2009-2-24 19:50 | 只看该作者

部分程序:

部分程序:
/******************************************************************/
/* H */
#ifndef _IAP_H
#define _IAP_H

/* 定义IAP命令字 */
#define IAP_SELSECTOR     50
#define IAP_RAMTOFLASH    51
#define IAP_ERASESECTOR   52
#define IAP_BLANKCHK      53
#define IAP_READPARTID    54
#define IAP_BOOTCODEID    55
#define IAP_COMPARE       56

/* 定义IAP返回状态字 */
#define CMD_SUCCESS           0
#define INVALID_COMMAND       1
#define SRC_ADDR_ERROR        2
#define DST_ADDR_ERROR        3
#define SRC_ADDR_NOT_MAPPED   4
#define DST_ADDR_NOT_MAPPED   5
#define COUNT_ERROR           6
#define INVALID_SECTOR        7
#define SECTOR_NOT_BLANK      8
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9
#define COMPARE_ERROR         10
#define BUSY                  11
#define PARAM_ERROR           12 /* Insufficient number of parameters */
#define ADDR_ERROR            13 /* Address not on word boundary */
#define ADDR_NOT_MAPPED       14
#define CMD_LOCKED            15 /* Command is locked */
#define INVALID_CODE          16 /* Unlock code is invalid */
#define INVALID_BAUD_RATE     17
#define INVALID_STOP_BIT      18

void SelSector(unsigned char sec1, unsigned char sec2);
void RamToFlash(unsigned int dst, unsigned int src, unsigned int no);
void EraseSector(unsigned char sec1, unsigned char sec2);
void BlankCHK(unsigned char sec1, unsigned char sec2);
void ReadParID(void);
void BootCodeID(void);
void Compare(unsigned int dst, unsigned int src, unsigned int no);


#endif

/*******************************************************************/
/* C */
#define iap_entry(a, b) ((void (*)())(0x7ffffff1))(a, b)

unsigned int paramin[8];    /* IAP入口参数缓冲区 */
unsigned int paramout[8];   /* IAP出口参数缓冲区 */

/****************************************************************************
* 名称:SelSector()
* 功能:IAP操作扇区选择,命令代码50。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void SelSector(unsigned char sec1, unsigned char sec2)
{
  paramin[0] = IAP_SELSECTOR;   // 设置命令字
  paramin[1] = sec1;            // 设置参数
  paramin[2] = sec2;
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:RamToFlash()
* 功能:复制RAM的数据到FLASH,命令代码51。
* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
* src 源地址,即RAM地址。地址必须字对齐
* no 复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void RamToFlash(unsigned int dst, unsigned int src, unsigned int no)
{
  paramin[0] = IAP_RAMTOFLASH;  // 设置命令字
  paramin[1] = dst;             // 设置参数
  paramin[2] = src;
  paramin[3] = no;
  paramin[4] = 44236;       // 当不使用PLL功能时,Fcclk=Fosc
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:EraseSector()
* 功能:扇区擦除,命令代码52。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void EraseSector(unsigned char sec1, unsigned char sec2)
{
  paramin[0] = IAP_ERASESECTOR; // 设置命令字
  paramin[1] = sec1; // 设置参数
  paramin[2] = sec2;
  paramin[3] = 44236; // 当不使用PLL功能时,Fcclk=Fosc
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:BlankCHK()
* 功能:扇区查空,命令代码53。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void BlankCHK(unsigned char sec1, unsigned char sec2)
{
  paramin[0] = IAP_BLANKCHK; // 设置命令字
  paramin[1] = sec1; // 设置参数
  paramin[2] = sec2;
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:ReadParID()
* 功能:扇区查空,命令代码53。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void ReadParID(void)
{
  paramin[0] = IAP_READPARTID; // 设置命令字
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:BootCodeID()
* 功能:读取boot代码版本号,命令代码55。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void BootCodeID(void)
{
  paramin[0] = IAP_BOOTCODEID; // 设置命令字
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

/****************************************************************************
* 名称:Compare()
* 功能:校验数据,命令代码56。
* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐
* src 源地址,即FLASH/RAM地址。地址必须字对齐
* no 复制字节个数,必须能被4整除
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
void Compare(unsigned int dst, unsigned int src, unsigned int no)
{
  paramin[0] = IAP_COMPARE; // 设置命令字
  paramin[1] = dst; // 设置参数
  paramin[2] = src;
  paramin[3] = no;
  iap_entry(paramin, paramout); // 调用IAP服务程序
}

使用特权

评论回复
板凳
ZLG_Dengz| | 2009-2-28 10:56 | 只看该作者

RE

1. 使用IAP时请关闭中断
2. IAP是Thumb指令编写的,编译时需要注意.
3. 检查被更新部分代码与其他代码的关联关系.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝