硬汉嵌入式论坛

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

[SDRAM] STM32H7 SDRAM启动的坑

[复制链接]

21

主题

66

回帖

129

积分

初级会员

积分
129
发表于 2022-6-11 12:57:31 | 显示全部楼层 |阅读模式
       最近在尝试将程序转移到SDRAM来运行,发现有一些坑,分享给大家:

1.bootloader将程序搬运到SDRAM并跳转后发现SDRAM所有数据都变成AA.调试后发现问题是在新版本驱动中SystemInit()存在禁用FMC的代码

[C] 纯文本查看 复制代码
void SystemInit (void)
{
#if defined (DATA_IN_D2_SRAM)
 __IO uint32_t tmpreg;
#endif /* DATA_IN_D2_SRAM */

  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));  /* set CP10 and CP11 Full Access */
  #endif
  /* Reset the RCC clock configuration to the default reset state ------------*/
....

#if defined(DUAL_CORE) && defined(CORE_CM4)
  /* Configure the Vector Table location add offset address for cortex-M4 ------------------*/
#if defined(USER_VECT_TAB_ADDRESS)
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D2 AXI-RAM or in Internal FLASH */
#endif /* USER_VECT_TAB_ADDRESS */

#else

  /*
   * Disable the FMC bank1 (enabled after reset).
   * This, prevents CPU speculation access on this bank which blocks the use of FMC during
   * 24us. During this time the others FMC master (such as LTDC) cannot use it!
   */
  FMC_Bank1_R->BTCR[0] = 0x000030D2;  //此处会禁用FMC,到时SDRAM,必须注释掉才能SDRAM启动

  /* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM or in Internal FLASH */
#endif /* USER_VECT_TAB_ADDRESS */

#endif /*DUAL_CORE && CORE_CM4*/

}


2.如果希望SystemInit()来帮自己设置中断向量的位置,需要设定宏定义USER_VECT_TAB_ADDRESS=0xD0000000U,这个是和以前不同的

3.官方的ExtMem_CodeExecution范例程序里面,其实在SystemInit()是有一个SystemInit_ExtMemCtl(),提前初始化SDRAM,这样是可以解决__main()无法将RW和RO数据释放到SDRAM的问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2022-6-11 16:06:22 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

218

主题

1107

回帖

1771

积分

至尊会员

More we do, more we can do.

积分
1771
发表于 2022-6-11 23:17:16 | 显示全部楼层
如楼主所说,确实,C启动代码Execution region的加载是核心。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-1-25 16:36:47 | 显示全部楼层
感谢老哥,卡了三天的问题,终于解决了
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-3-3 12:40:39 来自手机 | 显示全部楼层
zff0414 发表于 2024-1-25 16:36
感谢老哥,卡了三天的问题,终于解决了

你好,请问一下你具体是怎么解决了的吗,我也找到这个问题了,现在还在想用什么方案去解决?头疼
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-3-3 15:29:30 | 显示全部楼层
zff0414 发表于 2024-1-25 16:36
感谢老哥,卡了三天的问题,终于解决了

现在就是发现我这没有SystemInit_ExtMemCtl()这函数,感觉没办法解决了,注释掉也不行,用硬汉哥的方法也会进硬错误中断,感觉就是要用这个函数在进入main前初始化SDRAM来解决了,但是我这没有啊
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-6-27 16:28:38 | 显示全部楼层
我现在也是在bootloader里面把spiflash的镜像写到SDRAM里面去,但是跳转不成功是是什么原因呢? 有源码可以参考下吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2025-6-28 09:58:45 | 显示全部楼层
zhuzhiyuan 发表于 2025-6-27 16:28
我现在也是在bootloader里面把spiflash的镜像写到SDRAM里面去,但是跳转不成功是是什么原因呢? 有源码可以 ...

可以参考这个例子
STM32H750在QSPI Flash,SDRAM,NOR Flash等外部存储介质运行程序的配套例程说明以及跑分测试
https://www.armbbs.cn/forum.php? ... 9720&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 6 天前 | 显示全部楼层
我就是按照这个例程来的还是跳不过去,我想问下这个对硬件的那个boot管脚有没有拉高拉低的要求啊?之前的默认从片内flash读取镜像启动的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 12:23 , Processed in 0.280243 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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