eric2013 发表于 2019-10-3 00:51:54

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

1、为什么要保持原有数:

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

2、问题

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

3、最终解决方案

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


其中ptr,ptr,ptr1,ptr2,ptr3,ptr4要配置MPU属性为WT

比如SRAM1      MPU_InitStruct.Enable         = MPU_REGION_ENABLE;
      MPU_InitStruct.BaseAddress      = 0x30000000;
      MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;
      MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
      MPU_InitStruct.IsBufferable   = MPU_ACCESS_NOT_BUFFERABLE;
      MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
      MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
      MPU_InitStruct.Number         = MPU_REGION_NUMBER2;
      MPU_InitStruct.TypeExtField   = MPU_TEX_LEVEL0;
      MPU_InitStruct.SubRegionDisable = 0x00;
      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();
               
这样定义后,就没有问题了,用户使用软件复位,这些数据也不会变了。

static/image/hrline/4.gif

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

eric2013 发表于 2019-10-3 00:56:27

软件复位反应在硬件上就是发了一个信号给硬件复位端


硬件:
https://img.anfulai.cn/dz/attachment/forum/201807/14/170754cmvvt3a1z192qtq4.png

软件API:
https://img.anfulai.cn/dz/attachment/forum/201807/14/170940swe6gwx13vvre69t.png

myxiaonia 发表于 2019-10-3 21:39:52

内存数据清0,我记得是连接脚本指定的,貌似m3是这样?

eric2013 发表于 2019-10-4 11:57:15

myxiaonia 发表于 2019-10-3 21:39
内存数据清0,我记得是连接脚本指定的,貌似m3是这样?

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

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

http://www.armbbs.cn/forum.php?mod=viewthread&tid=95214&extra=page%3D1

廷润 发表于 2019-10-8 08:19:32

Eric, 有没有碰到过一些项目的软件,开机让机子重启两遍再运行的习惯?这样我很不理解,有些说法是避免概率性一次启动不成功的情况。

buxinshan 发表于 2019-10-17 13:22:52

我不认同您这种NoInit方式,这种操作带来了不确定性。借助备份SRAM或者Flash也是可以达到目的的。

eric2013 发表于 2019-10-17 14:26:41

廷润 发表于 2019-10-8 08:19
Eric, 有没有碰到过一些项目的软件,开机让机子重启两遍再运行的习惯?这样我很不理解,有些说法是避免概 ...

这个还真没

eric2013 发表于 2019-10-17 14:29:35

buxinshan 发表于 2019-10-17 13:22
我不认同您这种NoInit方式,这种操作带来了不确定性。借助备份SRAM或者Flash也是可以达到目的的。

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

buxinshan 发表于 2019-10-17 15:03:28

eric2013 发表于 2019-10-17 14:29
H7的扇区太大,像H750,只有一个128KB。备份RAM没有外部的电池跟其它RAM没啥区别

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

eric2013 发表于 2019-10-17 15:07:21

buxinshan 发表于 2019-10-17 15:03
想您所说,H7的Flash还是豪。后备SRAM在SoftReset的情况怎么可能复位呢。
实测没区别,略坑。
这就是我这个贴子为什么唯独没有把这个备份ram加上,理论上不复位才正常。

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

buxinshan 发表于 2019-10-17 15:09:14

eric2013 发表于 2019-10-17 14:29
H7的扇区太大,像H750,只有一个128KB。备份RAM没有外部的电池跟其它RAM没啥区别

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

buxinshan 发表于 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。

eric2013 发表于 2019-10-17 15:25:56

buxinshan 发表于 2019-10-17 15:09
刚才那条回复,还没编辑完,回车就完成并提交了,我只想多行编辑啊。还是点击下面“参与回复主题”才提交 ...

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

buxinshan 发表于 2019-10-17 15:31:15

eric2013 发表于 2019-10-17 15:25
实测被复位了,看我10楼的回复,你也可以实测下

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

eric2013 发表于 2019-10-17 15:39:44

buxinshan 发表于 2019-10-17 15:31
RTC的32Word呢?也复位了?我没测试哦,V7板子在家。

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

廷润 发表于 2019-10-21 08:31:54

buxinshan 发表于 2019-10-17 15:21
有试运行的情况。情况1、如果boot引导新App之后,新App正常运行了,则置特殊标志位,之后复位,boot则设 ...

有些方法可以理解为前辈的 修正措施。mark下来,关键时候试试。:)

yijinxiaoyou 发表于 2019-10-21 10:05:47

buxinshan 发表于 2019-10-17 15:21
有试运行的情况。情况1、如果boot引导新App之后,新App正常运行了,则置特殊标志位,之后复位,boot则设 ...

看起来挺高大上的

廷润 发表于 2019-10-24 08:30:33

eric2013 发表于 2019-10-17 14:26
这个还真没

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

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

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

forrest 发表于 2020-11-24 16:22:34

谢谢,完美解决问题,搜到的其他的链接好多都是转来转去的,并没卵用

forrest 发表于 2020-11-24 16:24:37

谢谢,完美解决问题,不像其他的链接,都是转来转去。特地注册个账号来表示下感谢

forrest 发表于 2020-11-24 16:25:12

谢谢,完美解决问题,不像其他的链接,都是转来转去。特地注册个账号来表示下感谢

无关风月 发表于 2020-11-27 15:49:00

eric2013 发表于 2019-10-17 15:25
实测被复位了,看我10楼的回复,你也可以实测下

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

eric2013 发表于 2020-11-27 16:16:04

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

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

BruceWang 发表于 2022-11-2 15:58:01

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

eric2013 发表于 2022-11-3 09:51:11

BruceWang 发表于 2022-11-2 15:58
按照这个方式,将APP存储数据改为32位,也不行,跳转之后还是会出现某几个地址数据改写,目前只有直接跳转 ...

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

Yhlr 发表于 2024-4-24 10:29:30

感谢硬汉!!确实是这个问题,定义成32bit的数据后,软复位后就不会被改变了,一直以为是MDK初始化导致的,但是确实在SCT中设置了UNINIT属性
页: [1]
查看完整版本: STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)