你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[ZEPHYR]SDMMC2 Clock Initialization Failure on M4 Core (PLL2R Frequency Mismatch) 問題詢問

[复制链接]
JJ WangHM 提问时间:2025-12-4 09:36 / 未解决

[ZEPHYR]SDMMC2 Clock Initialization Failure on M4 Core (PLL2R Frequency Mismatch) 問題詢問

問題背景說明 我目前在 STM32H747I-DISCO(Zephyr RTOS)上,嘗試在 Cortex-M4 啟用 SDMMC2。 專案基於標準範例 rpmsg_service,採用 M7/M4 雙核心架構。 在 SDMMC2 driver 初始化階段,系統持續回報 時鐘初始化錯誤。 檢查後發現: M7 核心實際設定的 PLL2 輸出頻率,與 M4 核的 DTS overlay 所預期的頻率不一致(在M7中確認設定數值正確)。

錯誤現象與診斷結果 啟動時出現: stm32_sdmmc: Failed to enable SDMMC domain clock stm32_sdmmc: failed to init clocks 程式內以 HAL 量測: PLL2_R = 64 MHz(實際) 但 M4 的 DTS overlay 中 PLL2 參數為: div-m = 5, mul-n = 96, div-r = 10, HSE=25 MHz 計算結果為 48 MHz(預期) → 實際 64 MHz vs DTS 48 MHz 的時鐘衝突,導致 SDMMC 初始化失敗。

系統環境 Board: stm32h757i_eval Base Sample: rpmsg_service(延伸加入 SDMMC2 / FDCAN) Zephyr 版本: 0.17.2

主要待確認問題

  1. 如何讓 M4 SDMMC Driver 正確讀到 SDMMC Domain Clock? 需要取得 M7 核心實際使用的 PLL2 參數組(div-m、mul-n、div-r), 以便 M4 的 DTS 與 M7 的時鐘設定一致,解決 64MHz / 48MHz 不一致問題。
  2. 雙核心(M7/M4)在 Zephyr 中的時鐘配置正確方法? 是否建議: 所有 PLL 都由 M7 核心統一設定? M4 只引用(不重新配置)M7 已啟用的時鐘輸出?

在ZEPHYR PROJECT GITHUB有一些Oerlay 設定: https://github.com/zephyrproject-rtos/zephyr/discussions/100423

https://github.com/WHMJJ/ZEPHYR-STM32H747-DISCO-SDMMC2-M4/tree/main/rpmsg_service_Joey_ver2_addsdmmc2

收藏 评论1 发布时间:2025-12-4 09:36

举报

1个回答
攻城狮Melo 回答时间:3 分钟前

✅ 解决方案(推荐做法)

✅ 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 驱动

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版