打印

IAP的2种方式分析51

[复制链接]
1991|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerkoh|  楼主 | 2009-12-22 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
A,简单一些
bootloader在代码最后空间 ,前3字节保留进入IAP区的跳转
bootloader前保留一块用户代码得开始跳转
就是有个漏洞  

地址0000 0001 0002 下保留跳转到IAP区指令
当下载的时候 先备份这条, 然后擦除一块,当刚刚好擦了
还没马上还原这最重要的指令
断电! 这时怎么办? 只能再烧bootloader吧?


B,比较复杂如下 依赖用户代码比较多

MCU:C8051F310

bootloader:0x0000-0x1000
        AP:0x1000-0x3dff
  reserved:0x3dff-0x3fff

1,建立bootloader.c
  加入startup.a51
  在startup.a51(默认) 里面第120行 加入如下 中断向量 函数地址映射
  如下:
   ORG 0000BH    /*定时器0*/
  LJMP 0100BH    /*跳转到用户代码区1000h以后*/
        ...               /*所有中断都如上写满*/
        ...
  在bootloader.c 中加入跳转到AP区的指令
  如下:
        ((void(code *)(void))0x1100)();  /*0x1100 为startup.a51的地址*/
                                         /*一般放在 中断映射后的地址*/

  编译:烧录从0x0000开始

2,建立AP.C 用户代码
  加入startup.a51  (可以不加)
  在keil->options->c51->interrupt vectors at address: 输入中断映射地址
  如下:
       interrupt vectors at address: 0x1000
  0x1000即AP的code区起始地址 也是中断矢量地址的映射基地址开始。
  在keil->options->BL51 Locate 设置如下
  定义 code Rang 0x1000-0x3dff
  CODE: 输入 ?C_C51STARTUP(1100H)        /*需要和bootloader中的跳转地址一致*/
                                         /*只需要定位好这个地址*/
                                         /*这样所有的中断函数都不需要再次定位*/
  编译:烧录的时候 从0x1000 开始烧 即第7块开始
  两个代码烧录完,复位就可以运行
  
3,bootloader区串口等下载 不能出现中断函数

相关帖子

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

本版积分规则

116

主题

1401

帖子

2

粉丝