STM32F405rgt6 I2S DMA输入会造成卡死,这个芯片有BUG
USBX在F407上创建CDC不能正常使用
STM32F427ZGTx内部RTC秒及亚秒同步问题
有没有STM32F405RG参考设计
LSM6DS3TR-C静止情况下使用MotionFX固件算出的欧拉角周期性异常跳动
全球论坛无法登录
STM32F429使用FMC接口扩展SDRAM
用STM32F407做U盘拖拽升级,目前BootLoader和实现U盘,后面就不知道怎么操作了。
STM32上电后会多次进入所有打开的定时器回调函数中,如何避免这样的情况?
STM32F427VIT6这款芯片所支持的摄像头模组的列表有不?
微信公众号
手机版
我们可以先计算输出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时钟。