硬汉嵌入式论坛

 找回密码
 立即注册
楼主: eric2013
收起左侧

[BOOT/IAP] 实战技能分享,一劳永逸的解决BOOT跳转APP失败问题,含MDK AC5,AC6和IAR,同时制作了一个视频操作说明

  [复制链接]

7

主题

34

回帖

55

积分

初级会员

积分
55
发表于 2024-8-23 10:09:50 | 显示全部楼层
eric2013 发表于 2024-8-14 08:57
Embedded Studio吗

这个

好的,感谢硬汉大佬
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-8-25 20:09:59 | 显示全部楼层
硬汉,我还有一个疑问:如果把Bootloader程序的Flash地址设置到0x08000000,App程序的Flash地址设置到0x08001000,若分别独立加载2个程序,可以看到地址0x00000000分别映射到了0x08000000或0x08001000。现在把2个目标文件合并成1个文件烧录到STM32F4芯片中,那么地址0x00000000会映射到哪里?怎么决定是用哪个分散加载文件实现的呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-26 08:41:50 | 显示全部楼层
shaodong821 发表于 2024-8-25 20:09
硬汉,我还有一个疑问:如果把Bootloader程序的Flash地址设置到0x08000000,App程序的Flash地址设置到0x080 ...

看此贴就明白了

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000
https://www.armbbs.cn/forum.php? ... 9321&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-8-26 09:13:43 | 显示全部楼层
eric2013 发表于 2024-8-26 08:41
看此贴就明白了

【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000

此贴我之前都看过了,但是帖子里没有说明 “(关键在于)把2个目标文件合并成1个文件后,地址0x00000000是映射到Bootloader的中断向量表还是App的?是如何映射的”?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-26 09:16:56 | 显示全部楼层
shaodong821 发表于 2024-8-26 09:13
此贴我之前都看过了,但是帖子里没有说明 “(关键在于)把2个目标文件合并成1个文件后,地址0x00000000是 ...

对于F4系列,上电后固定的是0x0800 0000做的映射,这个是无法改变的。

上电后,映射的哪个,是你的VTOR寄存器设置的,你设置的那个就从那里读取向量表。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-8-26 11:27:05 | 显示全部楼层
eric2013 发表于 2024-8-26 09:16
对于F4系列,上电后固定的是0x0800 0000做的映射,这个是无法改变的。

上电后,映射的哪个,是你的VTO ...

但是我仅单独加载App程序(它的Flash地址设置到0x08001000),进入调试模式后,查看到内存0x00000000实际映射到了0x08001000,其内容是一致的。(stm32f4)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-26 11:44:58 | 显示全部楼层
shaodong821 发表于 2024-8-26 11:27
但是我仅单独加载App程序(它的Flash地址设置到0x08001000),进入调试模式后,查看到内存0x00000000实际 ...

将0x0800 0000 到 0x08001000 擦除干净。

且你没有手动配置脚本,F4系列是无法直接在0x08001000调程序的。

之所以能调试和重映射了,是因为配置了这个,比如MDK

[C] 纯文本查看 复制代码
FUNC void Setup (void) {
  SP = _RDWORD(0x24000000);			// 设置堆栈指针
  PC = _RDWORD(0x24000004);			// 设置PC指针
  _WDWORD(0xE000ED08, 0x24000000);	// 设置中断向量表地址
}

LOAD Objects\output.axf INCREMENTAL // 先装载代码到CPU内部RAM  (工程选项中就不要选Load Application ar Startup)
Setup();                            // 再调用Setup函数修改堆栈和PC指针(因为SP的值需要从目标代码中读取)
g, main								// 运行到main()函数


回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-8-26 19:46:23 | 显示全部楼层
eric2013 发表于 2024-8-26 11:44
将0x0800 0000 到 0x08001000 擦除干净。

且你没有手动配置脚本,F4系列是无法直接在0x08001000调程序 ...

我按照你说的又做了下实验:将0x08000000 到 0x08001000 擦除干净,F4确实无法直接跳转到0x08001000的程序。谢谢硬汉!
回复

使用道具 举报

3

主题

70

回帖

79

积分

初级会员

积分
79
发表于 2024-8-30 23:47:30 | 显示全部楼层
今天测试了Boot和APP两个工程,在跳转从Boot跳转到APP,跳转成功了,但是在APP程序中卡在了HAL_GetTick()中,没有数据,导致APP程序无法运行,这是什么原因?

USB_APP_New.zip

10.52 MB, 下载次数: 2

回复

使用道具 举报

6

主题

234

回帖

252

积分

高级会员

积分
252
发表于 2024-8-31 08:42:34 | 显示全部楼层
waterx3 发表于 2021-11-17 08:48
有电池的话,跳转变量放备份区也可以吧

没电池也可以,只要不断电,备份区是可以保持的,
我就这么干的,然后直接复位,就是一个干净的系统。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-31 09:16:24 | 显示全部楼层
跟着硬汉学 发表于 2024-8-30 23:47
今天测试了Boot和APP两个工程,在跳转从Boot跳转到APP,跳转成功了,但是在APP程序中卡在了HAL_GetTick()中 ...

你发的这个APP的中断向量表地址是不是没有修改到0x08100 0000里面,我在你的工程里面没有看到设置的地方。

SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
回复

使用道具 举报

3

主题

70

回帖

79

积分

初级会员

积分
79
发表于 2024-8-31 12:50:55 | 显示全部楼层
eric2013 发表于 2024-8-31 09:16
你发的这个APP的中断向量表地址是不是没有修改到0x08100 0000里面,我在你的工程里面没有看到设置的地方 ...

谢谢硬汉哥,就是这个问题,之前用的那种麻烦的方式,用一劳永逸没有注意这个,还是对整体了解不够透彻!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-1 07:50:18 | 显示全部楼层
跟着硬汉学 发表于 2024-8-31 12:50
谢谢硬汉哥,就是这个问题,之前用的那种麻烦的方式,用一劳永逸没有注意这个,还是对整体了解不够透彻!



解决了就好。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-9-5 14:38:44 | 显示全部楼层
硬汉老师,在AC5中使用这种方法可不可以对这个变量初始化成一个特定的值
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-6 09:26:57 | 显示全部楼层
永远是小学生 发表于 2024-9-5 14:38
硬汉老师,在AC5中使用这种方法可不可以对这个变量初始化成一个特定的值

可以的。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-9-15 21:13:00 | 显示全部楼层
RAM一直被重置,后来,直接手动把MDK里RAM的配置1份掰成2份,然后第2份勾选"NoInit",就可以了。

变量也是这样定义(地址写第2个RAM的首地址就OK):
uint32_t g_JumpInit __attribute__((at(0x2001C000), zero_init));

不过我这里RAM不是乱掰的,是手册中写的SRAM有SRAM1(128KB)、SRAM2(16KB),我才这样掰开的。

128 Kbytes of system SRAM ...... The embedded SRAM is divided into up to two blocks: SRAM1 and SRAM2
_000.png
_001.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-16 02:39:11 | 显示全部楼层
零zero 发表于 2024-9-15 21:13
RAM一直被重置,后来,直接手动把MDK里RAM的配置1份掰成2份,然后第2份勾选"NoInit",就可以了。

变量也 ...

谢谢分享
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-9-25 20:19:23 | 显示全部楼层
C:\Users\SUN\Desktop
硬汉老师在MDK5中设置IRAM1和IRAM2有什么讲究没
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-26 08:04:33 | 显示全部楼层
永远是小学生 发表于 2024-9-25 20:19
硬汉老师在MDK5中设置IRAM1和IRAM2有什么讲究没

没有特别讲究,特别注意不同RAM块的区别,比如有些RAM块不支持通用DMA,这样的话,如果你的程序DMA缓冲被分配到这个RAM块就会出问题,注意这点就行。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-9-29 09:23:46 | 显示全部楼层
eric2013 发表于 2024-9-26 08:04
没有特别讲究,特别注意不同RAM块的区别,比如有些RAM块不支持通用DMA,这样的话,如果你的程序DMA缓冲被 ...

我下载了您的例程看了,您选择IRAM2的起始地址从0x24000000开始的。我现在的疑问就是:选择这个起始地址的依据是什么。如何根据单片机来选择地址?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-9-30 09:48:31 | 显示全部楼层
永远是小学生 发表于 2024-9-29 09:23
我下载了您的例程看了,您选择IRAM2的起始地址从0x24000000开始的。我现在的疑问就是:选择这个起始地址 ...

这个没有特别含义。

我这个例子选择这个是因为这个AXI SRAM空间有512KB的RAM空间
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-10-18 11:28:47 | 显示全部楼层
硬汉大佬依旧如此热爱分享
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-19 09:22:15 | 显示全部楼层
Mrlh 发表于 2024-10-18 11:28
硬汉大佬依旧如此热爱分享

回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-10-21 11:35:33 | 显示全部楼层
yelu 发表于 2022-10-22 19:04
(1)我的程序被抢占了这里指?
(2)今天花了时间看了下,是因为编译器的优化选项(Arm clang  编译器V ...

哥,你好。我的问题和你的类似。但按照你说的方法区修改了,包括修改那个变量为全局变量,修改优化等级。但是还是没能实现跳转。我同样的跳转程序,gd32c103都能跳转,但是现在这个gd32e230就不能,可以的话贴一下你的跳转程序,我学习学习。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-21 15:16:22 | 显示全部楼层
永远是小学生 发表于 2024-10-21 11:35
哥,你好。我的问题和你的类似。但按照你说的方法区修改了,包括修改那个变量为全局变量,修改优化等级。 ...

如果有外置EEPROM或者SPI Flash的话,将变量存到外置Flash也可以的
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-10-21 16:31:24 | 显示全部楼层
eric2013 发表于 2024-10-21 15:16
如果有外置EEPROM或者SPI Flash的话,将变量存到外置Flash也可以的

我今天改了,能跳转到app了,但是到app了之后,运行systick_config之后就会进入HardFault_Handler。现在头都大了。改了优化等级,-o0连SystemInit都不能完成。硬汉老师支支招
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-22 09:30:22 | 显示全部楼层
永远是小学生 发表于 2024-10-21 16:31
我今天改了,能跳转到app了,但是到app了之后,运行systick_config之后就会进入HardFault_Handler。现在 ...

APP里面什么都不做, 仅做个LED翻转,正常不
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-10-22 15:05:05 | 显示全部楼层
实际应用好像是主程序连上客户端 接收到客户端指令 在备份区做标记重启 BOOT检测备份区标记进入等待升级指令
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-23 09:55:53 | 显示全部楼层
sunning 发表于 2024-10-22 15:05
实际应用好像是主程序连上客户端 接收到客户端指令 在备份区做标记重启 BOOT检测备份区标记进入等待升级指 ...

如果是内置Flash做备份区,不太方便,比如楼主位使用的是STM32H743/H750系列,这个系列一个扇区是128KB,占用空间大,擦写时间长。

如果带纽扣电池的BackRAM也可以的,这个跟楼主位的方法差不多。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-10-23 11:15:23 | 显示全部楼层
eric2013 发表于 2024-10-22 09:30
APP里面什么都不做, 仅做个LED翻转,正常不

不正常,led初始化之后就进入了HardFault_Handler里面。主函数的while(1)进不去。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-24 09:26:35 | 显示全部楼层
永远是小学生 发表于 2024-10-23 11:15
不正常,led初始化之后就进入了HardFault_Handler里面。主函数的while(1)进不去。

看下HardFault的错误类型
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-10-24 11:40:17 | 显示全部楼层
eric2013 发表于 2022-1-17 17:18
编译报错不正常,貌似是定义有误。方便的话,贴下你的定义方式。

这种方法对于H7而言,128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)这些区域是不能这样使用的。同时测试发现,DTCM空间任何位置都是没任何问题的,但是AXI SRAM和SRAM4只能使用前面一小部分空间,使用后面空间也是不行的。这个原因还没找到。目前直接使用了DTCM。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-10-24 11:46:54 | 显示全部楼层
sanit 发表于 2024-10-24 11:40
这种方法对于H7而言,128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)这 ...

STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)
https://www.armbbs.cn/forum.php? ... 5217&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-10-24 14:57:01 | 显示全部楼层
eric2013 发表于 2024-10-24 11:46
STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)
https://www.ar ...

感谢老大,很有帮助。我按照这个思路测试下看看
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-11-2 20:13:26 | 显示全部楼层
大佬,想请教一下,我网上找到的资料。在  boot 代码跳进 app 代码时, 有的是设置 中断向量表的偏移量, 有的是 设置主堆栈指针。
这两个有什么差异吗?还是说 设置中断向量表的偏移量就是 设置主堆栈指针?如果有差异,那么应该怎么设置?两个都是必须的吗。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-11-3 09:30:17 | 显示全部楼层
何月明 发表于 2024-11-2 20:13
大佬,想请教一下,我网上找到的资料。在  boot 代码跳进 app 代码时, 有的是设置 中断向量表的偏移量,  ...

这是种两种东西,都要设置。跳转APP前,MSP一定要设置,而中断向量表地址可以在BOOT里面设置,也可以在APP里面设置,在APP里面设置的话,一定要在中断开启运行之前就设置,否则运行的中断入口地址还是BOOT程序的。
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-11-5 17:25:34 | 显示全部楼层
sanit 发表于 2024-10-24 11:40
这种方法对于H7而言,128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)这 ...

原因找到了  因为cache我配置错了。直接关闭D-cache 或者 重启复位之前调用SCB_CleanInvalidateDCache();就不会有问题了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-11-6 09:17:49 | 显示全部楼层
sanit 发表于 2024-11-5 17:25
原因找到了  因为cache我配置错了。直接关闭D-cache 或者 重启复位之前调用SCB_CleanInvalidateDCache(); ...

谢谢分享。

只是这样的使用反倒麻烦了,不如全部UITN32_T,怎么用都没问题。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-11-26 10:43:20 | 显示全部楼层
讲解是挺详细,学习
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-2-8 17:23:34 | 显示全部楼层
看到大家BOOT与APP之间跳转的方法,我总结一下和进行一些拓展,如果不对,还得请大家指正。
1、声明变量,并赋予不被编译器初始化的属性。变量赋值状态后,通过软件复位进行跳转。
2、使用备份寄存器保存状态。赋值状态后,通过软件复位进行跳转。
3、使用flash保存状态。软件启动后根据状态进行跳转。
4、使用外部EEPROM/Flash保存状态。原理同3.

优:
1、方便设置,通用性强。
2、如果有备用电池,app更新过程中外部电源断电,重启后依旧可以进入升级状态继续更新。
3、app更新过程中电源断电,重启后依旧可以进入升级状态继续更新。
4、同3
劣:
1、更新过程中如果断电,会变砖
2、依赖备用电池,通用性不强
3、额外占用flash,F1系列的扇区1/2k的还能接受,如果是H7的,一个扇区就128k了。
4、依赖外部EEPROM/Flash,通用性不强

最后硬件上尽可能保留一个按钮,如果真的变砖了,还能通过按钮进入升级模式挽救
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 07:11 , Processed in 0.483055 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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