硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4292|回复: 10
收起左侧

stm32 bootloader 跳转成功不执行

[复制链接]

29

主题

101

回帖

188

积分

初级会员

积分
188
发表于 2018-1-16 09:49:35 | 显示全部楼层 |阅读模式
本帖最后由 captainliuy 于 2018-1-16 16:40 编辑

stm32 bootloader 参考官方例程,JumpToApp, 里面没有直接就调转了,也没有关中断。看到有些帖子说要关闭中断,代码如下:
  1. void JumpToApp(void)
  2. {
  3.         __set_PRIMASK(1);
  4.         if(((*(__IO uint32_t*)AppAddress) & 0x2FFC0000 ) == 0x20000000)
  5.         {
  6.                __ASM("CPSID  I");
  7.                 /* Jump to user application */
  8.                 JumpAddress = *(__IO uint32_t*) (AppAddress + 4);
  9.                 Jump_To_Application = (pFunction) JumpAddress;
  10.                 /* Initialize user application's Stack Pointer */
  11.                 __set_MSP(*(__IO uint32_t*) AppAddress);
  12.                 Jump_To_Application();
  13.         }        
  14. }
复制代码
添加了__set_PRIMASK(1) 和__ASM("CPSID  I")
请问楼主跳转之前都要做什么准备工作?
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2018-1-16 10:45:03 | 显示全部楼层
if(((*(__IO uint32_t*)AppAddress) & 0x2FFC0000 ) == 0x20000000)这个地址判断对吗? 要根据你固件大小相应变化  
回复

使用道具 举报

29

主题

101

回帖

188

积分

初级会员

积分
188
 楼主| 发表于 2018-1-16 11:16:43 | 显示全部楼层
hanzixiangel 发表于 2018-1-16 10:45
if(((*(__IO uint32_t*)AppAddress) & 0x2FFC0000 ) == 0x20000000)这个地址判断对吗? 要根据你固件大小相 ...

这个是对的,现在的现象并不是每次都跳转不成功,只是有一定的概率出现跳转过去没反应的情况。
回复

使用道具 举报

29

主题

101

回帖

188

积分

初级会员

积分
188
 楼主| 发表于 2018-1-16 11:38:01 | 显示全部楼层
本帖最后由 captainliuy 于 2018-1-16 11:39 编辑

我的项目和常见的IAP不一样,我的bootloader并不接收文件,Flash分为三块,第一块是boot区,第二块是APP区,第三块是升级文件交换区。
我是在用户APP接收升级文件放在交换区,然后复位进入bootloader, bootloader检查交换区的时间戳比APP文件的新并且校验通过,就用交换区文件的覆盖APP,然后跳转。
现在有两个项目一个是F4的,在bootloader的JumpToApp里关中断,跳转成功,执行完外设初始化完后,不知道卡在哪里,就被看门狗复位了
一个是L4的项目,JumpToApp里不关中断有时候就会跳转过去没动静,关了中断后就每次跳转APP都可以运行。APP都是跑FreeRTOS
回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2018-1-16 17:23:33 | 显示全部楼层
APP中断向量表重映射没有?
回复

使用道具 举报

29

主题

101

回帖

188

积分

初级会员

积分
188
 楼主| 发表于 2018-1-17 11:26:38 | 显示全部楼层
本帖最后由 captainliuy 于 2018-1-17 11:28 编辑
barryxiao 发表于 2018-1-16 17:23
APP中断向量表重映射没有?
  1.   /* Configure the Vector Table location add offset address ------------------*/
  2. #ifdef VECT_TAB_SRAM
  3.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  4. #else
  5.   SCB->VTOR = FLASH_BASE | 0x20200; /* Vector Table Relocation in Internal FLASH */
  6. #endif
复制代码

在system_stm32f4xx.c的void SystemInit(void)中设置了
回复

使用道具 举报

14

主题

61

回帖

103

积分

初级会员

积分
103
发表于 2018-1-24 09:58:57 | 显示全部楼层
没有仔细看你的程序, 我之前出现跳转成功但是不执行是因为优化等级-O2的原因, -O1就没问题了, 我是FreeRTOS.
回复

使用道具 举报

29

主题

101

回帖

188

积分

初级会员

积分
188
 楼主| 发表于 2018-1-24 15:06:22 | 显示全部楼层
rgw5267 发表于 2018-1-24 09:58
没有仔细看你的程序, 我之前出现跳转成功但是不执行是因为优化等级-O2的原因, -O1就没问题了, 我是FreeRTOS ...

我一直开O3。我现在是有的项目boot关中断,有的不关。
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
发表于 2018-1-29 11:05:42 | 显示全部楼层
captainliuy 发表于 2018-1-24 15:06
我一直开O3。我现在是有的项目boot关中断,有的不关。

貌似在跳转前关闭所有中断,再在 app 里面开启
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

山川如故

积分
18
发表于 2024-5-16 23:48:19 | 显示全部楼层
【经验分享】无法使用内置 Bootloader 的 DFU 方式进行固件升级   https://shequ.stmicroelectronics.cn/thread-633424-1-1.html
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

山川如故

积分
18
发表于 2024-5-17 12:14:33 | 显示全部楼层
之前也遇到了这个问题,发现要调整一下顺序,否则滴答定时器关不掉,影响跳转 /*设置所有时钟到默认状态,使用HSI时钟*/ HAL_RCC_DeInit();  /*关闭滴答定时器,恢复到默认值*/ SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0;
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-9 22:13 , Processed in 0.337839 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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