硬汉嵌入式论坛

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

[SRAM] STM32H7使用MDK或IAR将D2域SRAM1做主RAM空间会在分散加载启动阶段硬件异常(已经解决,8楼附C方案,14楼附汇编方案)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-4-28 00:57:58 | 显示全部楼层 |阅读模式
做主RAM空间

image.png


image.png
跳转到这里卡死:

image.png

尝试过在SystemInit里面就使能SRAM时钟和MPU配置,依然不行

待后面有时间再查查。

错误类型说明:
image.png



回复

使用道具 举报

4

主题

42

回帖

54

积分

初级会员

积分
54
发表于 2022-4-28 01:57:30 来自手机 | 显示全部楼层
这个问题我也很早就发现了,猜想一下原因:看H743的芯片框图,SRAM1-3没有挂在cpu的总线上,而AXIRAM,IRAM,DRAM都是挂在cpu总线上的,所以它们都可以启动并运行程序,而SRAM1-3都不可以,感觉SRAM硬件逻辑上像是一个外设。
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-28 08:00:54 | 显示全部楼层
image.png

image.png

image.png


需要配置使能
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-4-28 09:26:35 | 显示全部楼层

没用,这个问题2019年时就把坑踩出来了,那个时候还没有DATA_IN_D2_SRAM。楼主位特地加上下面这句话就是这个意思。

尝试过在SystemInit里面就使能SRAM时钟和MPU配置,依然不行

STM32H7的D2域SRAM使用注意事项
https://www.armbbs.cn/forum.php? ... id=94833&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-28 09:35:48 | 显示全部楼层
image.png

这个问题也好解释,上电在调用   LDR     R0, =SystemInit    这条语句的时候就已经开始使用堆栈了,这个时候 SRAM并没有使能,需要先用汇编指令先把这个SRAM使能,才能调用  SystemInit 函数  

进入debug状态,可以看一下 MSP 指针位置,已经分配到 未使能的区域去了,只要有PUSH指令就会挂  
image.png
image.png
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-28 09:37:54 | 显示全部楼层
image.png

可以参见汇编代码 理解
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-4-28 10:04:11 | 显示全部楼层
heluo1985 发表于 2022-4-28 09:37
可以参见汇编代码 理解

厉害了,兄弟,就是这个问题,push的时候不会挂,pop lr的时候会挂

我简单改了下,继续使用HAL的API,无需定义DATA_IN_D2_SRAM。
[C] 纯文本查看 复制代码
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler                    [WEAK]
                                 IMPORT  SystemInit
                                 IMPORT  __main
                                 IMPORT  __HAL_RCC_D2SRAM1_CLK_ENABLE1        


                                 LDR     R0, = __HAL_RCC_D2SRAM1_CLK_ENABLE1
                                 BLX     R0
                                 
                 LDR     R0, = SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


宏定义没法IMPORT,我直接定义了个函数,跟HAL库的是一样的,仅仅换了个名字。

[C] 纯文本查看 复制代码
void __HAL_RCC_D2SRAM1_CLK_ENABLE1(void)   
{
    SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM1EN);
    READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM1EN);
} 





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-4-28 10:25:46 | 显示全部楼层
heluo1985 发表于 2022-4-28 09:37
可以参见汇编代码 理解

彻底解决了,修改汇编不方便用户操作,不使用官方的DATA_IN_D2_SRAM定义,也不直接在里面调用下面几个函数,这几个函数里面有局部变量(虽然没啥用,但是pop lr出错了)。

__HAL_RCC_D2SRAM1_CLK_ENABLE();
__HAL_RCC_D2SRAM2_CLK_ENABLE();
__HAL_RCC_D2SRAM3_CLK_ENABLE();

手动添加这三组函数到SystemInit末尾即可,简单省事。
[C] 纯文本查看 复制代码
 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM1EN);
    READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM1EN);

    SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM2EN);
    READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM2EN);
    
    SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM3EN);
    READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_D2SRAM3EN);


image.png




回复

使用道具 举报

0

主题

31

回帖

31

积分

新手上路

积分
31
发表于 2022-4-28 11:19:03 | 显示全部楼层
高手,膜拜大佬
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-28 11:39:39 | 显示全部楼层
eric2013 发表于 2022-4-28 10:25
彻底解决了,修改汇编不方便用户操作,不使用官方的DATA_IN_D2_SRAM定义,也不直接在里面调用下面几个函 ...

这种方法还是由风险的,编译选项 优化等级 可能都有影响,依照效率分配的方案,这三块就不适合用来做堆栈,ITCM DTCM AXI 都可以,我也是最近研究 RAM-ECC 检测才发现这里面的配置,ST的安全库STL 以及 RAM-ECC,以及 操作系统的非特权等级,基本上把底层研究个差不多了,耗费了大概一周的时间
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-4-28 11:53:27 | 显示全部楼层
heluo1985 发表于 2022-4-28 11:39
这种方法还是由风险的,编译选项 优化等级 可能都有影响,依照效率分配的方案,这三块就不适合用来做堆栈 ...

已经全部测试了,IAR和MDK AC6 AC5所有优化等级下,只要函数SystemInit里面没有局部变量,他们是不会做push lr操作的,类似内联方式直接调用的。
没有局部变量,函数跳转还做push lr属于多余操作,如果编译器不能识别出这个,是编译器有点low了。


回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-28 12:01:40 | 显示全部楼层
eric2013 发表于 2022-4-28 11:53
已经全部测试了,IAR和MDK AC6 AC5所有优化等级下,只要函数SystemInit里面没有局部变量,他们是不会做pu ...

     这个我倒是没有测试优化等级,很多底层也是参考了你的教程   
回复

使用道具 举报

4

主题

42

回帖

54

积分

初级会员

积分
54
发表于 2022-4-28 14:41:17 | 显示全部楼层
厉害啊!两位都是真正的高手,大赞!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2022-4-28 14:59:01 | 显示全部楼层
做了个汇编方式的,加在如下位置即可

[C] 纯文本查看 复制代码
      ;使能D2SRAM1,D2SRAM2,D2SRAM3
LDR     r0, =0x580244DC                         
LDR     r1, [r0]                                
ORR     r1, r1, #0xE0000000                     
STR     r1, [r0]   


image.png


回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-4-29 09:39:31 | 显示全部楼层
eric2013 发表于 2022-4-28 14:59
做了个汇编方式的,加在如下位置即可

[mw_shl_code=c,true]      ;使能D2SRAM1,D2SRAM2,D2SRAM3

  嗯嗯  这个方案可以彻底解决问题
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

666

积分
9
QQ
发表于 2022-5-3 22:12:59 | 显示全部楼层
太精彩了!
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

666

积分
9
QQ
发表于 2022-5-3 22:13:51 | 显示全部楼层
heluo1985 发表于 2022-4-28 11:39
这种方法还是由风险的,编译选项 优化等级 可能都有影响,依照效率分配的方案,这三块就不适合用来做堆栈 ...

大佬,RAM-ECC这部分,有没有资料可以共享下呢?
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-5-5 09:28:16 | 显示全部楼层
guohongguang 发表于 2022-5-3 22:13
大佬,RAM-ECC这部分,有没有资料可以共享下呢?

主要 参阅  AN5342  这个文档
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-11-9 19:54:24 | 显示全部楼层
eric2013 发表于 2022-4-28 14:59
做了个汇编方式的,加在如下位置即可

[mw_shl_code=c,true]      ;使能D2SRAM1,D2SRAM2,D2SRAM3

在cubeide上如何修改呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2023-11-10 08:31:53 | 显示全部楼层
jinlei_wang 发表于 2023-11-9 19:54
在cubeide上如何修改呢

仅做了个MDK方式的,注意在systeminit里面初始化不行,前面还有一段C库初始化,系统初始化之类的函数,要在复位中断复位程序里面就搞才可以,CubeIDE方式的你试试,实现不行,先加个前缀const,存到内部Flash,待D2时钟初始化后,再复制到D2 RAM
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2024-1-25 16:39:07 | 显示全部楼层
mark一下,一直对这个D2域的SRAM有困惑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 06:14 , Processed in 0.248894 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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