问题:配置的FMC时钟时,会配置失败?
【问题:配置STM32H750的FMC时钟时,会配置失败?】这个问题我是怎么发现的呢?首先我一般的风格不会使用while(1)这种等待的,一般会选择加入超时机制来保证系统的正常运行 。但是在我移植野火的的SDRAM的程序的时候,我发现程序停留在()里面的while(1)中 。
关于这个问题,先看的时钟树:
这是我的时钟相关配置,理论上是没问题,也没有达到最高频率 。
从野火的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时钟参数配置失败 。
文章插图
从新回到的时钟树上!有一个我们不太看得到的点!
没错就是这里,本来在程序上应该配置的是PLL2R这个地方的时钟,用这个地方的时钟输出到FMC上,但是却是默认选择HCLK3,所以,这就是导致为什么PLL2初始化一直失败的原因!这时候将它选中PLL2Q,
将会和预期的一样,得到的时钟 。通过生成工程,后添加相关驱动文件,发现SDRAM的初始化不会再卡住了 。这时候,我们比对两个工程的(),就很容易发现多了一句话,
没错,就是因为这里的选择问题,FMC的时钟源,必须选择2的时候,才能对PLL2的配置生效,否则配置将ERROR 。这问题搞了我一晚上,真不应该啊!
- AC与AP的IPv6功能介绍和配置实例
- verilog时钟问题
- 系统常见问题解决方案
- Vm安装虚拟机出现Vmware此主机不支持64位客户机操作系统问题
- EmpireCMS php写入配置文件getshell,帝国CMS v7
- windows 从零配置深度学习环境
- 没有打印日志时,排查生产问题,怎么办?
- STM32学习笔记 | 片内FLASH读写失败问题分析
- 身份鉴别——Linux配置登录失败处理功能
- 利用Dockerfile构建镜像时无法从互联网下载package的问题解决方法