搜索
bottom↓
回复: 71

stm32 iAP成功跳转APP 但是没有执行 正解在5楼

  [复制链接]

出0入0汤圆

发表于 2014-12-4 11:03:06 | 显示全部楼层 |阅读模式
本帖最后由 天涯行客 于 2014-12-4 12:37 编辑

程序所有配置都没有问题,就是不执行APP程序,不知道怎么回事啊

程序跳转代码

        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
        {
            SerialPutString("Execute user Program\r\n\n");

            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
            Jump_To_Application = (pFunction) JumpAddress;

            __set_MSP(*(__IO uint32_t*) ApplicationAddress);
            Jump_To_Application();
        }
#define ApplicationAddress    0x8010000


我APP程序比较大 生成的BIN文件有60K左右,会是堆栈溢出的问题吗?


正解在5楼

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

 楼主| 发表于 2014-12-4 11:04:45 | 显示全部楼层
串口调试助手 显示 Execute user Program

出0入37汤圆

发表于 2014-12-4 11:19:40 | 显示全部楼层
看看这个勾选了吗?

本帖子中包含更多资源

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

x

出0入8汤圆

发表于 2014-12-4 11:32:48 | 显示全部楼层
可以先写一个简单的APP,比如控制LED,调通之后再测试你的最终APP。

出0入0汤圆

发表于 2014-12-4 11:40:11 | 显示全部楼层
本帖最后由 xf331785508 于 2014-12-4 11:42 编辑

我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关所有中断,进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

  1.     __set_PRIMASK(1);
  2.     if(((*(__IO uint32_t *) ApplicationAddress) & 0x2FFE0000) == 0x20000000)
  3.     {
  4.       __ASM("CPSID  I");
  5.       JumpAddress = *(__IO uint32_t *) (ApplicationAddress + 4);
  6.       Jump_To_Application = (pFunction) JumpAddress;
  7.       
  8.       __set_MSP(*(__IO uint32_t *) ApplicationAddress);
  9.       Jump_To_Application();
  10.     }
  11.     else
复制代码


__ASM("CPSID  I");   //注意这句

  1.     NVIC_InitTypeDef NVIC_InitStructure;
  2.     EXTI_InitTypeDef EXTI_InitStructure;
  3. #ifdef  VECT_TAB_RAM
  4.     /* Set the Vector Table base location at 0x20000000 */
  5.     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  6. #else  /* VECT_TAB_FLASH  */
  7.     /* Set the Vector Table base location at 0x08000000 */
  8.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x9000);
  9.     __ASM("CPSIE  I");
  10. #endif
  11.     //   Configure one bit for preemption priority
  12.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  13.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  14.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  15.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  16.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  17.     NVIC_Init(&NVIC_InitStructure);
复制代码

出0入22汤圆

发表于 2014-12-4 11:56:40 来自手机 | 显示全部楼层
注意中断向量表的移动

出0入0汤圆

发表于 2014-12-4 12:00:03 | 显示全部楼层
恩,STM32 IAP 跳转 APP

出0入0汤圆

发表于 2014-12-4 12:03:38 来自手机 | 显示全部楼层
app的main函数里开头要加一条指令

出0入0汤圆

 楼主| 发表于 2014-12-4 12:33:44 | 显示全部楼层
varding 发表于 2014-12-4 11:19
看看这个勾选了吗?

这个勾选了

出0入0汤圆

 楼主| 发表于 2014-12-4 12:35:04 | 显示全部楼层
Jmhh247 发表于 2014-12-4 11:32
可以先写一个简单的APP,比如控制LED,调通之后再测试你的最终APP。

我有控制LED这样的小程序 更新也是能够成功的  只是程序变大复杂之后就不成功

出0入0汤圆

 楼主| 发表于 2014-12-4 12:36:14 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

正解  谢谢!

出0入0汤圆

发表于 2014-12-4 12:37:45 | 显示全部楼层
是不是在中断中跳转的?

出0入0汤圆

发表于 2014-12-4 12:47:02 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

就是这个,如果没有这个,是不会动作的;

出0入0汤圆

 楼主| 发表于 2014-12-4 13:33:15 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

你好  我现在还有一个问题就是  APP程序是带UCOS操作系统的   在地址不偏移的情况下  程序能够很好的运行,但是通过更新 能够执行 但是只运行前面一个任务 就死机了  任务不能进行切换 ,这是什么问题啊

出0入0汤圆

发表于 2014-12-4 13:40:49 | 显示全部楼层
本帖最后由 fenglove 于 2014-12-4 13:42 编辑

生成BIN文件 APP程序里面需要跳转。。。。

出0入0汤圆

发表于 2014-12-4 13:55:36 | 显示全部楼层
main函数开头要加SCB->VTOR=FLASH_BASE|APP开始地址;

出0入0汤圆

 楼主| 发表于 2014-12-4 14:04:48 | 显示全部楼层
天涯行客 发表于 2014-12-4 13:33
你好  我现在还有一个问题就是  APP程序是带UCOS操作系统的   在地址不偏移的情况下  程序能够很好的运行 ...


找到原因了 就是在    NVIC_SetVectorTable(0x08000000,0x0010000);之后 不能再调用函数void SystemInit (void)
void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
   
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl();
  #endif /* DATA_IN_ExtSRAM */
#endif

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /* Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}

出0入0汤圆

发表于 2014-12-4 14:07:44 | 显示全部楼层
也就是说需要提前完成这些工作喽?

出0入0汤圆

发表于 2014-12-4 15:10:21 | 显示全部楼层
学习了  正打算弄iap   

出0入0汤圆

 楼主| 发表于 2014-12-4 15:52:58 | 显示全部楼层
xianghaisha 发表于 2014-12-4 14:07
也就是说需要提前完成这些工作喽?

嗯 是的 可以这样  
SystemInit();
NVIC_SetVectorTable(0x08000000,0x00010000);

一般启动文件中有以下代码的话,也可以不用调用SystemInit();
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

出0入0汤圆

发表于 2014-12-22 14:45:36 | 显示全部楼层
学习了!  研究研究这类操作!

出0入147汤圆

发表于 2014-12-22 15:32:47 来自手机 | 显示全部楼层
既然用库,那就按库的要求来,只需要在system_stm32f10x.c里面改下VECT_TAB_OFFSET的值就行了

出0入17汤圆

发表于 2014-12-22 18:24:22 | 显示全部楼层
这个是好东西!记下来

出0入0汤圆

发表于 2014-12-24 10:04:33 | 显示全部楼层
正巧遇到这问题,太感谢LZ了

出0入0汤圆

发表于 2014-12-24 19:41:33 来自手机 | 显示全部楼层
记录,还没有搞定IAP

出0入0汤圆

发表于 2014-12-25 00:17:30 | 显示全部楼层
中断向量表移动~

出0入0汤圆

发表于 2014-12-25 12:48:34 | 显示全部楼层
试过 小IAP成功,学习了

出0入0汤圆

发表于 2014-12-26 00:26:54 | 显示全部楼层
看一下                                                                                                                                                                          

出0入0汤圆

发表于 2014-12-26 08:52:54 | 显示全部楼层
app跳转 学习了

出0入0汤圆

发表于 2015-5-4 21:56:26 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

__ASM("CPSID  I");

__set_PRIMASK(1); 都是关中断。。。

层主 是要作甚?

出0入0汤圆

发表于 2015-5-5 09:25:45 | 显示全部楼层
闷鱼 发表于 2015-5-4 21:56
__ASM("CPSID  I");

__set_PRIMASK(1); 都是关中断。。。

那是因为你看帖不仔细;

__ASM("CPSID I");


__ASM("CPSIE I");

出0入0汤圆

发表于 2015-5-20 19:07:59 | 显示全部楼层
天涯行客 发表于 2014-12-4 15:52
嗯 是的 可以这样  
SystemInit();
NVIC_SetVectorTable(0x08000000,0x00010000);

如果 你有两个以上的 APP 程序。。。又如何设置向量表偏移?

出0入0汤圆

发表于 2015-5-28 17:10:27 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

大师为什么我按照你上面这样写的还是进不了定时器中断呢?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-5-28 17:20:18 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

大师、、按照你的方法好了、、刚刚是这里忘记改了、、谢谢!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-11-22 19:57:11 | 显示全部楼层
学习了,这个帖子太好了,少走好多弯路。

出0入13汤圆

发表于 2015-11-22 21:13:43 来自手机 | 显示全部楼层
学习,mark

出0入0汤圆

发表于 2015-11-22 21:46:14 | 显示全部楼层
IAP 学习了

出0入0汤圆

发表于 2015-11-23 13:55:08 | 显示全部楼层
好东西。

出0入0汤圆

发表于 2015-11-23 16:58:49 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

请教下,APP中一定要加开中断代码么,     我的只在BOOT中跳转前关闭中断,APP中没有开中断代码,但是用了很久一直都正常。                   坛里别人帖子似乎也没提到APP工程要加开中断代码。

出0入0汤圆

发表于 2015-11-24 17:06:30 | 显示全部楼层
本帖最后由 xf331785508 于 2015-11-24 17:13 编辑
huangqi412 发表于 2015-11-23 16:58
请教下,APP中一定要加开中断代码么,     我的只在BOOT中跳转前关闭中断,APP中没有开中断代码,但是用 ...


跟你的描述一样啊,在BOOT也即跳转APP段前关中断,等进入APP段后,BOOT已经不再管理程序,由APP接管CPU 的一切资源,此时,再开中断啊,不然,你的异步外设如何响应(定时循环检测外设的除外). 除非你的APP中完全用不到中断,那就不用开了。
(插个话:MCU集成了那么多的外设,IO,TIMER,AD,DA,USB,USART,IIC,IIS,SPI等等的接口,难道就没有一个用到中断。 五楼提到的开关中断代码是可以开关全局中断的。)

出0入0汤圆

发表于 2015-11-24 17:11:28 | 显示全部楼层
xf331785508 发表于 2015-11-24 17:06
不是开中断,是关中断。

因为我看你 5楼说        进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

还有个问题,如果在BOOT中假如开启了定时器中断啊串口中断啊一大堆,跳转到APP后是不是这些中断依然是开着的。  跳转并没有复位单片机,外设寄存器应该还是保留BOOT中写入的值吧。

一直没细究过这些问题,只是BOOT中中断,一直好像也没出问题。

出0入0汤圆

发表于 2015-11-24 17:16:14 | 显示全部楼层
huangqi412 发表于 2015-11-24 17:11
因为我看你 5楼说        进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

还有个问题, ...

那就要看你的APP段的程序开始后是否有重新配置中断(NVIC)寄存器,重新配置外设寄存器,有配置肯定被更新了,没配置 的话,理论上讲应该是BOOT配置后的结果,但我没实测过,有用到的话,你可以自己测测。
头像被屏蔽

出0入0汤圆

发表于 2015-11-24 17:17:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2015-11-24 17:18:30 | 显示全部楼层
xf331785508 发表于 2015-11-24 17:16
那就要看你的APP段的程序开始后是否有重新配置中断(NVIC)寄存器,重新配置外设寄存器,有配置肯定被更新 ...

进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

还是没懂这个,  BOOT中关闭中断后再跳转APP,在APP也没去特意开中断,似乎中断很正常。

出0入0汤圆

发表于 2015-11-24 17:18:37 | 显示全部楼层
adee4210 发表于 2015-11-24 17:17
boot中打开的中断,最好在boot中要关掉,否则在用户程序没有关掉之前就先开了全局中断,那就杯具了。 ...

本贴不就是你说的这种情况嘛!

出0入0汤圆

发表于 2015-11-24 17:18:42 | 显示全部楼层
学习了,这个帖子太好了,少走好多弯路。

出0入0汤圆

发表于 2015-11-24 17:22:16 | 显示全部楼层
huangqi412 发表于 2015-11-24 17:18
进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

还是没懂这个,  BOOT中关闭中断后再跳 ...

不管是全局中断配置代码还是部分中断配置代码,最终都是在中断相关管理的寄存器中写入一定的值,所以,对于你讲的没有特意开中断也正常,那得看中断相关管理的寄存器是否被配置了.

出0入0汤圆

发表于 2015-11-24 20:40:54 | 显示全部楼层
学习            

出0入8汤圆

发表于 2015-11-24 23:46:23 | 显示全部楼层
iap     明天试试!!

出0入0汤圆

发表于 2015-11-28 14:48:48 | 显示全部楼层
重新设置中断向量表后确实不能SystemInit();

出0入0汤圆

发表于 2016-1-8 11:18:33 | 显示全部楼层
学习了         

出0入0汤圆

发表于 2016-3-29 21:10:56 | 显示全部楼层
我用STM32F407也是按这个帖子来做的。成功实现升级 带ucosiii 操作系统的APP

出0入0汤圆

发表于 2016-4-29 11:25:28 | 显示全部楼层
stm32 iAP升级APP

出0入59汤圆

发表于 2017-6-3 10:36:09 | 显示全部楼层
stm32 IAP app,中断向量表偏移。最近也在玩这个,确实进入APP后,有些中断的问题需注意。好帖子!

出0入0汤圆

发表于 2017-6-15 07:28:08 来自手机 | 显示全部楼层
这个问题对于使用过iap功能肯定会遇到的,一般两个地方的问题。一个就是五楼所说的,从boot走之前关闭所有涉及到的中断,另外就是应用层需要设置中断向量表起始地址!

出0入0汤圆

发表于 2017-12-14 14:24:18 | 显示全部楼层
   __set_PRIMASK(1);
  /* Test if user code is programmed starting from address "ApplicationAddress" */
  if (((*(__IO uint32_t*)jumpAddr) & 0x2FFE0000 ) == 0x20000000)
  {
    __ASM("CPSID  I");
   
    JumpAddress = *(__IO uint32_t*) (jumpAddr + 4);
   
    /* Jump to user application */
    Jump_To_Application = (pFunction) JumpAddress;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) jumpAddr);//设置堆栈指针
    Jump_To_Application();
  }

遇到了同样的问题,iap更新完app后直接跳转到app不是每次都失败,有时可以有时执行不起来(在app main最开始位置点灯),跳转前也关闭了中断,app运行SystemInit函数时重设了中断向量表。
最后解决办法是iap更新完app后,软复位cpu,NVIC_SystemReset();
复位后重新运行iap,在main开始运行就跳转。可以
我怀疑是某些寄存器没被复位导致,不知道怎么深究哪个寄存器影响了直接跳转

出0入0汤圆

发表于 2017-12-14 14:25:23 | 显示全部楼层
xf331785508 发表于 2014-12-4 11:40
我遇到过,能进用户程序,但所有跟中断有关系的外设全部失灵,后来在本坛无意中发现有人在跳用户程序之前关 ...

我按照你的方法是了,还是有问题,最后复位cpu才能解决

出0入0汤圆

发表于 2017-12-18 21:55:41 来自手机 | 显示全部楼层
2427295@qq.com 发表于 2017-12-14 14:25
我按照你的方法是了,还是有问题,最后复位cpu才能解决

你是咋复位的,NVIC_SystemReset?

出0入0汤圆

发表于 2017-12-20 09:17:32 | 显示全部楼层
STM32  IAP 中断设置

出0入0汤圆

发表于 2017-12-20 09:55:20 | 显示全部楼层
Maurice 发表于 2017-12-18 21:55
你是咋复位的,NVIC_SystemReset?

是的。。。。。

出0入0汤圆

发表于 2017-12-20 13:22:15 | 显示全部楼层
mark以备后用

出0入0汤圆

发表于 2018-10-14 21:33:27 | 显示全部楼层
困扰多日,被3楼的提示解决了,谢谢伟大的群!

出0入0汤圆

发表于 2018-10-14 23:48:46 | 显示全部楼层

出0入4汤圆

发表于 2018-10-15 00:28:25 | 显示全部楼层
手动记号,备用

出0入0汤圆

发表于 2020-6-16 10:12:07 | 显示全部楼层
好贴,虽然过去很多年了,仍然有看头

出0入0汤圆

发表于 2020-6-17 09:06:46 | 显示全部楼层
好像和stm8的差不多的样子,iap内不能使用中断,iap内要重指向app的中断向量表

出0入0汤圆

发表于 2020-6-20 07:29:47 | 显示全部楼层
感谢,正在遇到这种IAP跳转的问题

出0入0汤圆

发表于 2020-6-25 15:43:21 | 显示全部楼层
huangqi412 发表于 2015-11-24 17:18
进到用户程序后,在中断向量表地址设定完成后再开中断。OK 了。

还是没懂这个,  BOOT中关闭中断后再跳 ...

似乎哪里开了中断了   我的app也没特意开中断   也能用。。。

出0入4汤圆

发表于 2020-6-25 16:41:29 | 显示全部楼层
5楼正解

出0入0汤圆

发表于 2020-6-26 01:54:26 来自手机 | 显示全部楼层
MARK一下备用,谢谢!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-22 07:27

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

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