你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f4系列sdio 时钟如何获取

[复制链接]
asn111 提问时间:2025-2-20 14:02 / 未解决

stm32f4系列sdio 时钟如何获取,stm32h7可以通过sdmmc_clk=HAL_RCCEx_GetPeriphCLKFreq(STM32_RCC_PERIPHCLK_SDMMC);这个函数获取 stm32f4 sdio时钟如何获取通过什么函数

谢谢

收藏 评论3 发布时间:2025-2-20 14:02

举报

3个回答
xmshao 回答时间:2025-2-21 09:54:01
对于STM32F4系列库函数可能没法这么得到,要自己组织下代码获取。下面以STM32F407为例。


我们可以先计算输出SDIOCLK,再根据自己拟定的SDIO时钟分频系数
计数出SDIO_CK的频率。在ST的手册和代码里,分频系数多以ClockDiv 标记。


SDIOCLK通过PLL生成,涉及到PLLM、PLLN、PLLP和PLLQ参数,可以计算出SDIOCLK的频率。

rrr.png



上面的这些参数一般来说配置好后就固定了,最后一步得到的就是SDIOCLK时钟。


自己可以写几行代码完成得到SDIOCLK时钟。你也可以通过调用HAL_RCC_GetSysClockFreq(void)来获取pllvco后
再除以PLLQ后得到。


根据SDIOCLK和时钟分频器的配置 可以计算SDIO_CK的频率。


SDIO_CK的频率就等于SDIOCLK频率除以(ClockDiv + 2)。


ClockDiv 系数我们自行设置, 在CubeMx配置那里就有这个选项。
在库代码里以hsd.Init.ClockDiv来定义。分频系数最终体现在寄存器SDIO_CLKCR的低8位。
该分频系数在对SD卡初始化和正式数据通信时可能设置不同值。




假设在cubeMx时钟树配置那里有这样的配置:
1.   :内部高速时钟 HSI RC,频率16 MHz,作为PLL 的输入时钟源
2.    PLLM: 预分频值为8。
3.    PLLN: 倍频器值为168。
4.    PLLP: 主PLL分频值为2。
5.    PLLQ: 用于SDIO、USB OTG FS和RNG的分频器,值为7。


基于上面配置,我们可以得到SDIOCLLK为48MHz.


假如你配置的分频系数ClockDiv 为0,则SDIO_CK的频率就是24MHz。


顺便提醒下,针对SDIO_CK时钟有个分频旁路选择,即上面寄存器SDIO_CLKCR中的Bypass位所控制的。


当 BYPASS = 0 时,SDIOCLK 会根据CLKDIV 值进行分频,然后驱动 SDIO_CK 输出信号。分频有效,SDIO_CK 的
频率由 SDIOCLK 和 CLKDIV 共同决定。


当 BYPASS = 1 时,SDIOCLK 直接驱动 SDIO_CK 输出信号,不进行分频。
rrr.png
asn111 回答时间:2025-2-25 17:53:24

xmshao 发表于 2025-2-21 09:54
对于STM32F4系列库函数可能没法这么得到,要自己组织下代码获取。下面以STM32F407为例。</p>
<p>

你好

现在这么来写

sdmmc_clk = HAL_RCC_GetPCLK2Freq();

obj->hsd->Init.ClockDiv = _stm32_safe_divide(sdmmc_clk, 2U * _CYHAL_SDIO_400KHZ);

然后sdmmc_clk = HAL_RCC_GetPCLK2Freq() / (2U * obj->hsd->Init.ClockDiv); 得到的不是400k 扫卡需要400k

如何改呢?

谢谢

xmshao 回答时间:2025-2-26 09:50:01
当PLL的N M Q那几个参数和时钟源定了后,SDIOCLK也就定了,SDIO_CK就由那个分频系数决定。


如果你通过CUBEMX创建的基于HAL库的工程,工程里有个HAL_SD_InitCard(SD_HandleTypeDef *hsd)函数,你可以参考下。


扫卡时它是按照下面参数来的配置,包括设置SDIO_CK到400KHz。


uint32_t errorstate;
  HAL_StatusTypeDef status;
  SD_InitTypeDef Init;

  /* Default SDIO peripheral configuration for SD card initialization */
  Init.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
  Init.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
  Init.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
  Init.BusWide             = SDIO_BUS_WIDE_1B;//!!!
  Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  Init.ClockDiv            = SDIO_INIT_CLK_DIV;//!!


  /* Initialize SDIO peripheral interface with default configuration */
  status = SDIO_Init(hsd->Instance, Init);
。。。。。。
它这里的SDIO_INIT_CLK_DIV就是为了得到初始化时需要的400KHz来拟定的分频系数。


卡初始化成功后,可以再调整那个ClockDiv参数,写法跟上面差不多,数据线往往会变成4根了。


其实,你直接针对SDIO->CLKCR寄存器修改相关字段也应该可以改变SDIO_CK时钟。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版