lpc2136的iap

  费了很大劲做了lpc的iap方案,最后没有用上,共享点资料,只要结果不做分析。

 

方案一:boot(含iap)+app

BOOTAPP是分两个工程分别来编译的。APP里面需要将异常向量表(64个字节)REMAPRAM,这样就产生中断就可以从APP中取中断跳转地址了。

BOOT(iap)+app用这种方式的好处是:

1、  boot是被保护的,这样无论什么情况boot总是运行的,可以做些保护措施。

2、  flash分配可以知道,nxp的扇区大小差别很大,这样可以保证用小的扇区来做boot

坏处是:

1、  要对arm体系比较熟悉

2、  2个工程,维护不方便,有2个文件,发布前还要合并

 

坏处:

1、  在运行app的那几秒钟时间掉电或者复位了就完了。

2、  只能用后面的扇区做app,可能是32k,很浪费。

 

 

 

/******************************************************
* bootloader中检测试标志位决定启动哪个区域的代码
* 复制中断向量表并重新映射
*
*******************************************************/
typedef void (*func_t)(void);
func_t ptr;
void checkFlag(void)
{
   int i;
unsigned char *pc   =  (unsigned char *)0x0007d000;
unsigned int *pram   =  (unsigned int *)0x40000000;
unsigned int *webup  =   (unsigned int *)0x00003800;
unsigned int *uartaddr  =   (unsigned int *)0x00001000;

     if ((pc[0] == 0x02) &&
         (pc[1] == 0x02) &&
         (pc[2] == 0x09) &&
         (pc[3] == 0x20))
     {
          for(i=0;i<8;i++)
         {
              *(pram+i) = *(uartaddr+i);  //复制8*4字节的中断向量表
                                                      //到RAM:0x40000000
         }
         MEMMAP = 2;
         ptr = (func_t)uartaddr;      //跳转到uartaddr地址处运行这个区域的代码
        (*ptr)();
     
     }
    else if ((pc[0] == 0x01) &&
          (pc[1] == 0x01) &&
          (pc[2] == 0x09) &&
          (pc[3] == 0x20))
   {
        for(i=0;i<8;i++)
       {
             *(pram+i) = *(webup+i);
       }
       MEMMAP = 2;
       ptr = (func_t)0x00003800;
       (*ptr)();
   }


}

下面为第一个工程中的分散加载文件:
BOOT_LOAD 0x00000000 
{
BOOT 0x00000000
{       
        bootentry.o (BOOTS, +First) ;这部分为检测标志位,处理中断向量表复制
        boot.o(+RO)                       ;和重新映射并跳转的代码
}
}

OS_LOAD 0x00003800  
{
WEBUPGRADE_EXE 0x00003800 FIXED
{         ;这个工程的中断向量表,因为这个工程被放在0x3800处,所以它的中断向量         ;表放在这个区域的最开始处
        vectors.o (VECT, +First)
        init.o (INIT)
}
 
ROM2_EXE +0
{
   *(+RO)
  }

   RW_IRAM1 0x40000020 0x00007000
    {
 
  * (+RW,+ZI)

    }
ARM_LIB_HEAP  0x40007000 EMPTY  0x00000100   {}
    ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00   {}
}  


;---------------------------------------------------------
下面为第二个工程的分散加载文件:

OS_LOAD 0x00030000   ;放在地址0x30000处的第二个工程的代码
{
WEBUPGRADE_EXE 0x00030000 FIXED
{         ;中断向量表
         vectors.o (VECT, +First)
        init.o (INIT)
}

ROM2_EXE +0
{
   *(+RO)
   }

   RW_IRAM1 0x40000020 0x00007000
    {
        * (+RW,+ZI)

    }
    ARM_LIB_HEAP  0x40007000 EMPTY  0x00000100   {}
    ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00   {}
}

 

一些心得:

程序要有备份区,下载缓冲区,最好有外部dataflash。

程序小而且不改硬件的一个flash划分:(针对lpc2136)

1、2扇区8k做boot,6,7,8,9 72k做程序区,,3,4,10,11做下载缓冲,5,6,12,13做备份区,14多的可以当eeprom用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值