搜索
bottom↓
回复: 8

【IAP】LPC1788 IAP后读写、校验都正确后在跳转时跳不过去,...

[复制链接]

出0入0汤圆

发表于 2015-8-26 14:16:50 | 显示全部楼层 |阅读模式
我用IAR,lpc1788上做好了iap,在跳转到app时却一直跳不过去,跳完后还是在Bootloader中,且从Bootloader的开始处执行了,似乎把Bootloader程序复位了一样。

哪位遇到过这个问题呢?怎么解决?

谢谢

下面是我的跳转代码:

  1. void _Boot(uint32_t address)
  2. {
  3.   asm("ldr SP, [R0]");    //Load new stack pointer address
  4.   asm("ldr PC, [R0, #4]");//Load new program counter address
  5. }
  6. uint8_t ExceuteApplication(void)
  7. {
  8.   uint8_t tmp;

  9.   /* Disable all interrupts */
  10.   NVIC->ICER[0] = 0xFFFFFFFF;
  11.   NVIC->ICER[1] = 0x00000001;
  12.   /* Clear all pending interrupts */
  13.   NVIC->ICPR[0] = 0xFFFFFFFF;
  14.   NVIC->ICPR[1] = 0x00000001;

  15.   /* Clear all interrupt priority */
  16.   for (tmp = 0; tmp < 32; tmp++)
  17.   {
  18.     NVIC->IP[tmp] = 0x00;
  19.   }

  20.   SCB->ICSR = 0x0A000000;
  21.   SCB->VTOR = 0x00000000;
  22.   SCB->AIRCR = 0x05FA0000;
  23.   SCB->SCR = 0x00000000;
  24.   SCB->CCR = 0x00000000;

  25.   for (tmp = 0; tmp < 32; tmp++)
  26.   {
  27.     SCB->SHP[tmp] = 0x00;
  28.   }

  29.   SCB->SHCSR = 0x00000000;
  30.   SCB->CFSR = 0xFFFFFFFF;
  31.   SCB->HFSR = 0xFFFFFFFF;
  32.   SCB->DFSR = 0xFFFFFFFF;

  33.   //开始跳转
  34.   SCB->VTOR  = ApplicationAddress;
  35.   _Boot(ApplicationAddress);
  36. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2015-8-26 22:05:39 | 显示全部楼层
我来顶顶,不要沉下去啊

出0入0汤圆

 楼主| 发表于 2015-8-27 08:51:25 | 显示全部楼层


难道没有人遇到过这个问题??

出0入0汤圆

 楼主| 发表于 2015-8-27 16:58:52 | 显示全部楼层
原因已经找到啦:是IAR ARM编译器编译的bin有问题。即只要设置了中断向量偏移地址,不管是生成的hex还是bin文件都有问题,前面一段全是0,用jlink直接下载bin或hex,程序无法运行。但是用仿真的方式下载,不管是否有偏移,程序都运行良好。


这个现象有人遇到过吗?

下面的是有偏移和无偏移bin文件比较。有偏移的文件无法运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-8-27 17:03:58 | 显示全部楼层
附上我的icf文件:

我的iar 是6.4版本,用该版本编译stm32,设置或不设置偏移编译的bin,hex都没有问题,直接下载后就可以运行。

如此看软件是没有问题,很有可能是icf不对?

  1. /*###ICF### Section handled by ICF editor, don't touch! ****/
  2. /*-Editor annotation file-*/
  3. /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
  4. /*-Specials-*/
  5. define symbol __ICFEDIT_intvec_start__ = 0x00000000;
  6. /*-Memory Regions-*/
  7. define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
  8. define symbol __ICFEDIT_region_ROM_end__   = 0x0007FFFB;
  9. define symbol __ICFEDIT_region_RAM_start__ = 0x10000000;
  10. define symbol __ICFEDIT_region_RAM_end__   = 0x1000FFDF;
  11. /*-Sizes-*/
  12. define symbol __ICFEDIT_size_cstack__ = 0x2000;
  13. define symbol __ICFEDIT_size_heap__   = 0x500;
  14. /**** End of ICF editor section. ###ICF###*/

  15. define symbol __CRP_start__   = 0x000002FC;
  16. define symbol __CRP_end__     = 0x000002FF;

  17. define symbol __RAM1_start__  = 0x20000000;
  18. define symbol __RAM1_end__    = 0x20007FFF;

  19. define memory mem with size = 4G;
  20. define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__] -  mem:[from  __CRP_start__ to __CRP_end__];
  21. define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
  22. define region CRP_region   = mem:[from __CRP_start__ to __CRP_end__];
  23. define region RAM1_region  = mem:[from __RAM1_start__ to __RAM1_end__];

  24. define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
  25. define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

  26. initialize by copy { readwrite };
  27. do not initialize  { section .noinit };

  28. place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
  29. place in ROM_region   { readonly };
  30. place in RAM_region   { readwrite,
  31.                         block CSTACK, block HEAP };
  32. place in CRP_region          { section .crp };
  33. place in RAM1_region        { section .sram };
复制代码

出0入0汤圆

 楼主| 发表于 2015-8-28 09:09:31 | 显示全部楼层
没有新的发现,谁遇到过这个现象吗

出0入0汤圆

发表于 2015-9-7 10:06:56 | 显示全部楼层
本帖最后由 LeiR 于 2015-9-7 10:10 编辑

代码自己做Bootloader+Application两个工程:

1)、Bootloader:跳转到Application前,先关中断,再跳转;这样可以避免跳转前产生中断,而中断向量表还在使用Bootloader;
2)、Application:主要有二个工作:1、设置VTOR(可以设置在RAM中,也可以设置flash,这里假定在FLASH中);2、在分散加载文件中,设置Flash的起始地址。注意:这两个flash的超始地址必须一致。

出0入0汤圆

 楼主| 发表于 2015-10-10 11:00:47 | 显示全部楼层
LeiR 发表于 2015-9-7 10:06
代码自己做Bootloader+Application两个工程:

1)、Bootloader:跳转到Application前,先关中断,再跳转; ...

嗯,谢谢

问题已经解决,是我把app的地址和写的程序地址没有弄一致,运行app后就直接复位了

出0入0汤圆

发表于 2015-10-16 00:02:17 | 显示全部楼层
xtaens 发表于 2015-10-10 11:00
嗯,谢谢

问题已经解决,是我把app的地址和写的程序地址没有弄一致,运行app后就直接复位了  ...

解决了就好
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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