
请教为什么中断回调函数中不能使用接收中断开启函数
bootloader占用的flash起始地址一般在哪,从0x08000000地址开始的flash能够被用户使用吗
如何使用window程序对控制参数进行调整。
PWM+DMA求助
STM32中比较适合做FOC控制的芯片
当有一外部信号(上升和下降沿触发),用timer计测脉冲间隔的问题,要给采用那种触发:ITRx、Gate、还是其它那种方式最好,响应最快,谢谢
ST的IMU和地磁计用motionfx库融合后航向角异常的问题
请问一下,F4硬件开发手册有最新版本吗?
stm32f407VGT6用freertos库一直进hardfault循环
stm32cubeide 中文乱码能解决吗
我们可以先计算输出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时钟。