打印

IAP下载出现问题

[复制链接]
3390|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sjnh|  楼主 | 2011-3-22 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* Test if user code is programmed starting from address "ApplicationAddress" */
    if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
    { /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) ApplicationAddress);
      Jump_To_Application();


下载完执行 出问题进入HardFault_Handler,出什么问题?
沙发
xuannin| | 2011-3-22 22:28 | 只看该作者
我也在这里郁闷了很久,这段代码本身没问题,你别在应用程序里往启动程序里跳,会在映射中断向量表时HardFault_Handler,我是没搞清怎么回事,也不敢再在论坛上发帖问,有人又会骂我JB歪怪马桶斜!

使用特权

评论回复
板凳
ST_ARM| | 2011-3-22 23:09 | 只看该作者
楼主的用户程序下载到Flash了吗?如果只是下载了IAP,没有用户代码可能会出错。

楼主要判断Flash里是否有代码。

使用特权

评论回复
地板
sjnh|  楼主 | 2011-3-23 08:09 | 只看该作者
本帖最后由 sjnh 于 2011-3-23 08:12 编辑

我开机启动下载程序,烧写完成后向应用程序跳转时出错,就像上面说的,
用户程序已经下载到FLASH中了,开始用JLINK下载的(也用下载程序下载过),并且都读出来与应用程序比较了前几十个字节内容都正确,并且应用程序用仿真运行正确,
代码执行到这:__set_MSP(*(__IO uint32_t*) ApplicationAddress);
仿真跟踪判断Flash里是否有代码 都正确

使用特权

评论回复
5
ST_ARM| | 2011-3-23 09:59 | 只看该作者
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
这个代码我测试个,很多用户都在用,应该没有问题,如果可以你把你的IAP项目放出来,我调试一下看看。

使用特权

评论回复
6
byeyear| | 2011-3-23 16:53 | 只看该作者
先把IAP当下去
再用IAP把用户程序当下去
然后回到IAP工程 启动调试
跟踪看下红色代码之后的执行流程
一般是堆栈或跳转地址有问题

使用特权

评论回复
7
xuannin| | 2011-3-23 19:22 | 只看该作者
看你4楼的说法,跟我的问题不同,可能是你在设置应用程序的起始地址或中断向量映射上有问题,我的IAP从启动程序跳转到应用程序是没有问题的,只在应用程序中收到升级命令时跳回启动程序时出现2楼的问题,最后只能在备份寄存器写个标记,重启芯片运行到升级程序升级的

使用特权

评论回复
8
xuannin| | 2011-3-23 19:42 | 只看该作者
本帖最后由 xuannin 于 2011-3-23 19:50 编辑

我在“建议和工具”贴子里的工具做IAP时能用的上的,可以把两个BIN文件合成一个BIN文件再转成ST工具支持的HEX文件,一次把两个程序下载到芯片里,另外,做IAP时千万别忘了:1.要能让用户在升级失败后能强制进入IAP升级程序;2.在启动程序通过算法生成一个密码,应用程序去校验这个密码,否则别人拿到你的升级程序,在写个简单的调转程序,你的活儿就白给别人干了

使用特权

评论回复
9
sjnh|  楼主 | 2011-3-23 20:10 | 只看该作者
:__set_MSP(*(__IO uint32_t*) ApplicationAddress); 这一句今天又可以执行了, 但应用程序不启动

应用程序在不重新映射中断向量时能正常运行, 设置了2个地方
1、NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
2、ICF文件
define symbol __ICFEDIT_intvec_start__ = 0x08008000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x08008000;

请问还有没有要改的地方?

使用特权

评论回复
10
xuannin| | 2011-3-23 21:07 | 只看该作者
ApplicationAddress怎么定义的?应用程序不从IAP升级程序跳转运行正常吗?

使用特权

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

本版积分规则

21

主题

1336

帖子

21

粉丝