有没有好用的日志系统推荐
全球论坛无法登录
简单平稳过度-回顾2025&说说我心中的ST中文论坛
我最近在用stm32f407做CAN通讯的回环+静默,但是现在显示可以成功发送数据,FIFO接收不到数据,这是什么原因啊
CubeAI如何加载caffe模型
stm32f407的adc采样不稳?
STM32F407VET6 能适配哪些FATFS版本文件
stm32 定时器外部时钟1的TI1FP1及TI2FP2的设置问题
STM32F1定时器中触发信号TRC的来源及选择配置是怎么样的
无刷电机PWM输出配置
微信公众号
手机版
我们可以先计算输出SDIOCLK,再根据自己拟定的SDIO时钟分频系数
计数出SDIO_CK的频率。在ST的手册和代码里,分频系数多以ClockDiv 标记。
SDIOCLK通过PLL生成,涉及到PLLM、PLLN、PLLP和PLLQ参数,可以计算出SDIOCLK的频率。
上面的这些参数一般来说配置好后就固定了,最后一步得到的就是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 输出信号,不进行分频。
你好
现在这么来写
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
如何改呢?
谢谢
如果你通过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时钟。