✅ 解决方案(推荐做法) ✅ 1. M4 侧 DTS 中不要写死 PLL 参数 你应该移除 M4 DTS 中所有与 PLL2 相关的配置 ,只保留对 SDMMC2 的 clocks = <&rcc STM32_CLOCK_BUS_SDMMC2 ...> 的引用,不要指定频率 。 &sdmmc2 { clocks = <&rcc STM32_CLOCK_BUS_SDMMC2 0xXXXXXXXX>; status = "okay"; /* 不要写 clock-frequency = <48000000>; 或其他频率 */ }; ✅ 2. 使用 clock-control API 动态获取时钟频率 Zephyr 提供了 clock_control_get_rate() API,你可以在 SDMMC 驱动初始化前调用它,动态获取 SDMMC 域的实际时钟频率 ,而不是依赖 DTS 写死值。 示例代码(在 SDMMC 驱动初始化前): `` include <zephyr/drivers/clock_control.h> include <zephyr/drivers/clock_control/stm32_clock_control.h> const struct device *clk_dev = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE); uint32_t clk_rate; clock_control_get_rate(clk_dev, (clock_control_subsys_t)&sdmmc2_clk_cfg, &clk_rate); LOG_INF("SDMMC2 domain clock rate: %u Hz", clk_rate); sdmmc2_clk_cfg 是你在驱动中定义的 struct stm32_pclken 变量,对应 SDMMC2 的时钟域。 ✅ 3. 修改 SDMMC 驱动以使用实际时钟频率 Zephyr 的 stm32_sdmmc 驱动默认会尝试根据 DTS 中的 clock-frequency 来配置 SDMMC 的时钟分频器。 你需要补丁驱动 ,让它使用 clock_control_get_rate() 获取的实际频率,而不是 DTS 写死值。 ✅ 4. 补丁建议(Zephyr 驱动层) 在 drivers/sdmmc/stm32_sdmmc.c 中,找到 sdmmc_clock_init() 函数,修改如下: uint32_t clk_rate; clock_control_get_rate(dev_data->clock_dev, (clock_control_subsys_t)&dev_config->pclken, &clk_rate); /* 用 clk_rate 而不是 DTS 中的 clock-frequency */ ✅ 5. 额外建议:M7 启动完成后通知 M4 你可以在 M7 的 Zephyr 应用中,等 PLL2 配置完成后再启动 M4 核 ,确保 M4 启动时时钟已稳定。 ✅ 6. 参考 Zephyr 社区讨论 你提到的 GitHub 讨论 zephyrproject-rtos/zephyr#100423 中,已有开发者提出类似问题 ,并最终通过: 移除 M4 DTS 中的 PLL 配置 使用 clock_control_get_rate() 动态获取频率 补丁 SDMMC 驱动
所在话题
参与活动
-
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16



