4. AURIX时钟系统配置与频率测量

任务目标

在 AURIX TC3xx 上配置 PLL 与 CCU,将系统时钟切换到目标频率(本例目标 200 MHz),并用 STM 定时器测量实际频率,验证配置是否生效。

环境与依赖

  • 开发板:AURIX TC3xx(如 TC375 Lite Kit)
  • 工具链:AURIX Development Studio / Tasking,iLLD 库
  • 外部晶振:20 MHz(OSC0)
  • 调试接口:DAP,可在线查看变量

配置思路

PLL 由外部晶振经预分频、倍频、K2/K3 分频得到 PLL 输出,再经 CCU 的 PLLERAY/SPB 等分频器分配给各总线。测量时用 STM 以已知的 f_SPB 计数,在固定时间窗口内读取计数值,反推实际频率。

OSC0 20 MHz PLL NDIV/PDIV/K2 CCU SPB / PLLERAY CPU / SRI 200 MHz STM f_SPB 计数

关键代码

#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "IfxScuCcu.h"
#include "IfxStm.h"

#define TARGET_FREQ_HZ  200000000u   /* 目标 200 MHz */
#define MEASURE_MS      100u         /* 测量窗口 100 ms */

static IfxScuCcu_Config g_ccuCfg;

/* 配置 PLL + CCU,切换到目标频率 */
void Clock_init(void)
{
    IfxScuCcu_initConfig(&g_ccuCfg);

    /* 20 MHz 晶振 -> 200 MHz:PDIV=1, NDIV=40, K2=2, K3=4 */
    g_ccuCfg.pllConfig.pllPdiv  = 1;
    g_ccuCfg.pllConfig.pllNdiv  = 40;
    g_ccuCfg.pllConfig.pllK2Div = 2;
    g_ccuCfg.pllConfig.pllK3Div = 4;

    /* SPB 分频 = 2 -> 100 MHz */
    g_ccuCfg.spbConfig.spbDivider = 2;

    IfxScuCcu_init(&g_ccuCfg);
    IfxScuCcu_setCpuClockDivider(IfxScuCcu_CpuDivider_1);
    IfxScuCcu_setCpuClockDivider(IfxScuCcu_CpuDivider_1);
}

/* 用 STM 测量 f_SPB:在 MEASURE_MS 窗口内计数 */
uint32 Clock_measureSpb(void)
{
    Ifx_STM *stm = &MODULE_STM0;
    uint32 start = IfxStm_getLower(stm);
    uint32 ticks = (uint32)((uint64)MEASURE_MS * 100000u); /* 100 MHz 下 100ms 的 tick 数 */

    /* 忙等固定 tick 数 */
    while ((IfxStm_getLower(stm) - start) < ticks) { }

    uint32 elapsed = IfxStm_getLower(stm) - start;
    /* 实际 f_SPB = elapsed / (MEASURE_MS/1000) */
    return (uint32)((uint64)elapsed * 1000u / MEASURE_MS);
}

int core0_main(void)
{
    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());

    Clock_init();

    uint32 fSpb = Clock_measureSpb();
    uint32 fCpu = fSpb * 2u;   /* CPU = SPB * 2 */

    /* 调试观察:fCpu 应接近 TARGET_FREQ_HZ */
    volatile uint32 result = fCpu;
    (void)result;

    while (1) { }
    return 0;
}

运行与验证

  1. 用 AURIX Development Studio 新建 TC375 工程,加入上述代码,编译并下载。
  2. 进入调试,在 volatile uint32 result 处设断点,运行到断点。
  3. 查看 result 值:应接近 200000000(允许 ±1% 误差,即 198M~202M)。
  4. 若偏差过大,检查 PDIV/NDIV/K2/K3 与 SPB 分频是否与晶振频率匹配。

通过条件:result 落在 198 MHz ~ 202 MHz 区间,即认为 PLL 与 CCU 配置正确、系统时钟已切换到目标频率。