[STM8] 关于STM8的IAP升级的问题

[复制链接]
 楼主| a7208184 发表于 2011-10-11 13:00 | 显示全部楼层 |阅读模式
小弟现在正在做远程升级这块。遇到个很奇怪的问题。小弟的思路是MCU上电复位,先进入IAP程序,然后直接跳到APP应用程序。应用程序接收到外部升级的指令,此时跳转回IAP,进行升级。升级完成后,再跳回到APP进行运行。
      IAP跳到APP程序是可以的,但是APP再跳回到IAP程序,就跳转不过去。出现这种错误

      而小弟把所有关于FLASH的操作去掉后,跳转就正常了。现在确定是FLASH的操作可能影响到了程序间的跳转,但是怎么也找不到。

     请香版和其他朋友,帮我提供个建议,多谢了
1.jpg
香水城 发表于 2011-10-11 13:33 | 显示全部楼层
1)出现什么错误?
2)关于FLASH的操作正确吗?
 楼主| a7208184 发表于 2011-10-11 13:51 | 显示全部楼层
FLASH的操作正确,验证过。现在这个模块仅仅就只有一个问题。就是APP应用程序不能正常跳入到IAP升级程序中。如果把IAP中的FLASH操作去掉,就可以。出现的错误是:error:swim prog error [42004]:memory write error.

我的MAIN函数如下:
void main()
{
        bool bResult = FALSE;
       
        disable_IRQ();//关闭总中断
        CLK_Init();//CLK的初始化
        BEEP_Init();
        UART_Init(UART_SERIAL_COM1, UART_BAUD_RATE_115200, UART_DATA_BIT8, UART_STOP_BIT1);//串口初始化
        FLASH_Init();//FLASH初始化
       
        bResult = UPGRADE_APP_IsUpgrade();
        if(bResult == FALSE)
        {//执行IAP
                BEEP_Func(50);//进入IAP升级,蜂鸣器叫
                //串口通讯,将升级文件写入FLASH中
                while(1)
                {
                        TREATY_Get();
                        TREATY_Execute();
                        TREATY_Analy();
                       
                        if(UPGRADE_APP_GetUpgradeFlag() == TRUE)
                        {//升级成功标志
                                UPGRADE_APP_SetUpgradeFlag(FALSE);
                                break;
                        }
                }
        }
        else
        {//执行APP
                UPGRADE_APP_SetUpgradeFlagCode(RUN_IAP_CODE);
        }
       
        //跳到APP地址
        GoAddress =  *(TFunction*)(APPLICATION_ADDR);
        GoAddress();
       
        while(1);
}
 楼主| a7208184 发表于 2011-10-11 15:42 | 显示全部楼层
香主,现在小弟有新的进展了。我用APP测试程序(小程序,测试用的),现在可以跳转到IAP程序中,整个升级都是OK的。但是我现在将APP程序替换为产品的程序(程序比较大,50K左右),就还是跳不回来,好像是在做软复位功能。代码又从APP的起始地址开始跑了,没有进IAP的程序段。我的程序跳转指令换了一个,程序跳转指令现在用的是_asm("jp $f000\n");

香主,因为小弟并没有用ST官网上的例子,所以也想不到会出现这些奇怪的情况,能帮忙分析下吗。其他朋友也欢迎前来讨论。。
香水城 发表于 2011-10-11 16:56 | 显示全部楼层
从现象看,好像是Flash烧写的时间太长,造成SWIM连接超时。

你试试看直接运行,不要使用SWIM调试是否还有问题。
 楼主| a7208184 发表于 2011-10-11 17:38 | 显示全部楼层
不是的。香版,那个问题已经解决了。现在是我的APP程序执行跳转指令,跳不到IAP中,而是从APP的起始地址开始运行了。不知道是啥问题。我在IAP中注释掉一部分代码,就可以正常跳转。这个是栈溢出的问题吗??
香水城 发表于 2011-10-11 18:04 | 显示全部楼层
看起来,说来说去还是不能从APP跳回到IAP中。

我的问题是:你的现象是“执行了希望从APP跳回到IAP的指令,但程序又从APP的起始地址开始运行了”,是否这样?  如果是这样的,你需要确认是没有从APP跳回到IAP中,还是跳回到IAP后程序跑乱了?这样才能区别对待。
香水城 发表于 2011-10-11 18:08 | 显示全部楼层
看看这个帖子:https://bbs.21ic.com/icview-275187-1-1.html

他的问题是中断向量的设置问题,但一开始却错误地判断是软件复位。所以下结论时要十分小心,否则努力的方向就会有偏差。
 楼主| a7208184 发表于 2011-10-11 18:15 | 显示全部楼层
bResult = UPGRADE_APP_IsUpgrade();
        if(bResult == FALSE)
        {//执行IAP
                BEEP_Func(50);//进入IAP升级,蜂鸣器叫
                //串口通讯,将升级文件写入FLASH中
                while(1)
                {
                        TREATY_Get();
                        TREATY_Execute();
                        TREATY_Analy();
                        
                        if(UPGRADE_APP_GetUpgradeFlag() == TRUE)
                        {//升级成功标志
                                UPGRADE_APP_SetUpgradeFlag(FALSE);
                                break;
                        }
                }
        }
        else
        {//执行APP
                UPGRADE_APP_SetUpgradeFlagCode(RUN_IAP_CODE);
        }

可是我把这段代码注释掉的话,也是可以正常跳转的。所以我初步判断应该不是中断向量设置的问题。
 楼主| a7208184 发表于 2011-10-11 18:17 | 显示全部楼层
我很确定的,程序是没有跳入到IAP中,因为我在IAP的MAIN函数入口处设了断点,没有再进了。
 楼主| a7208184 发表于 2011-10-11 18:18 | 显示全部楼层
而且,香主,我试过一个大概只有5K左右的APP测试应用程序,是可以正常跳转的,所以综合分析,我才认为是内存上面的问题。
香水城 发表于 2011-10-11 18:21 | 显示全部楼层
怎么又跑出来中断向量设置的问题?这是从何说起呢?
 楼主| a7208184 发表于 2011-10-11 18:40 | 显示全部楼层
因为有用到中断重定向嘛。呵呵, 可能小弟的表述有嗲问题,不好意思。香主,你刚刚说的对,是我疏忽了,APP可以跑到IAP中的,不过升级完成后,再跳转回APP的时候,就会跑飞。
 楼主| a7208184 发表于 2011-10-12 09:27 | 显示全部楼层
香主,请问下,您有遇到过IAP升级完成后,却不能再跳转到APP了。必须要重新再次烧录APP程序,才能重新进入APP程序。我有把存入FLASH的升级程序的数据和.bin升级文件比较过,都OK的,表明升级文件已经存入FLASH了,但是就是不能正常启动APP了。之前做测试的时候,没有遇到这个问题的。
香水城 发表于 2011-10-12 11:27 | 显示全部楼层
你在进入IAP之前,进行了下述操作:
CLK_Init();
BEEP_Init();
  UART_Init(UART_SERIAL_COM1, UART_BAUD_RATE_115200, UART_DATA_BIT8, UART_STOP_BIT1);
FLASH_Init();

请仔细检查:
1)在退出IAP进入APP之前,上述初始化后的状态是否有所变化?
2)还要检查其他部分,比如各个变量的内容、堆栈的状态、中断状态等,这些是否都与直接进入APP时是一样的?
 楼主| a7208184 发表于 2011-10-12 16:18 | 显示全部楼层
呵呵,结贴了。终于搞定了。。还是自己在设计IAP代码的时候没有小心导致走了一些弯路。在这里要多谢香主大哥的帮助。这里小弟也总结下IAP设计的一些思路:
1、首先是地址跳转的问题,我用GoAddress =  *(TFunction*)(APPLICATION_ADDR);
        GoAddress();这两句话进行跳转,有的时候会出现在线调试错误,具体原因还没有找到。兄弟这次是绕过去了,用的一位热心网友提供的另外一条嵌汇编指令 _asm("jp $f000\n");
2、就是一定要检查升级的FLASH文件是否都接收正确,是否都正确写入了FLASH,不然会出现很多莫名其妙的错误;
3、还是FLASH的操作,特别是块的操作,一定要多看数据手册,按照手册上面的来;

呵呵,每个人实现的具体思路可能不一致,但是最基本的思路应该都是一样的,参照ST官网上的一个例程思路。

在这里希望小弟的总结能够给大家一些建议或者思路。。
快乐之星 发表于 2011-10-15 00:09 | 显示全部楼层
进来学习的...
chrisnepher 发表于 2012-5-15 14:09 | 显示全部楼层
学习了。
car_software 发表于 2012-6-27 14:10 | 显示全部楼层
学习中...
weikezhi 发表于 2012-12-7 14:57 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

76

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部