硬汉嵌入式论坛

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

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

  [复制链接]

8

主题

49

回帖

78

积分

初级会员

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

我用的AC5,定义就是复制的那句代码:
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init));
报错如下: 微信截图_20220117191504.png
改成0x20000400没问题,0x20000200也会报错


回复

使用道具 举报

8

主题

49

回帖

78

积分

初级会员

积分
78
发表于 2022-1-18 08:32:28 | 显示全部楼层
wling597074509 发表于 2022-1-17 19:20
我用的AC5,定义就是复制的那句代码:
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init) ...

我看了下map文件,0x20000000这个位置被main文件里的变量占用了,应该是这个原因导致的报错。然后把main文件里的变量移到函数里,其他外设里定义的变量又占用了这个位置。。。
回复

使用道具 举报

8

主题

49

回帖

78

积分

初级会员

积分
78
发表于 2022-1-18 08:44:35 | 显示全部楼层
wling597074509 发表于 2022-1-17 19:20
我用的AC5,定义就是复制的那句代码:
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init) ...

原来是这里的问题,没有把0x20000000的地址给分出来


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-1-18 10:34:20 | 显示全部楼层
wling597074509 发表于 2022-1-18 08:44
原来是这里的问题,没有把0x20000000的地址给分出来

好的,
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-1-21 11:51:09 | 显示全部楼层
本帖最后由 oneV 于 2022-1-21 14:04 编辑

你们都能实现吗?奇怪,为什么我用NUCLEO-H743ZI试了一下就是不行呢?哪里姿势不对?!
.sct文件:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  5.   ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$$Sections)
  8.    .ANY (+RO)
  9.    .ANY (+XO)
  10.   }
  11.   RW_IRAM1 0x20000000 UNINIT 0x00000004  {  ; RW data
  12.    *(.bss.NoInit)
  13.   }
  14.   RW_IRAM2 0x24000000 0x00080000  {
  15.    .ANY (+RW +ZI)
  16.   }
  17. }
复制代码
  1. uint8_t no_init __attribute__((section(".bss.NoInit")));
复制代码

。。。

复制代码
  1. printf("1. 0x%X\r\n", no_init);
  2.         no_init = 0xCC;
  3.         printf("2. 0x%X\r\n", no_init);
  4.         HAL_Delay(1000);
  5.        
  6.         NVIC_SystemReset();
复制代码

1.png
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-1-21 15:24:19 | 显示全部楼层
oneV 发表于 2022-1-21 11:51
你们都能实现吗?奇怪,为什么我用NUCLEO-H743ZI试了一下就是不行呢?哪里姿势不对?!
.sct文件:

好吧 我知道了 uint8_t no_init得是uint32_t no_init
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2022-2-7 19:20:28 来自手机 | 显示全部楼层
g_JumpInit这个变量没有被初始化,是不是有很小的概率与0xAA553344相等?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-2-8 11:03:59 | 显示全部楼层
电子小菜鸟 发表于 2022-2-7 19:20
g_JumpInit这个变量没有被初始化,是不是有很小的概率与0xAA553344相等?

仅首次上电有一次相同的可能,这个不影响,可以直接跳转。

不放心,可以配合这个用。

STM32H7各种复位原因查找方法
https://www.armbbs.cn/forum.php? ... 0699&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-2-10 21:30:19 | 显示全部楼层
硬汉哥,请问一下是程序跳转从boot跳转到app,反过来是否可行,也是在程序运行在app区时跳转到boot区,这样的操作是否可行?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-2-10 21:43:04 | 显示全部楼层
eric2013 发表于 2021-11-17 07:56
内部Flash也不错,就是要搞了内部Flash的擦写操作,产品操作不频繁的话,也是不错的选择。

像H7这种不 ...

实际项目中,我们也是这么做的,在flash中划分可以标志位的区域
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-2-11 10:27:25 | 显示全部楼层
weboser 发表于 2022-2-10 21:30
硬汉哥,请问一下是程序跳转从boot跳转到app,反过来是否可行,也是在程序运行在app区时跳转到boot区,这样 ...

没问题,可以来回跳转的。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-2-11 10:44:39 | 显示全部楼层
eric2013 发表于 2022-2-11 10:27
没问题,可以来回跳转的。

好的,多谢硬汉哥!
使用系统boot这个我知道是可以跳转的,我想问的是自己写的boot和app程序是否能相互跳转?
还有就是按照您的说法从app跳转到boot,系统外设应该会复位是的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-2-12 09:44:31 | 显示全部楼层
weboser 发表于 2022-2-11 10:44
好的,多谢硬汉哥!
使用系统boot这个我知道是可以跳转的,我想问的是自己写的boot和app程序是否能相互 ...

分享个基于STM32H7的BOOT和APP代码都使用RTX5的案例,相互之间任意跳转
https://www.armbbs.cn/forum.php? ... 7247&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-2-18 17:20:35 | 显示全部楼层
本帖最后由 oneV 于 2022-2-18 18:17 编辑

IAP(AC6无OS)  APP(AC6无OS) IAP跳APP可以IAP(AC6无OS)  APP(AC6带OS threadx) IAP跳APP不成功
带OS有什么特殊之处

回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-2-18 21:03:40 | 显示全部楼层
oneV 发表于 2022-2-18 17:20
IAP(AC6无OS)  APP(AC6无OS) IAP跳APP可以IAP(AC6无OS)  APP(AC6带OS threadx) IAP跳APP不成功
带OS有什么 ...

自我解答一波,自己的锅,由于用的是G0 RAM太小了 IAP定义的一个测试用数组太大 删掉就一切OK了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-2-20 10:30:03 | 显示全部楼层
oneV 发表于 2022-2-18 21:03
自我解答一波,自己的锅,由于用的是G0 RAM太小了 IAP定义的一个测试用数组太大 删掉就一切OK了

回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-2-21 10:27:33 | 显示全部楼层
本帖最后由 oneV 于 2022-2-27 19:57 编辑
有个小疑问,像G0这种单RAM就直接在keil的options for Target里面的Read/Write Memory Areas进行设置就可以了,而不需要手动去改分散加载文件,比较好。但是像H7这种两个RAM,在keil里面好像就没法设置。
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
发表于 2022-2-23 14:53:24 | 显示全部楼层
本帖最后由 薪火相传 于 2022-2-23 14:59 编辑

小白请教一下,为啥软件复位g_JumpInit 不会被初始化?boot和app的ram可以重叠么?怎么理解好
回复

使用道具 举报

4

主题

16

回帖

28

积分

新手上路

积分
28
发表于 2022-3-21 22:18:17 | 显示全部楼层
wling597074509 发表于 2022-1-18 08:44
原来是这里的问题,没有把0x20000000的地址给分出来

老哥,同样的问题,能具体说说咋解决的吗?在Target里设置分为IRAM1;START 0x20000000 SIZE 0x04
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-3-22 10:07:25 | 显示全部楼层
薪火相传 发表于 2022-2-23 14:53
小白请教一下,为啥软件复位g_JumpInit 不会被初始化?boot和app的ram可以重叠么?怎么理解好

设置这个地址不重新初始化了。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2022-3-22 16:43:15 | 显示全部楼层

MDK5 是不是不能在main函数开始位置设置跳转操作了? 而是改到修改宏定义的值
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2022-3-22 16:43:16 | 显示全部楼层
QQ截图20220322163947.bmp
MDK5 是不是不能在main函数开始位置设置跳转操作了? 而是改到修改宏定义的值
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-3-23 10:17:52 | 显示全部楼层
wlx18682353162 发表于 2022-3-22 16:43
MDK5 是不是不能在main函数开始位置设置跳转操作了? 而是改到修改宏定义的值

可以,如果你之前MDK4编译下载没问题,使用MDK5也是没问题的。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-3-31 10:03:43 | 显示全部楼层
gallop020142 发表于 2021-11-30 19:57
请问硬汉,NVIC_SystemReset之后,所有的引脚都复位了,如果硬件需要一个引脚输出高电平保持整个系统供电, ...

除了上拉电阻还有其他的方法吗?
直接在app程序跳转到boot程序,其他的外设是否是保持app的状态,这样供电是否就是还在?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-4-1 10:11:39 | 显示全部楼层
weboser 发表于 2022-3-31 10:03
除了上拉电阻还有其他的方法吗?
直接在app程序跳转到boot程序,其他的外设是否是保持app的状态,这样供 ...

保持的,正常的app和boot相互跳转就跟你函数跳转是一样的。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2022-6-10 15:43:13 | 显示全部楼层
yklstudent 发表于 2021-11-17 07:21
实际项目中,我都是用芯片内部flash区域来判断是否跳转用户程序,其它都差不多,浪费了一点flash资源,不过 ...

我也是这样。选择最后一页。本身有默认参数存放flash。把其中几个字节留下来用于跳转判定。
回复

使用道具 举报

8

主题

28

回帖

52

积分

初级会员

积分
52
发表于 2022-6-12 21:13:31 | 显示全部楼层
hello,硬汉:

我认真看完视频,并在stm32-v5开发板上实践了一遍。我有一个疑问,请看下面函数里的红色部分的疑问???

/*
*********************************************************************************************************
*        函 数 名: JumpToApp
*        功能说明: 跳转到APP
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void JumpToApp(void)
{

        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
        __IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */

        g_JumpInit = 0xAA553344;  /* 这里再给g_JumpInit赋值0xAA553344的意义是什么? */

        /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

        /* 设置主堆栈指针 */
        __set_MSP(*(uint32_t *)BootAddr);
       
        /* 跳转到系统BootLoader */
        SysMemBootJump();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-6-13 14:47:38 | 显示全部楼层
q164129345 发表于 2022-6-12 21:13
hello,硬汉:

我认真看完视频,并在stm32-v5开发板上实践了一遍。我有一个疑问,请看下面函数里的红色 ...

image.png
回复

使用道具 举报

7

主题

42

回帖

63

积分

初级会员

积分
63
发表于 2022-6-14 16:07:07 | 显示全部楼层
硬汉哥,我这边按这个试了下,中间变量  在 reset后 变成0了 怎么回事。重启后这个样子。 image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-6-14 16:45:30 | 显示全部楼层
luis_13 发表于 2022-6-14 16:07
硬汉哥,我这边按这个试了下,中间变量  在 reset后 变成0了 怎么回事。重启后这个样子。

问题已经解决,程序没有正确放到非初始化空间。
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2022-7-11 15:38:36 | 显示全部楼层
没有设置中断向量表位置。 碰到不自己设置VECT的APP会挂
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-7-11 19:51:34 | 显示全部楼层
apleilx 发表于 2022-7-11 15:38
没有设置中断向量表位置。 碰到不自己设置VECT的APP会挂

要设置,ST的默认都是在system文件里面
回复

使用道具 举报

1

主题

103

回帖

106

积分

初级会员

积分
106
发表于 2022-7-19 16:54:50 | 显示全部楼层
这种视频能否做成单机版,不用联网也可以看。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-7-21 08:29:11 | 显示全部楼层
西点钟灵毓秀 发表于 2022-7-19 16:54
这种视频能否做成单机版,不用联网也可以看。

下载个B站客户端,可以方便的下载视频。
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2022-8-16 18:05:12 | 显示全部楼层
boot用ac5,app用ac6可以吗,我的app改为ac6跳过去直接异常
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2022-8-17 09:35:30 | 显示全部楼层
yuanzhongda 发表于 2022-8-16 18:05
boot用ac5,app用ac6可以吗,我的app改为ac6跳过去直接异常

没问题,AC6要注意那个NoInit是否正常设置了,分散加载文件里面要正常配置下
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2022-8-17 10:22:02 | 显示全部楼层
本帖最后由 yuanzhongda 于 2022-8-17 10:52 编辑
eric2013 发表于 2022-8-17 09:35
没问题,AC6要注意那个NoInit是否正常设置了,分散加载文件里面要正常配置下

确实是这里出了问题,关于外部sram配置的的    RW_IRAM5 0x68000000 UNINIT 0x00200000  {   ; RW data - 2MB SRAM(0xC0000000)
        *(.bss.NoInit)
        }
这里去掉bss还是不对,该怎么改呢
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2022-8-17 11:09:04 | 显示全部楼层
yuanzhongda 发表于 2022-8-17 10:22
确实是这里出了问题,关于外部sram配置的的    RW_IRAM5 0x68000000 UNINIT 0x00200000  {   ; RW data - ...

将名字改为.bss.RAM_SRAM_OUT   不使用.bss.NoInit这个名字就可以解决
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2022-8-21 22:30:09 | 显示全部楼层
cctv180 发表于 2021-11-17 13:49
那样直接上个flashDB很香的。

我有在项目上的boot和app用flashdb,很好用,就是占资源还挺大的
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-8-31 00:26:53 | 显示全部楼层
eric2013 发表于 2021-11-17 13:52
跟我的方法一样,我昨晚测试就是不行,真邪门。

在Segger Studio下测试,运行到SysMemBootJump()后即触发HardFault_Handler,程序跳转不成功,还未找到原因
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 11:20 , Processed in 0.423385 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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