NXP MCU 技术论坛
直播中

kasdlak

9年用户 1312经验值
擅长:光电显示
私信 关注
[问答]

S32K396 RTD MCAL PWM驱动程序系统时钟频率与预期不匹配是哪里的问题?


我像这样设置 mcal pwm 配置。
你知道,s32k396 核心时钟频率是 160Mhz。
我像图片一样设置了默认的 perioud 8000 ticks。
我用示波器检查了 PWM 频率。
频率为 6.023 Khz(????)。
这很奇怪。核心频率 == (8000*6023 == 48Mhz??)嗯。。。有人知道为什么会这样吗?
我没有设置任何 prescaler。(48Mhz 不能用任何 160Mhz 的预分频器制作)。
                     

回帖(1)

微风挽雨

2025-4-10 17:56:50

针对S32K396 RTD MCAL PWM频率不匹配的问题,以下是可能的原因及解决方案:




1. 验证系统时钟配置




  • PLL未正确启用

    确认核心时钟实际运行在160MHz。若PLL未锁定(如配置错误或晶振失效),MCU可能回退到内部低速时钟(如16MHz IRC)。

    检查步骤



    • 使用调试器读取 SCG_SOSCCSR(外部晶振状态)和 SCG_SPLLCSR(PLL状态)。

    • 检查时钟模式寄存器 SCG_CSR[DIVCORE] 确认分频系数是否为1。

    • 通过RTD时钟配置工具确保PLL输出配置为160MHz。




  • 分频器误配置

    即使未配置预分频器,默认分频可能生效(如SPB时钟分频)。

    检查步骤



    • 查看 SCG_SIM_IPB_CLKSCG_SIM_PERIPH_CLK 分频寄存器,确认未对PWM时钟源分频。






2. 检查PWM模块配置




  • PWM时钟源选择错误

    PWM模块可能未使用系统时钟,而是其他分频后的时钟(如总线时钟)。

    检查步骤



    • 查看PWM模块的时钟源选择寄存器(如 FTM_SC[CLKS]),确保选择系统时钟(如 CLKS=0x1)。

    • 验证 FTM_MOD 寄存器是否设置为8000(周期值)。




  • 隐式预分频器启用

    FTM模块的 FTM_SC[PS] 可能默认配置了分频(如PS=2对应分频4)。

    检查步骤



    • 读取 FTM_SC 寄存器,确认 PS 字段是否为0(分频1)。  

    • 若RTD配置工具未正确生成代码,手动修复分频值:
      FTM_SC_REG(FTM_INSTANCE) |= FTM_SC_PS(0); // 分频系数=1






3. RTD配置工具问题



  • 代码生成错误

    RTD生成的PWM初始化代码可能未正确应用配置。

    检查步骤

    • 在生成的代码中(如 Pwm_Ip_HwConfig.c)检查 Pwm_Ip_ConfigType 结构体:
      {
      .channelPeriod = 8000,  // 确保周期值正确
      .prescaler = 0,         // 预分频器应为0
      ...
      }

    • 确认 Pwm_Ip_Init() 函数正确调用。





4. 硬件与测量问题




  • 示波器测量误差

    测量高频信号时需注意探头带宽及触发设置。

    检查步骤



    • 使用示波器自动测量功能确认频率,或手动计算脉冲宽度(周期=1/6023≈166µs,对应8000 ticks时时钟周期=20.75ns,即≈48MHz)。

    • 尝试降低PWM周期(如设置1000 ticks),观察频率是否按比例变化。




  • 引脚复用配置错误

    PWM输出引脚可能未正确配置为FTM功能。

    检查步骤



    • 检查PORT模块配置,确认引脚MUX设置为FTM功能(如ALT3)。






5. 代码调试技巧




  • 动态读取寄存器值

    通过调试器实时检查关键寄存器:


     // 读取系统时钟状态
    uint32_t scg_csr = SCG_CSR;
    // 读取FTM配置
    uint32_t ftm_sc = FTM_SC_REG(FTM_INSTANCE);
    uint32_t ftm_mod = FTM_MOD_REG(FTM_INSTANCE);



  • 最小化测试代码

    排除其他驱动干扰,单独测试PWM:


     Pwm_Ip_Init(PWM_INSTANCE, &PwmConfig);
    Pwm_Ip_SetDutyCycle(PWM_INSTANCE, PWM_CHANNEL, 50); // 50%占空比





最终解决方案



  1. 确认系统时钟为160MHz:检查PLL配置,修复时钟树设置。

  2. 禁用PWM预分频器:确保 FTM_SC[PS]=0

  3. 验证RTD生成的代码:确保周期和分频参数正确。

  4. 重新测量信号:使用可靠的示波器设置。


若以上步骤仍无效,可能是硬件故障(如晶振未起振),需检查外部电路。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分