C8051F120bootloader程序跳转的问题?

目前通讯,收发都正常,就是程序不跳转。
我说下我程序的思路,恳请指正,谢谢. 我boot地址区间0-0x1000 App地址区间 0x1000-0x1E000之间。
1、设置KEIL
因为App在后面所以,需要重新定义中断向量,设置Keil在C51 -> Interrupt vector at address 为0x1000,因为我的app是1000H开始存储的,中断偏移量+1000
2、更改STARTUP.A51启动文件加入 在第105行开始
ORG 00003H
LJMP 01003H
ORG 0000BH
LJMP 0100BH
ORG 00013H
LJMP 01013H
ORG 0001BH
LJMP 0101BH
ORG 00023H
LJMP 01023H
ORG 0002BH
LJMP 0102BH
ORG 00033H
LJMP 01033H
ORG 0003BH
LJMP 0103BH
ORG 00043H
LJMP 01043H
ORG 0004BH
LJMP 0104BH
ORG 00053H
LJMP 01053H
ORG 0005BH
LJMP 0105BH
ORG 00063H
LJMP 01063H
ORG 0006BH
LJMP 0106BH
ORG 00073H
LJMP 01073H
ORG 0007BH
LJMP 0107BH
ORG 00083H
LJMP 01083H
ORG 0008BH
LJMP 0108BH
ORG 00093H
LJMP 01093H
ORG 000A3H
LJMP 010A3H

3、设置BL51Loacate -> code Range 设置 0x1000-0x1E000,是让app程序存储在 0x1000-0x1E000
4、主程序处理如下


  #define boot       0x1000 
    //判断是否需要程序更新
  ms=40000;
    while(ms--)
    {
        if(serial_get_char() == 0x31)//上位机发31请求
        {
           serial_put_char(0x31);//回复表示可以
            Erase_Flash();//擦除
            AppFlashUpdata();//更新
            goto    boot_out;//跳转
        }
    }
 
     boot_out:
 ((void(code *)(void))boot)(); //跳转执行

程序目前就是下载后不执行,估计没跳转好,请问我是不是设置有问题,或者地址范围有问题,请给予指导。感谢

你的做法这个好像是参考我以前写过的那篇文章做的,不过我后来发现点问题,中断向量最好不要放在程序起始位置,而是靠后一点,比如放到2000H。
而且你好像还漏了一步,没有给用户程序的C_STARTUP定位
你上面说的主程序,应该是指bootloader吧?
没用过带code bank的C8051,还不知道在这个系列上面有没有问题,我在c8051f340和STC的IAP系列上用过可以。

不管你把C_STARTUP定位在哪里,单片机上电总是从0开始,这是硬件决定的。APP程序做这个定位是为了让bootloader跳转到用户程序的时候能有个确定的入口地址。
你的用法是有问题的,bootloader本身是必须放在0地址开始位置的,APP才需要被定位,你好像是把bootloader定位到app的位置了,这样肯定有问题。
bootloader和app是两个独立的工程,bootloader可以用编程器直接下载进去,但是app比较麻烦,因为它不是从0地址开始,用通用的编程软件可能导致bootloader被覆盖,要想办法用其它方式写进去。

我想起来一件事,带code bank的系统里的中断,不能简单地用个LJMP处理,还得先设置bank,否则就飞了。最好是把中断函数都定位在某个固定bank,然后在LJMP之前,先设置一下当前的bank,中断返回的时候也是个麻烦事。
一步一步来,先写个没有中断的程序测试一下看看,然后测试带中断,但是代码不要超过一个bank的。

其实我个人觉得代码超过64KB的话还是用M3吧,51的code bank用起来太麻烦了,毕竟硬件上不支持