云琴箫龙 发表于 2021-5-4 00:14:43

H743+SDRAM时SDRAM初始化函数该放在何处?

之前在F429平台上跑SDRAM从没遇到过什么大问题,最近调试H743+SDRAM时,在论坛里看到H7下初始化SDRAM的函数放置位置有别于F4,因此我最开始在H7在走完FMC初始化后就调用了SDRAM初始化函数。
SDRAM查考的V7的例程改的,单独调试SDRAM没有问题,用的32M的SDRAM,SDRAM初始化后会再校验一遍,方式是把32M的空间连续写一遍再读一遍,校验数据是否都正确,因此觉得SDRAM驱动应该没啥大问题。
遇到的怪异现象是这样的,主程序里面在SDRAM初始化后再新增一个函数,哪怕是个空函数,都会导致前面的SDRAM初始化失败,仿真发现SDRAM空间的数据都变成了AA,导致SDRAM初始化后的一运行校验就会进入错误中断。
于是索性将 HAL_Init();SystemClock_Config();MX_FMC_Init();这三个函数直接放在SystemInit里面(SDRAM序列初始化是在MX_FMC_Init最后调用),发现程序可以正常运行起来,但仿真发现SDRAM空间都是0,写不进去任何数据,但至少不会触发错误中断了。
经过各种尝试,我认为问题点不在于后面增加了什么函数(因为增加的函数跟SDRAM没有任何关系),而在于SDRAM初始化函数放置的位置还是不太对。
请教硬汉哥可有遇到过此类诡异的想象?是否有何良策?


eric2013 发表于 2021-5-4 10:14:20

楼主说的是那种情况,仅仅是初始化SDRAM的函数位置吗,还在之前说的下面这种玩法

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98697&fromuid=58
(出处: 硬汉嵌入式论坛)

云琴箫龙 发表于 2021-5-4 10:38:28

eric2013 发表于 2021-5-4 10:14
楼主说的是那种情况,仅仅是初始化SDRAM的函数位置吗,还在之前说的下面这种玩法

像使用内部SRAM一样定 ...

应该仅仅是初始化函数放置的位置,驱动是仿照你的改的,把其它所有的函数都屏蔽掉单独测试SDRAM是没问题的,但后面添加一个无关紧要的函数就会造成SDRAM初始化失败(全部为AA),这个问题困扰一周了也想不明白。在这篇帖子里你提到过H7下SDRAM初始化函数放置位置的问题,感觉应该跟他是一个问题。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95019&highlight=W25Q256


eric2013 发表于 2021-5-4 10:46:21

云琴箫龙 发表于 2021-5-4 10:38
应该仅仅是初始化函数放置的位置,驱动是仿照你的改的,把其它所有的函数都屏蔽掉单独测试SDRAM是没问题 ...

不是这个意思,我的意思是你楼主位要实现的应用是不是我二楼说的那种玩法,直接定义SDRAM的全局变量。

另外你三楼帖子的这个是我2019年发的,那个时候我还仅仅是简单测试了下,不能使用,后来才有了2020年发的那个。要特别设置下才可以的。

关键就在这里:


云琴箫龙 发表于 2021-5-4 11:33:56

eric2013 发表于 2021-5-4 10:46
不是这个意思,我的意思是你楼主位要实现的应用是不是我二楼说的那种玩法,直接定义SDRAM的全局变量。
...

是的,就是直接定义SDRAM的全局变量,我的就是参考的这个最新的例子,sct文件如下。

直接定义到SDRAM中我做了一个宏定义 #define SDRAM __attribute__((section (".RAM_SDRAM"),zero_init))   /*外部SDRAM 32M   */然后在主程序里直接这样定义SDRAM uint8_t SysBuf;单独测试它是没问题的。

刚才又尝试了其它几种方法,发现可能导致SDRAM初始化莫名失败的问题所在了,但不明白为什么会这样,更不知道有什么好的解决方案。
我的主程序原来是在BANK2中运行的,BANK1中跑的是BOOT程序。进入主程序后在HAL_MspInit中重新设置了一下中断向量表。直接这样测试SDRAM是没问题的,但再添加其它无关紧要的函数就不行,SDRAM莫名的初始化失败。
刚才试着把BOOT程序去掉,把主程序直接定义到BANK1中起始位置,发现程序竟然可以正常运行了,再改回BANK2中依然不行。
难道主程序在BANK2中运行,除了设置中断向量表之外还需要设置什么跟SDRAM有关的东西吗?

云琴箫龙 发表于 2021-5-4 11:39:03


eric2013 发表于 2021-5-5 08:59:19

云琴箫龙 发表于 2021-5-4 11:33
是的,就是直接定义SDRAM的全局变量,我的就是参考的这个最新的例子,sct文件如下。

直接定义到SDRAM ...

这个得专门测试下,估计有地方需要特别设置下。

iihj 发表于 2024-4-14 14:40:50

云琴箫龙 发表于 2021-5-4 11:39


老哥你现在有这个问题的解决思路吗?我现在也是不知道为什么在初始化外部SDRAM之后依然无法使用其中的地址
页: [1]
查看完整版本: H743+SDRAM时SDRAM初始化函数该放在何处?