打印
[STM8]

关于STM8的IAP升级的问题

[复制链接]
13347|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a7208184|  楼主 | 2011-10-11 13:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
小弟现在正在做远程升级这块。遇到个很奇怪的问题。小弟的思路是MCU上电复位,先进入IAP程序,然后直接跳到APP应用程序。应用程序接收到外部升级的指令,此时跳转回IAP,进行升级。升级完成后,再跳回到APP进行运行。
      IAP跳到APP程序是可以的,但是APP再跳回到IAP程序,就跳转不过去。出现这种错误

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

     请香版和其他朋友,帮我提供个建议,多谢了

1.jpg (107.31 KB )

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官网上的例子,所以也想不到会出现这些奇怪的情况,能帮忙分析下吗。其他朋友也欢迎前来讨论。。

使用特权

评论回复
5
香水城| | 2011-10-11 16:56 | 只看该作者
从现象看,好像是Flash烧写的时间太长,造成SWIM连接超时。

你试试看直接运行,不要使用SWIM调试是否还有问题。

使用特权

评论回复
6
a7208184|  楼主 | 2011-10-11 17:38 | 只看该作者
不是的。香版,那个问题已经解决了。现在是我的APP程序执行跳转指令,跳不到IAP中,而是从APP的起始地址开始运行了。不知道是啥问题。我在IAP中注释掉一部分代码,就可以正常跳转。这个是栈溢出的问题吗??

使用特权

评论回复
7
香水城| | 2011-10-11 18:04 | 只看该作者
看起来,说来说去还是不能从APP跳回到IAP中。

我的问题是:你的现象是“执行了希望从APP跳回到IAP的指令,但程序又从APP的起始地址开始运行了”,是否这样?  如果是这样的,你需要确认是没有从APP跳回到IAP中,还是跳回到IAP后程序跑乱了?这样才能区别对待。

使用特权

评论回复
8
香水城| | 2011-10-11 18:08 | 只看该作者
看看这个帖子:https://bbs.21ic.com/icview-275187-1-1.html

他的问题是中断向量的设置问题,但一开始却错误地判断是软件复位。所以下结论时要十分小心,否则努力的方向就会有偏差。

使用特权

评论回复
9
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);
        }

可是我把这段代码注释掉的话,也是可以正常跳转的。所以我初步判断应该不是中断向量设置的问题。

使用特权

评论回复
10
a7208184|  楼主 | 2011-10-11 18:17 | 只看该作者
我很确定的,程序是没有跳入到IAP中,因为我在IAP的MAIN函数入口处设了断点,没有再进了。

使用特权

评论回复
11
a7208184|  楼主 | 2011-10-11 18:18 | 只看该作者
而且,香主,我试过一个大概只有5K左右的APP测试应用程序,是可以正常跳转的,所以综合分析,我才认为是内存上面的问题。

使用特权

评论回复
12
香水城| | 2011-10-11 18:21 | 只看该作者
怎么又跑出来中断向量设置的问题?这是从何说起呢?

使用特权

评论回复
13
a7208184|  楼主 | 2011-10-11 18:40 | 只看该作者
因为有用到中断重定向嘛。呵呵, 可能小弟的表述有嗲问题,不好意思。香主,你刚刚说的对,是我疏忽了,APP可以跑到IAP中的,不过升级完成后,再跳转回APP的时候,就会跑飞。

使用特权

评论回复
14
a7208184|  楼主 | 2011-10-12 09:27 | 只看该作者
香主,请问下,您有遇到过IAP升级完成后,却不能再跳转到APP了。必须要重新再次烧录APP程序,才能重新进入APP程序。我有把存入FLASH的升级程序的数据和.bin升级文件比较过,都OK的,表明升级文件已经存入FLASH了,但是就是不能正常启动APP了。之前做测试的时候,没有遇到这个问题的。

使用特权

评论回复
15
香水城| | 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时是一样的?

使用特权

评论回复
16
a7208184|  楼主 | 2011-10-12 16:18 | 只看该作者
呵呵,结贴了。终于搞定了。。还是自己在设计IAP代码的时候没有小心导致走了一些弯路。在这里要多谢香主大哥的帮助。这里小弟也总结下IAP设计的一些思路:
1、首先是地址跳转的问题,我用GoAddress =  *(TFunction*)(APPLICATION_ADDR);
        GoAddress();这两句话进行跳转,有的时候会出现在线调试错误,具体原因还没有找到。兄弟这次是绕过去了,用的一位热心网友提供的另外一条嵌汇编指令 _asm("jp $f000\n");
2、就是一定要检查升级的FLASH文件是否都接收正确,是否都正确写入了FLASH,不然会出现很多莫名其妙的错误;
3、还是FLASH的操作,特别是块的操作,一定要多看数据手册,按照手册上面的来;

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

在这里希望小弟的总结能够给大家一些建议或者思路。。

使用特权

评论回复
17
快乐之星| | 2011-10-15 00:09 | 只看该作者
进来学习的...

使用特权

评论回复
18
chrisnepher| | 2012-5-15 14:09 | 只看该作者
学习了。

使用特权

评论回复
19
car_software| | 2012-6-27 14:10 | 只看该作者
学习中...

使用特权

评论回复
20
weikezhi| | 2012-12-7 14:57 | 只看该作者
学习了

使用特权

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

本版积分规则

0

主题

76

帖子

1

粉丝