单片机/MCU论坛
直播中

李鑫

8年用户 1418经验值
私信 关注
[问答]

AURIX TC397主频不到300Mhz是怎么回事?

MCU主频频率提升到300G,IfxStm_getFrequency(&MODULE_STM0)我们通过这个函数读出来是100Mhz,但是397应该是300M的,这个怎么修改,还有英飞凌TC397内部的晶振怎么测算他的精度呢,可以给我一个demo吗

回帖(1)

lotusp

2025-8-13 17:50:49

AURIX TC397 主频配置问题解决方案


问题1:主频不到300MHz,IfxStm_getFrequency()返回100MHz


TC397默认配置可能未启用PLL或分频设置不正确。请按以下步骤检查和修改:


#include "IfxScuCcu.h"

void initClockTo300MHz(void)
{
    IfxScuCcu_Config config;
    IfxScuCcu_initConfig(&config); // 加载默认配置

    // 配置PLL参数(假设使用20MHz外部晶振)
    config.pllInitialStep = IfxScuCcu_PllInitialStep_x2; // 安全启动
    config.pllInputFrequency = 20000000;                 // 20MHz晶振
    config.pllVcoDivider = 1;                            // PLLDIV = 1
    config.pllVcoMultiplier = 30;                        // PLLN = 30
    config.pllOutputDivider = 2;                         // PLLP = 2

    // 计算:fPLL = (20MHz * 30) / (1 * 2) = 300MHz
    config.cpuFrequency = 300000000;         // CPU频率
    config.stmFrequency = config.cpuFrequency; // STM使用相同频率

    // 应用配置
    IfxScuCcu_init(&config);
}

int main(void)
{
    initClockTo300MHz(); // 在main()开头调用
    // ...其他初始化代码

    // 验证频率
    float stmFreq = IfxStm_getFrequency(&MODULE_STM0);
    // stmFreq现在应为300MHz
}

关键检查点:



  1. 确认硬件使用20MHz外部晶振(查看开发板手册)

  2. 确保在初始化代码中尽早调用时钟配置函数

  3. 检查寄存器锁定状态:
    if (IfxScuCcu_isPllLocked()) {
       // PLL已锁定,配置成功
    }


问题2:STM频率读取不一致的可能原因



  • 分频设置问题:检查CCUCON0.STMDIV寄存器
    MODULE_SCU.CCUCON0.B.STMDIV = 0; // 确保分频系数=1

  • 时钟源选择:确认STM使用PLL而非备份时钟
    MODULE_SCU.STMCLK0.B.CLKSEL = 0; // 0=PLL, 1=fBACK


问题3:晶振精度测算方法


使用内置DSADC测量外部晶振相对于内部fBACK的误差:


#include "IfxDts_Dts.h"
#include "IfxStm.h"

float measureOscillatorError(void)
{
    // 1. 初始化DTS模块
    IfxDts_Dts_Config dtsConfig;
    IfxDts_Dts_initModuleConfig(&dtsConfig);
    IfxDts_Dts_initModule(&dtsConfig);

    // 2. 校准基准(使用内部fBACK)
    uint32 refCount = IfxStm_getFrequency(&MODULE_STM1); // STM1使用fBACK

    // 3. 测量外部晶振驱动的STM0
    uint32 start = IfxStm_get(&MODULE_STM0);
    uint32 endRef = __ldmst(&MODULE_STM1, 0xFFFFFF); // 等待1秒
    uint32 end = IfxStm_get(&MODULE_STM0);

    // 4. 计算误差
    uint32 expectedCount = refCount; // 理论计数值
    uint32 actualCount = end - start;
    float errorPPM = ((float)(actualCount - expectedCount)/expectedCount)*1e6;

    return errorPPM;
}

精度测量说明:



  1. 原理:比较外部晶振(PLL源)和内部RC振荡器(fBACK)在固定时间内的计数差

  2. 典型值

    • 外部晶振:±10-50 ppm

    • 内部fBACK:±1% (~10,000 ppm)


  3. 注意事项

    • 测量前需预热晶振(上电>1秒)

    • 多次测量取平均值

    • 避免在高噪声环境下测试




如需完整示例:请访问英飞凌开发者社区下载官方DEMO

AURIX™ TC3xx Oscillator Measurement Example



调试建议:



  1. 使用调试器检查寄存器:
    uint32 pllcon1 = MODULE_SCU.PLLCON1.U; // 验证PLLN/PLLP值
    uint32 ccucon0 = MODULE_SCU.CCUCON0.U; // 检查分频设置

  2. 用示波器测量TEST_CLK输出引脚:
    MODULE_SCU.CLKOUT.B.CLKSEL = 0; // 输出CPU时钟

  3. 若问题持续,检查硬件:

    • 晶振是否起振

    • PCB布线是否符合高频设计要求

    • 电源纹波是否<50mV



通过上述配置和测量方法,您应能正确设置300MHz主频并验证晶振精度。

举报

更多回帖

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