OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5874|回复: 12

stm8升级完跳转不成功!!!

[复制链接]

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
发表于 2018-9-19 11:42:34 | 显示全部楼层 |阅读模式
5金钱
STM8芯片。实现在线升级功能,写了BOOT和APP两套程序。
正常上电时,boot可以正常跳转到APP;
APP里需要升级时,也可以正常跳转到boot;
但是在boot里升级完程序后,执行重启函数:
       asm("LDW X,  SP ");
        asm("LD  A,  $FF");
        asm("LD  XL, A  ");
        asm("LDW SP, X  ");
        asm("JPF $E000");

仿真时也看到程序从boot跳转到APP了,但是APP此时却死掉了(表象是没有跑起来);
非要等到手动上电复位后,APP才能正常运行。

APP既然能正常运行,说明flash擦写应该没有问题,但不明白怎么在不断电的情况下APP咋就跑不起来呢??

而且这种情况通常出现在用小程序去更新原来的大程序的时候,要是两个程序量差不多,反而可以正常跳转。
小程序和大程序的区别是,大程序功能比较多,有硬件各种引脚的配置及操作,小程序只开了串口功能和flash处理功能。

现象太诡异了!请大神指导一下问题究竟出在哪里。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2018-9-19 13:38:04 | 显示全部楼层
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-19 15:22:27 | 显示全部楼层
本帖最后由 嘴角的上弦月 于 2018-9-19 16:05 编辑
ssssssssssss 发表于 2018-9-19 13:38
贴重要部分代码看看

boot初始化代码:
    disableInterrupts();//关总中断
        
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //配置内部高速振荡器(HSI)的分频器--1分频      
   
    Tim3_Init();//定时器3初始化 1ms  延时函数
    UART3_Configuration();
   
     //检查是否有从APP程序跳转过来的升级指令
    if(usetFlag == 0xAA)
    {
        MainToBld = 1;
        usetFlag = 0;

    }
    //检查APP程序是否有效
    else if(CheckMainApp())
    {
        MainToBld = 2;

        //跳转到app的程序        
        asm("LDW X,  SP ");
        asm("LD  A,  $FF");
        asm("LD  XL, A  ");
        asm("LDW SP, X  ");
        asm("JPF $E000");
    }
    while(1)
    {
//接收处理数据,存储flash
.........
        case 0x36:   //数据全部正确接收并存储         
                Write_Flag();//写APP程序有效标志位

                asm("LDW X,  SP ");
                asm("LD  A,  $FF");
                asm("LD  XL, A  ");
                asm("LDW SP, X  ");
                asm("JPF $8000"); //重启                 
            }
           break;
......
}
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-19 15:26:18 | 显示全部楼层
ssssssssssss 发表于 2018-9-19 13:38
贴重要部分代码看看

APP中的跳转代码:

            case 0x1D:
                usetFlag = 0xAA;
               
                asm("LDW X,  SP ");
                asm("LD  A,  $FF");
                asm("LD  XL, A  ");
                asm("LDW SP, X  ");
                asm("JPF $8000");
               
                break;

主要是有些程序可以正确执行所有操作,有些程序下载完APP就挂掉了,这点不明白到底是哪个地方没有考虑到。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-19 16:04:27 | 显示全部楼层
本帖最后由 嘴角的上弦月 于 2018-9-19 16:05 编辑
嘴角的上弦月 发表于 2018-9-19 15:22
boot初始化代码:
    disableInterrupts();//关总中断
        

上面的两个跳转地址写反了,往上面贴的时候贴错了。。笔误。。。已经修改过了
回复

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2018-9-19 16:44:23 | 显示全部楼层
丝毫没看到中断向量表配置的内容
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-19 16:45:59 | 显示全部楼层
ssssssssssss 发表于 2018-9-19 16:44
丝毫没看到中断向量表配置的内容

boot中没有用中断,有中断映射,是在网上找的代码:
__root const long reintvec[]@".intvec"=
{
  0x82008080,0x8200E004,0x8200E008,0x8200E00c, //除第一个0x82008080以外,其它数值要根据应用程序地址更改
  0x8200E010,0x8200E014,0x8200E018,0x8200E01c,
  0x8200E020,0x8200E024,0x8200E028,0x8200E02c,
  0x8200E030,0x8200E034,0x8200E038,0x8200E03c,
  0x8200E040,0x8200E044,0x8200E048,0x8200E04c,
  0x8200E050,0x8200E054,0x8200E058,0x8200E05c,
  0x8200E060,0x8200E064,0x8200E068,0x8200E06c,
  0x8200E070,0x8200E074,0x8200E078,0x8200E07c,
};
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-19 16:48:57 | 显示全部楼层
ssssssssssss 发表于 2018-9-19 16:44
丝毫没看到中断向量表配置的内容

能正常跑起来的APP,中断功能也是正常的。不能正常跑的APP,就不知道死到哪里去了
我更怀疑是不是我flash的存储丢掉了什么重要的信息,我查过,在写数据之前,APP区是都擦除了的。写数据是用标准块编程,把HEX文件里的有效数据挨个写进去的。然后就没有任何处理了。
回复

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2018-9-19 16:56:18 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-19 16:48
能正常跑起来的APP,中断功能也是正常的。不能正常跑的APP,就不知道死到哪里去了
我更怀疑是不是我fl ...

很难说什么问题,写的时候加校验然后读出来再校验,或者写的时候直接串口打印
回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2017-2-7
在线时间
176 小时
发表于 2018-11-6 09:26:07 | 显示全部楼层
你好 请问你的boot和app都开中断吗  还是说只能APP开中断 boot不能开
回复

使用道具 举报

8

主题

533

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2829
金钱
2829
注册时间
2016-5-13
在线时间
178 小时
发表于 2018-11-6 15:40:39 | 显示全部楼层
默默的发一个帖子给你。哈哈,自己去看我写的。
http://www.openedv.com/forum.php ... id=79611&extra=
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-12-28 10:23:59 | 显示全部楼层
石头1379 发表于 2018-11-6 09:26
你好 请问你的boot和app都开中断吗  还是说只能APP开中断 boot不能开

最近又转战STM32了,记得当时boot里面好像是没有用中断的,串口接收数据完全靠主循环查询。APP里有中断。
回复

使用道具 举报

2

主题

57

帖子

0

精华

高级会员

Rank: 4

积分
532
金钱
532
注册时间
2014-3-3
在线时间
51 小时
发表于 2019-9-16 16:18:01 | 显示全部楼层
我做过实验如果你的bootloader的中断向量表是在面函数前定义的,你在按复位按键的时候,还会从新进入bootloader,但是如果你将中断向量表用写入FLASH的模式写入到中断向量表的话,你按复位就一直停留在APP程序里面了,如果想要返回bootloader只能将之前的bootloader中断向量表放到8000开始就可以了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 12:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表