搜索
bottom↓
回复: 5

求助STM32F4 IAP 用仿真器下载可以正常运行,重新上电后死机

[复制链接]

出0入4汤圆

发表于 2019-6-19 15:59:12 | 显示全部楼层 |阅读模式
本帖最后由 yunqing_abc 于 2019-6-19 15:59 编辑

单片机类型:STM32F407VET6
编译环境:IAR7.7
各位大佬,我先说一下我的问题:
我打算在原有的程序中增加一个IAP功能,将主程序放在FLASH的0x08040000位置,实现程序上电就能自动跳转到0x08040000的位置。
  1. #define  ApplicationAddressOne 0x08040000
  2. typedef  void (*pFunction)(void);
  3. __root void funclnrom(void) @  ".funflash"
  4. {
  5.         __IO uint32_t JumpAddress;
  6.         pFunction   Jump_To_Application;
  7.         __set_PRIMASK(1);
  8.         __disable_irq();      
  9.         if(((*(volatile vu32*)ApplicationAddressOne)&0x2FFE0000)==0x20000000)
  10.                 {
  11.                         JumpAddress = *(volatile uint32_t *)(ApplicationAddressOne + 4);                                          
  12.                         Jump_To_Application = (pFunction)JumpAddress;  
  13.                         __set_MSP(*(volatile uint32_t*)ApplicationAddressOne);
  14.                         Jump_To_Application();                                
  15.                 }        
  16. }
复制代码

上边这段代码是我在原来的程序中增加的IAP跳转程序,这段程序我放在了FLASH的0x08000000位置,在icf中做好了相关的配置。
在原来的main函数中增加了两行代码,最上边两行就是增加的代码。
  1. int main(void)
  2. {
  3. [color=Red]        __disable_irq(); //关闭总中断     
  4.       NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x40000);[/color]
  5.         SysInit();
  6.         Init_Paras();
  7.         KEY_Start();
  8.         CTR_Start();
  9.         ERRO_Start();
  10.         ModBus_Start();
  11.         ROJ_Start();
  12.         EEPROM_Start();
  13.         FLASHEE_Start();
  14.         HMI_Start();
  15.         RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure1);
  16.         RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure1);
  17.           QF_run();

  18. }
复制代码

现在的问题是,我用仿真器下载后,程序可以运行。而断开仿真器后,重新上电,程序无法运行。
我在IAR 仿真的时候,发现如果用复位按钮复位,PC指针的值是正确的,而重新上电后,PC指针的值是不对的,而此时程序是无法运行的,求大佬指点,是哪里出现了问题,谢谢!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2019-6-19 16:55:48 | 显示全部楼层
  我也是用stm32F407芯片出了一个类似的问题: 单步仿真每一步都正常,一全速仿真就不对,怀疑是定时中断初始值太大,开定时中断后将定时器计数器初始值设为零后现象还是没变化!

出0入4汤圆

 楼主| 发表于 2019-6-19 17:18:28 | 显示全部楼层
coleyao 发表于 2019-6-19 16:55
我也是用stm32F407芯片出了一个类似的问题: 单步仿真每一步都正常,一全速仿真就不对,怀疑是定时中断初 ...

现象还不太一样,我是单步和全速都正常的,只要是用仿真器下载,或者只调试不下载,都是正常的。就是拔下仿真器,下电后再上电不运行。
我怀疑是软复位和上电复位的差别引起的,但是我查不出来问题,希望大佬们有空给指点个方向。

出40入42汤圆

发表于 2019-6-19 18:21:02 | 显示全部楼层
IAR把Linker文件配置好后,下载仿真会自动跳到Linker指定的位置执行,不像Keil还要自己写个脚本
就是说IAR仿真的时候会直接跳过了你的IAP部分,运行到APP的程序起始地址

没有跳转到APP里面,一般是IAP那部分不对的
试一下重上电死机后,再按复位,看能不能跳到APP,如果还是不能,就是IAP代码那里有问题
也有可能是中断向量表问题,如果APP里面有中断响应的话

出0入0汤圆

发表于 2019-6-20 09:34:09 | 显示全部楼层
IAP有问题,我有个程序也是一跑就死,在线联调问题多,换回JLINK,一切问题迎刃而解

出0入0汤圆

发表于 2019-6-20 10:29:59 来自手机 | 显示全部楼层
本帖最后由 tiny13 于 2019-6-20 10:35 编辑

连仿真器运行时,MCU直接从0x08040000开始运行,    无仿真器时MCU从0X08000000开始执行,  那么最简单的方法是把整个FLASH读出为BIN文件,用WINHEX打开,把0x08040000开始的8个字节复制到0X08000000处,保存,重新烧写进MCU即可运行。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-18 14:21

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

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