
串口重定向接收不同
经过光耦之后,脉冲计数功能为啥不能实现?
STM32F407 ADC Dual regular simultaneous only 模式下最高采样率仅 96 kHz,960 kHz 无法工作,求助!
STM32 F407骄阳电机版用DMA双缓存接收串口数据时,上电第一次接收区是memory1而不是memory0?
STM32F407骄阳版用DMA双缓存区接收串口数据,上电第一次接收到的数据在memory1而不是memory0
stm32f407无法配置定时器2为全部dma
FreeRTOS问题求解
使用stm32F407连接PHY芯片进行以太网通讯,一插网线就会进入错误中断。
ST的IMU和地磁计用motionfx库融合后航向角异常的问题
CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转。
我们可以先计算输出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时钟。