硬汉嵌入式论坛

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

[BOOT/IAP] STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2019-10-3 00:51:54 | 显示全部楼层 |阅读模式
1、为什么要保持原有数:

     比如在IAP(bootloader)+APP场合,我们有些全局变量希望在boot代码和APP代码里面都使用,这时NVIC_SystemReset就容易出问题。

2、问题

    H7测试发使用uint8_t,uint16_t定义的变量,软件复位后,各种问题,总结各种可能规律,发现规律太难找了。

3、最终解决方案

采用下数据宽度就没有问题了,切不要使用8bit和16bit的定义。
uint32_t ptrtcm[1] __attribute__((at(0x20000000),zero_init)); /* DTCM, D1域,推荐32bit */
uint64_t ptr[1] __attribute__((at(0x24000000), zero_init));     /* AXI SRAM, D1域,推荐64bit,因为AXI SRAM总线接口是64bit的 */
uint32_t ptr1[1] __attribute__((at(0x30000000), zero_init));   /* SRAM1, D2域,推荐32bit */
uint32_t ptr2[1] __attribute__((at(0x30020000), zero_init));   /* SRAM2, D2域,推荐32bit */
uint32_t ptr3[1] __attribute__((at(0x30040000), zero_init));   /* SRAM3, D2域,推荐32bit  */
uint32_t ptr4[1] __attribute__((at(0x38000000), zero_init));   /* SRAM4, D3域,推荐32bit  */


其中ptr[1],ptr[1],ptr1[1],ptr2[1],ptr[1]3,ptr4[1]要配置MPU属性为WT

比如SRAM1
  1.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  2.         MPU_InitStruct.BaseAddress      = 0x30000000;
  3.         MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;
  4.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  5.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
  6.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
  7.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  8.         MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
  9.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
  10.         MPU_InitStruct.SubRegionDisable = 0x00;
  11.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
复制代码

另外就是SRAM时钟不要忘记使能,SRAM1,SRAM2和SRAM3是有时钟的:
__HAL_RCC_D2SRAM1_CLK_ENABLE();
__HAL_RCC_D2SRAM2_CLK_ENABLE();
__HAL_RCC_D2SRAM3_CLK_ENABLE();
               
这样定义后,就没有问题了,用户使用软件复位,这些数据也不会变了。



这里补充个知识点,就是变量不初始化的方法,看坛友分享的这个帖子即可:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=91369
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-3 00:56:27 | 显示全部楼层
软件复位反应在硬件上就是发了一个信号给硬件复位端


硬件:


软件API:

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-10-3 21:39:52 | 显示全部楼层
内存数据清0,我记得是连接脚本指定的,貌似m3是这样?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-4 11:57:15 | 显示全部楼层
myxiaonia 发表于 2019-10-3 21:39
内存数据清0,我记得是连接脚本指定的,貌似m3是这样?

脚本的方式,我还真没有用过。

以前的时候没有关注过这个问题,前天坛友咨询了个,我就专门研究了下

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-10-8 08:19:32 | 显示全部楼层
Eric, 有没有碰到过一些项目的软件,开机让机子重启两遍再运行的习惯?  这样我很不理解,有些说法是避免概率性一次启动不成功的情况。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 13:22:52 | 显示全部楼层
我不认同您这种NoInit方式,这种操作带来了不确定性。借助备份SRAM或者Flash也是可以达到目的的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-17 14:26:41 | 显示全部楼层
廷润 发表于 2019-10-8 08:19
Eric, 有没有碰到过一些项目的软件,开机让机子重启两遍再运行的习惯?  这样我很不理解,有些说法是避免概 ...

这个还真没
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-17 14:29:35 | 显示全部楼层
buxinshan 发表于 2019-10-17 13:22
我不认同您这种NoInit方式,这种操作带来了不确定性。借助备份SRAM或者Flash也是可以达到目的的。

H7的扇区太大,像H750,只有一个128KB。备份RAM没有外部的电池跟其它RAM没啥区别
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 15:03:28 | 显示全部楼层
eric2013 发表于 2019-10-17 14:29
H7的扇区太大,像H750,只有一个128KB。备份RAM没有外部的电池跟其它RAM没啥区别

想您所说,H7的Flash还是豪。后备SRAM在SoftReset的情况怎么可能复位呢。
捕获.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-17 15:07:21 | 显示全部楼层
buxinshan 发表于 2019-10-17 15:03
想您所说,H7的Flash还是豪。后备SRAM在SoftReset的情况怎么可能复位呢。

实测没区别,略坑。
这就是我这个贴子为什么唯独没有把这个备份ram加上,理论上不复位才正常。

后面有精力了再研究下,看看是不是哪里的坑没有踩到
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 15:09:14 | 显示全部楼层
eric2013 发表于 2019-10-17 14:29
H7的扇区太大,像H750,只有一个128KB。备份RAM没有外部的电池跟其它RAM没啥区别

刚才那条回复,还没编辑完,回车就完成并提交了,我只想多行编辑啊。还是点击下面“参与回复主题”才提交为好。     回到主题,H7的Flash擦除区域确实很大。其次,后备SRAM在SoftReset之后(无论是否提供VBAT)都不会被改变啊,在次RTC的32Word也不会改变啊,这都可以使用。 捕获.PNG
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 15:21:59 | 显示全部楼层
廷润 发表于 2019-10-8 08:19
Eric, 有没有碰到过一些项目的软件,开机让机子重启两遍再运行的习惯?  这样我很不理解,有些说法是避免概 ...

有试运行的情况。情况1、如果boot引导新App之后,新App正常运行了,则置特殊标志位,之后复位,boot则设置该新App有效并正常运行。情况2、如果boot引导新App之后,新App试运行失败(比如无法连接云平台/服务器),一段时间之后(那些完全无法运行的App,由外部看门狗负责定时复位),之后复位,boot则设置该新App无效,并回滚到旧App。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-17 15:25:56 | 显示全部楼层
buxinshan 发表于 2019-10-17 15:09
刚才那条回复,还没编辑完,回车就完成并提交了,我只想多行编辑啊。还是点击下面“参与回复主题”才提交 ...

实测被复位了,看我10楼的回复,你也可以实测下
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 15:31:15 | 显示全部楼层
eric2013 发表于 2019-10-17 15:25
实测被复位了,看我10楼的回复,你也可以实测下

RTC的32Word呢?也复位了?我没测试哦,V7板子在家。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2019-10-17 15:39:44 | 显示全部楼层
buxinshan 发表于 2019-10-17 15:31
RTC的32Word呢?也复位了?我没测试哦,V7板子在家。

回头我把备份ram的测试也补上。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-10-21 08:31:54 | 显示全部楼层
buxinshan 发表于 2019-10-17 15:21
有试运行的情况。情况1、如果boot引导新App之后,新App正常运行了,则置特殊标志位,之后复位,boot则设 ...

有些方法可以理解为前辈的 修正措施。mark下来,关键时候试试。
Releasing your creativity
回复

使用道具 举报

10

主题

54

回帖

84

积分

初级会员

积分
84
发表于 2019-10-21 10:05:47 | 显示全部楼层
buxinshan 发表于 2019-10-17 15:21
有试运行的情况。情况1、如果boot引导新App之后,新App正常运行了,则置特殊标志位,之后复位,boot则设 ...

看起来挺高大上的
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-10-24 08:30:33 | 显示全部楼层

昨天温故V6的“安富莱_STM32-V6开发板_软件开发手册(V1.2).pdf” 第七页

JLINK仿真器版本匹配问题
注意:如果J-Link仿真器内部固件的版本比MDK自带的J-Link驱动的版本高,可能会造成调试异常(比
如:跳出窗口报警,需要点3次才能进入等等)

或许可以理解成早期提升产品兼容性的习惯。
Releasing your creativity
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-11-24 16:22:34 | 显示全部楼层
谢谢,完美解决问题,搜到的其他的链接好多都是转来转去的,并没卵用
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-11-24 16:24:37 | 显示全部楼层
谢谢,完美解决问题,不像其他的链接,都是转来转去。特地注册个账号来表示下感谢
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-11-24 16:25:12 | 显示全部楼层
谢谢,完美解决问题,不像其他的链接,都是转来转去。特地注册个账号来表示下感谢
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
发表于 2020-11-27 15:49:00 | 显示全部楼层
eric2013 发表于 2019-10-17 15:25
实测被复位了,看我10楼的回复,你也可以实测下

硬汉哥,有备份ram的使用笔记吗?看手册就几个寄存器,但是给VBAT供电2.5V,单片机复位数据就变成垃圾值了,百度看了一些博客,寄存器设置的没啥问题,很奇怪
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2020-11-27 16:16:04 | 显示全部楼层
无关风月 发表于 2020-11-27 15:49
硬汉哥,有备份ram的使用笔记吗?看手册就几个寄存器,但是给VBAT供电2.5V,单片机复位数据就变成垃圾值 ...

H7的这个备份RAM,我测试过,复位后不行了,还没有深入查怎么回事。
回复

使用道具 举报

0

主题

30

回帖

30

积分

新手上路

积分
30
发表于 2022-11-2 15:58:01 | 显示全部楼层
按照这个方式,将APP存储数据改为32位,也不行,跳转之后还是会出现某几个地址数据改写,目前只有直接跳转是数据完整性是OK的,如果使用系统复位的话,就会出现数据改写,目前的结果就是,H7芯片如果使用系统复位,从BOOT跳转到AXI_SRAM去执行APP程序,程序是能够运行起来的,但是APP程序数据的完整性是有问题的,大家使用系统复位做跳转的时候,最好验证一下,跳转后程序数据的完整性,否则可能会出现意想不到的结果,Flash这么个玩法,不知数据完整性有没有问题,有时间了试一下,分享给大家
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2022-11-3 09:51:11 | 显示全部楼层
BruceWang 发表于 2022-11-2 15:58
按照这个方式,将APP存储数据改为32位,也不行,跳转之后还是会出现某几个地址数据改写,目前只有直接跳转 ...

这个玩法只能保证跳转前后你定义的这个全局变量没问题,这个也是这个例子的核心,不能保证你的其它RAM空间数据没有丢失。这个是此贴例子的关键点,而你现在的玩法是整个RAM空间不想丢失,此时有个超简单的思路,你重新复制到RAM不就行了。这又不是Flash,还得需要编程。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 6 天前 | 显示全部楼层
感谢硬汉!!确实是这个问题,定义成32bit的数据后,软复位后就不会被改变了,一直以为是MDK初始化导致的,但是确实在SCT中设置了UNINIT属性
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 03:52 , Processed in 0.321197 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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