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

[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

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

举报

2个回答
攻城狮Melo 回答时间:7 小时前

✅ 解决方案(推荐做法)

✅ 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 驱动
JJ WangHM 回答时间:4 小时前

攻城狮Melo 发表于 2025-12-4 15:43</p>
<h3>✅ 解决方案(推荐做法)</h3>
<h4>✅ 1. M4 侧 DTS 中<strong>不要写死 PLL 参数</strong></h4>
<p>

[md]你好: 我看目前sdmmc_stm32.c 內已經有stm32_sdmmc_clock_enable()內已經採用clock_control_get_rate, 目前也是卡住在這邊無法獲取正確的clock, m4 overlay中也已經移除pll2相關clock設定但是目前看起來還是讀取異常問題 看起來M7/M4所讀取道的系統時鐘差異蠻多導致。

Starting stm32h747i_disco with CPU frequency: 400 MHz

m7 PLL1_P: 400000000 Hz

m7 PLL1_Q: 200000000 Hz

m7 PLL1_R: 400000000 Hz

m7 PLL2_P: 240000000 Hz

m7 PLL2_Q: 120000000 Hz

m7 PLL2_R: 48000000 Hz

UART device 'serial@40007c00' is ready.

Msg Service [master] demo started

_id=0

Starting stm32h747i_disco with CPU frequency: 200 MHz

m4 PLL1_P: 128000000 Hz

m4 PLL1_Q: 64000000 Hz

m4 PLL1_R: 128000000 Hz

m4 PLL2_P: 76800000 Hz

m4 PLL2_Q: 38400000 Hz

m4 PLL2_R: 15360000 Hz

PLL2_R = 64000000

[00:00:10.019,000] <err> stm32_sdmmc: Failed to enable SDMMC domain clock 

[00:00:10.019,000] <err> stm32_sdmmc: failed to init clocks


/* m4 SDMMC2 node */
&sdmmc2 {
    status = "okay";
    compatible = "st,stm32-sdmmc"; 
      clocks = <&rcc STM32_CLOCK_BUS_AHB2 0x00000200>,
      <&rcc STM32_SRC_PLL2_R SDMMC_SEL(1)>;
      clock-names = "bus", "sdmmc";
    bus-width = <4>; 
    pinctrl-0 = <
        &sdmmc2_d0_pb14
        &sdmmc2_d1_pb15
        &sdmmc2_d2_pb3
        &sdmmc2_d3_pb4
        &sdmmc2_ck_pd6
        &sdmmc2_cmd_pa0
    >;
     pinctrl-names = "default";

    /* 如果沒有 Card Detect,可以移除這行 */
   cd-gpios = <&gpioi 8 GPIO_ACTIVE_LOW>;

    disk-name = "SD";
};


// &clk_hse {
//  clock-frequency = <DT_FREQ_M(25)>;
//  status = "okay";
// };

// &clk_hsi48 {
//  status = "okay";
// };

// &pll {
//  div-m = <5>;
//  mul-n = <0xa0>;
//  div-p = <2>;
//  div-q = <4>;
//  div-r = <2>;
//  clocks = <&clk_hse>;
//  status = "okay";
// };

// &pll2 {
//  div-m = <5>;
//  mul-n = <96>;
//  div-p = <2>;//ori div-p = <2>;
//  div-q = <4>;
//  div-r = <10>;
//  clocks = <&clk_hse>;  /* Assuming 25MHz HSE */
//  status = "okay";
// };
image.png

所属标签

相似问题

官网相关资源

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