STM32H750的FMC时钟问题

问题:配置STM32H750的FMC时钟时,会配置失败?

这个问题我是怎么发现的呢?首先我一般的风格不会使用while(1)这种等待的,一般会选择加入超时机制来保证系统的正常运行。但是在我移植野火的STM32H750的SDRAM的程序的时候,我发现程序停留在SDRAM_Init()里面的while(1)中。
关于这个问题,先看STM32H750的时钟树:
在这里插入图片描述
这是我的时钟相关配置,理论上是没问题,也没有达到最高频率480MHz。
从野火的FMC的时钟配置来看,

  RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FMC;
  RCC_PeriphClkInit.PLL2.PLL2M = 5;
  RCC_PeriphClkInit.PLL2.PLL2N = 144;
  RCC_PeriphClkInit.PLL2.PLL2P = 2;
  RCC_PeriphClkInit.PLL2.PLL2Q = 2;
  RCC_PeriphClkInit.PLL2.PLL2R = 3;
  RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
  RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
  RCC_PeriphClkInit.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;

配置的是PLL2的时钟参数,这看上去貌似也没什么问题。但为什么会PLL2的时钟初始化失败呢?
首先找原因:
1、是不是晶振坏了?
2、是不是系统时钟哪里写错了?
3、是不是FMC时钟初始化在代码中的位置不对?

经过一系列排查,发现都是没问题的,并没有解决的实际问题。任然是初始化SDRAM的时候卡在while(1)中,也就是FMC时钟参数配置失败。

从新回到STM32H7的时钟树上!有一个我们不太看得到的点!
在这里插入图片描述
没错就是这里,本来在程序上应该配置的是PLL2R这个地方的时钟,用这个地方的时钟输出到FMC上,但是却是默认选择HCLK3,所以,这就是导致为什么PLL2初始化一直失败的原因!这时候将它选中PLL2Q,
在这里插入图片描述
将会和预期的一样,得到360MHz的时钟。通过STM32CubeMX生成工程,后添加相关驱动文件,发现SDRAM的初始化不会再卡住了。这时候,我们比对两个工程的SystemClock_Config(),就很容易发现多了一句话,
在这里插入图片描述
没错,就是因为这里的选择问题,FMC的时钟源,必须选择RCC_FMCCLKSOURCE_PLL2的时候,才能对PLL2的配置生效,否则配置将ERROR。这问题搞了我一晚上,真不应该啊!

发布了45 篇原创文章 · 获赞 52 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42312125/article/details/102982029