This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:从下电上电启动

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28379D, TMS320F28379S, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1255625/tms320f28379d-boot-from-power-cycle

器件型号:TMS320F28379D
主题中讨论的其他器件: TMS320F28379SC2000WARE

您好!  

我有一个定制电路板、并且使用的是 TMS320F28379D。 当我编写 到闪存中时、运行正常。 然而、当我对电路板进行下电上电时、它似乎卡住、要等待 CLK (外部单端20MHz 振荡器)。 如果我使用 CCS 重新编程、它同样可以正常工作、但在下电上电时会卡住。  

问题:

  • MCU 在进行下电上电时卡滞。
  • 我另一块采用 TMS320F28379S 的电路板、它不存在此问题。  
  • 如果我使用回流站加热 MCU、则不会出现此问题。 当系统冷却时、从下电上电启动所需的时间越来越长。 (3s、7s、20s、...、从不启动)。

有什么建议如何对此进行进一步调试、或者可能是什么问题? 我已经验证了以下内容:

  • 外部 CLK
  • MCU VDD、VDDIO 等。
  • 复位引脚
  • 引导模式引脚(GPIO72和 GPIO84)均被拉至高电平

非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James:

    您能否发布 C2000器件顶部的图片;或者、如果更容易的话、您也可以在回复中键入它。  这将为我提供有关此器件的一些制造信息。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 就在这里。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James:

    让我与其他人分享这一点、看看是否存在任何已知问题。  我应该有更多的信息在日末 tomm 7日。

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我正在与 Jimmy 一起处理这个问题、并提供更多信息。  固件在 SysCtl_selectXTAL 例程的 sysctl_pollCpuTimer()函数中挂起。  如果我强制 timer2的源使用系统时钟、它将继续运行、系统准备就绪。  我们尚未确认系统时钟在启用 PLL 后正常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David / James、

    如果在通过/故障期间观察 X1、您是否观察到时钟消失了?

    相关代码是在切换到该代码之前检查是否缺少时钟、如果它挂起、则意味着器件看不到时钟。  我怀疑在冷却后、我们会看到越来越少的边缘、直到我们没有看到任何边缘。

    我以为你有一个外部晶振、但是通过重新读取、我看到这是一个屏蔽振荡器、所以不应该有任何芯片依赖它来正确启动。  我之所以提出这个问题、是因为有时温度过高时、我们会看到无源选择会影响晶体启动时间、但此处应该不会这样。

    如果在器件挂起时您仍然看到屏蔽式振荡器输出时钟、则必须进一步调试这一点、了解这是如何实现的。  您能否在 X1引脚的顶部进行探测、以确保这不是连续性问题(或者您可以按下 X1引脚来查看它是否可以解决问题)

    只是为了确保、这是连接到 C2000的器件。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是我们拥有的东西。  我们看了看钟时,它是在挂起模式,它似乎是坚实的。  我不确定我们是否查看了 X1引脚。  吉米在星期四外。  然后、它将检查 X1引脚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew、您好!

    请查看下面的 CLK 信号。 当它挂起时、我直接在 MCU 引脚上进行测量。 我还尝试按下振荡器和引脚、但未看到任何行为变化。 我使用的是 来自 Microchip 的 DSC1001CL2-020.0000。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mathew:

    我不知道这是不是意味着什么、但根据规范、X1CNT 寄存器读取了3FF、这意味着 X1引脚上有一个 CLK。  这是一个有效的假设吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James/David、

    我仍在研究这一点、并希望今天晚些时候提供另一个更新。  X1CNT = 3FF 指示 X1引脚上存在时钟脉冲。  我将深入研究上述函数、以了解是否存在可能会引起我们跳过的操作/或初始化顺序。

    针对发生故障的 PCB/器件;您提到了单独使用是我们看到随温度变化的器件。  连接到调试器时是否会产生温度影响、或者该方法是否始终通过?

    另一个想法是、我们可以在连接到调试器时仿真启动、在启动故障电路板上的连接/连接到目标后、如果您转到"脚本"并转到仿真启动模式、 然后选择闪存。然后、您可以执行 Debug->Reset、器件将执行与独立运行相同的启动代码。  如果您可以看到该失败、我们可以开始尝试解决该流程与使用调试器加载/运行之间的任何差异。

    GEL 文件在这种仅调试模式下可能对我们有帮助、它需要处理引导加载程序的某些方面、因为我们通常在连接到调试器/CCS 时不执行引导 ROM (同样、CCS 也会强制默认从"main"启动)。  同样、上述 emuboot 到闪存将让我们看到发生了什么情况、就像器件处于独立引导中一样。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Matthew、我将尝试 debug->reset、但不管是否连接了调试器、都失败。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Matthew 和 Jimmy:

    我昨天玩过这个游戏和 Debug->Reset。  如果我将输入时钟更改为与系统时钟相对应,我可以使 SYSCTL_pollCpuTimer()函数传递并从其无限循环 中退出,我发现如果我将 CLKSRCCTL1中的 XTALFF 设置为1, 然后返回到0。  一旦我通过此函数、如果我执行上面的复位序列、在这之后、它将多次就绪。  但是、如果我单步执行 SYSCTL_selectXTAL 函数、它将再次挂起。  我注意到、对  CLKSRCCTL1的多次写入存在勘误表 、可能会导致挂起。  这是它所指的窍门吗 ?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    今晚我试着去看看这件事、E2E 差不多要到上周结束了、所以我要赶上大家的进度。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    在 sysctrl.c 中、您是否看到以下定义(我在.c 文件的第69行看到它):

    //使用宏来增加2个连续写入 CLKSRCCTL1的延迟
    //寄存器。
    //延迟= 300 NOP
    //
    #define SYSCTL_CLKSRCCTL1_DELAY asm (" RPT #250 || NOP \n RPT #50 || NOP")

    这已添加到 C2000Ware V3.x 和更高版本中以解决上述勘误表。   如果您看不到这一点、或者在对 CLKSRCCTL1的写入之间存在任何硬编码延迟、则可能会错过第二次写入而不会造成延迟。  

    除以上内容外、您可以确认您使用的是哪个版本的 C2000Ware?

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew 和

    谢谢。  延迟在那里。  我对输入 X2有疑问。  我们正在尝试一些东西、看看我们是否能让它做好准备、一位工程师向 X2引脚添加了一个100pF 电容、一个失败率高达100%的电路板现在可以100%正常工作。  在执行此操作时、您可以看到任何问题、因为规范提示将其保持断开?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    由于这是一个单端时钟、X2不应进入图片中;在任何情况下、它都将/应该只是 X1的反向。

    回到发生故障的 CPU 计时器轮询;如果您是单步执行、下面的 FREE/ SOFT 位可能会阻止计时器计数、您可以尝试更改它们以查看单步执行是否起作用。

    当代码停止时、您可以检查下面 TIM 寄存器中的值吗?  至少会向我们显示当前计数。  TCR 寄存器(上述)还将具有 CPU 计时器轮询正在检查的溢出状态位。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew、您好!

    我尝试了自由/软位、但没有看到任何行为变化。  这是 timer2寄存器的输出。  我不知道保留位0意味着什么。

    CpuTimer2Regs CPUTIMER 寄存器
    TIM 0x000003FF CPU 定时器、计数器寄存器[存储器映射]
    MSW 000000000000 CPU 定时器计数器寄存器高电平
    LSW 000000111111111111 CPU 定时器计数器寄存器
    PRD 0x000003FF CPU 计时器、周期寄存器[存储器映射]
    TCR 0x0001 CPU 定时器、控制寄存器[存储器映射]
    TIF 0 CPU 定时器中断标志。
    连接0 CPU 计时器中断启用。
    自由0仿真模式
    软0仿真模式
    TRB 0定时器重新加载
    TSS 0 CPU 定时器停止状态位。
    TPR 0x0000 CPU 定时器、预分频寄存器[内存映射]
    TPRH 0x0000 CPU 定时器、预分频寄存器高电平[存储器映射]
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我同意 X2没有做任何事情。  我能想到的唯一一件事是、它可能会减慢时钟边沿进入系统其余部分的速度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    我有两件事要尝试:

    1) 1)您提到将 XTALOFF 从1切换到0可以正常工作、还有 X2 CAP (独立工作)。  正如我们两者的评论、由于您有一个单端时钟、这些内容无关紧要。  我注意到、在我们切换到外部时钟的函数中、XTAL 或 SE 时钟源之间没有区别。  

    如果您将 XTALOFF 设置为1并将其保留、那么事情也会起作用吗?  从该位的描述中我不清楚这是否将"开路" 从 X1引脚到 C2000的路径、或简单地禁用专用于外部 X-tal 振荡的内部电路。  假设这是后者、可能当该位等于0时、说明了 X2等的奇怪影响。

    2)这与 CPU 计时器轮询函数执行的外部时钟欠采样更加相关、在该过程中、我们会遇到困难。  看看是不是问题出在这里。

    我将复制下面的 SelectXTAL ()函数,

    2件事:

    是否可以检查代码匹配中的第36行:

    HWREGH (CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL)= SYSCTL_AUXPLLCLK_DIV_8;

    如果这不是代码中的设置、请将其更改为匹配、并在出现故障的情况下重新运行。

    如果是这样、我想在第57行进行以下更改

    CPUTimer_selectClockSource (CPUTIMER2_BASE、CPUTIMER_CLOCK_SOURCE_AUX、
                                  CPUTIME_CLOCK_PRECALER_1);

    CPUTimer_selectClockSource (CPUTIMER2_BASE、CPUTIMER_CLOCK_SOURCE_AUX、
                                  CPUTIME_CLOCK_PRECALLE_4);

    我正在尝试

    void
    SysCtl_selectXTAL(void)
    {
        uint16_t t2TCR, t2TPR, t2TPRH, t2CLKCTL;
        uint32_t t2PRD;
    
        //
        // Backup CPU timer2 settings
        //
        t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL);
        t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR);
        t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD);
        t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR);
        t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH);
    
        //
        // Backup AUX clock settings
        //
        uint16_t clksrcctl2 = HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2);
        uint16_t auxpllctl1 = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1);
        uint16_t auxclkdivsel = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL);
    
        //
        // Set AUX clock source to XTAL, bypass mode.
        // AUXCLK is used as the CPUTimer Clock source. SYSCLK frequency must be
        // atleast twice the frequency of AUXCLK. SYSCLK = INTOSC2(10MHz)
        // Set the AUX divider to 8. The above condition will be met for XTAL
        // frequencies up to 40MHz
        //
        EALLOW;
        HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) =
                (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &
                 ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) |
                (1U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S);
        HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = 0x0U;
        HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = SYSCTL_AUXPLLCLK_DIV_8;
    
    
        //
        // Disable cpu timer 2 interrupt
        //
        CPUTimer_disableInterrupt(CPUTIMER2_BASE);
    
        //
        // Stop cpu timer 2 if running
        //
        CPUTimer_stopTimer(CPUTIMER2_BASE);
    
        //
        // Initialize cpu timer 2 period
        //
        CPUTimer_setPeriod(CPUTIMER2_BASE, XTAL_CPUTIMER_PERIOD);
    
        //
        // Set cpu timer 2 clock source to XTAL
        //
        CPUTimer_selectClockSource(CPUTIMER2_BASE, CPUTIMER_CLOCK_SOURCE_AUX,
                                   CPUTIMER_CLOCK_PRESCALER_1);
    
        //
        // Clear cpu timer 2 overflow flag
        //
        CPUTimer_clearOverflowFlag(CPUTIMER2_BASE);
    
        //
        // Start cpu timer 2
        //
        CPUTimer_startTimer(CPUTIMER2_BASE);
    
        EALLOW;
        //
        // Turn on XTAL
        //
        HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= ~SYSCTL_CLKSRCCTL1_XTALOFF;
        EDIS;
    
        //
        // Wait for the X1 clock to overflow cpu timer 2
        //
        SysCtl_pollCpuTimer();
    
        //
        // Select XTAL as the oscillator source
        //
        EALLOW;
        HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) =
        ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &
          (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) |
         (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S));
        EDIS;
    
        //
        // If a missing clock failure was detected, try waiting for the cpu timer 2
        // to overflow again.
        //
        while(SysCtl_isMCDClockFailureDetected())
        {
            //
            // Clear the MCD failure
            //
            SysCtl_resetMCD();
    
            //
            // Wait for the X1 clock to overflow cpu timer 2
            //
            SysCtl_pollCpuTimer();
    
            //
            // Select XTAL as the oscillator source
            //
            EALLOW;
            HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) =
            ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &
              (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) |
             (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S));
            EDIS;
        }
    
        //
        // Stop cpu timer 2
        //
        CPUTimer_stopTimer(CPUTIMER2_BASE);
    
        //
        // Restore Timer 2 configuration
        //
        EALLOW;
        HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL;
        HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR;
        HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD;
        HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR;
        HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH;
        HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB;
    
        //
        // Restore AUX clock settings
        //
        HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = clksrcctl2;
        HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = auxpllctl1;
        HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = auxclkdivsel;
        EDIS;
    
        EDIS;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mathew:

    这段代码来自哪里?  我们正在使用的库没有任何 AUX 时钟设置。  我们正在使用 C2000 C2000_SDK_3_03_00_00\c2000ware\driverlib\f2837xd\driverlib Ware_Digital

    SYSCTL_selectXTAL (void)
    {
    uint16_t t2TCR、t2TPR、t2TPRH、t2CLKCTL;
    uint32_t t2PRD;

    //
    //备份 CPU 计时器2设置
    //
    t2CLKCTL = HWREGH (CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL);
    t2TCR = HWREGH (CPUTIMER2_BASE + CPUTIME_O_TCR);
    t2PRD = HWREG (CPUTIMER2_BASE + CPUTIMER_O_PRD);
    t2TPR = HWREGH (CPUTIMER2_BASE + CPUTIME_O_TPR);
    t2TPRH = HWREGH (CPUTIMER2_BASE + CPUTIME_O_TPRH);


    //
    //禁用 CPU 计时器2中断
    //
    CPUTimer_disableInterrupt (CPUTIMER2_BASE);

    //
    //如果正在运行,则停止 CPU 计时器2
    //
    CPUTimer_stopTimer (CPUTIMER2_BASE);

    //
    //初始化 CPU 计时器2周期
    //
    CPUTimer_setPeriod (CPUTIMER 2_BASE、XTAL_CPUTIMER_PERIOD);

    //
    //将 CPU 计时器2时钟源设置为 XTAL
    //
    CPUTimer_selectClockSource (CPUTIMER 2_BASE、CPUTIMER 时钟_
    CPUTIME_CLOCK_PRECALER_1);

    //
    //清除 CPU 计时器2溢出标志
    //
    CPUTimer_clearOverflowFlag (CPUTIMER2_BASE);

    //
    //启动 CPU 计时器2
    //
    CPUTimer_startTimer (CPUTIMER2_BASE);

    EALLOW;
    //
    //打开 XTAL
    //
    HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)&=~SYSCTL_CLKSR
    EDIS;

    //
    //等待 X1时钟溢出 CPU 计时器2
    //
    sysctl_pollCpuTimer();

    //
    //选择 XTAL 作为振荡器源
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)=
    ((HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)和
    (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)|
    ((uint32_t) SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S);
    EDIS;

    //
    //如果检测到缺少时钟故障,请尝试等待
    //再次溢出。
    //
    while (sysctl_isMCDClockFailureDetected ())
    {
    //
    //清除 MCD 故障
    //
    SYSCTL_resetMCD ();

    //
    //等待 X1时钟溢出 CPU 计时器2
    //
    sysctl_pollCpuTimer();

    //
    //选择 XTAL 作为振荡器源
    //
    EALLOW;
    HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)=
    ((HWREGH (CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1)和
    (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)|
    ((uint32_t) SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S);
    EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    此代码来自我们常规的 C2000Ware 安装程序。  

    对于您的示例、请更改

    Unknown 说:
    CPUTimer_selectClockSource (CPUTIMER2_base、CPUTIMER_CLOCK_
    CPUTIMER 时钟预分频器_1);

    CPUTimer_selectClockSource (CPUTIMER 2_BASE、CPUTIMER 时钟_
    CPUTIME_CLOCK_PRECALLE_4);

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew、您好!

    很抱歉、没有做任何事情来摆脱这个挂起。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    你能用上面的一个 I C/P 代替你的"SelectXTAL ()"函数吗? 它看起来保存/恢复了所有内容、因此我认为这不会影响任何下游代码。

    我想确认 AUXCLK 的使用也没有修复这个问题。  虽然似乎两种预分频(TIMER2CLK 或 AUXCLK)都能满足我们的需求、但因为在驱动器中使用了 AUXCLK、所以我想确保没有专门针对该路径的东西。  可能存在为 AUXCLK 路径写入额外代码的原因、即使我不清楚这两条路径之间的差异。

    我认为我们仍在以某种方式对外部时钟进行欠采样、我认为这符合您看到的温度方面以及 XCLKOFF 的行为。

    此致!
    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew、您好!

    这似乎达到了目的。  我们将在多个板上进行更多测试、以了解它的工作原理。  我还想了解它为什么起作用。   

    感谢所有的帮助。

    G·戴夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dave、

    我要确认一下我们的初始预分频不能并行工作的原因。  查找您的更新。

    此致!

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Matthew、 我在几个板(4-5)上尝试过这个、它们都工作得很好。   感谢您的帮助。  请在预分频器上让我保持最新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David:

    回复的时间很好、刚与我们的设计团队一起通过了一个扩展的电子邮件链。

    CPUTIMER RESCALE 寄存器中控制所提供时钟的定时器预分频的位不是作为真正的时钟分频器实现的、而是作为计数器实现"预分频"计数器。  但是、因此、如果输入时钟大于 SYSCLK、则可能会导致无法实际检测到输入时钟为高电平、或者至少无法可靠地检测内部 SYSCLK 的每个上升沿的高电平或低电平。

    这是您的系统中正在发生的情况、我们看到温度依赖性的原因是、此时代码 SYSCLK 源自内部0引脚振荡器(INTOSC2)、该振荡器的温度系数与纯 X 塔式导出的时钟源相比相当大。  因此、当您提高/降低器件温度时、我们将更改 SYSCLK 与您向 X1引脚提供的时钟之间的频率关系。

    现在、AUXCLKIN 路径、更重要的是其分频器、是真正的时钟分频器、它将在 X1进入计时器之前降低 X1上的信号输入频率。 SYSCLK 仍然是拥有的时钟域、但现在 X1时钟路径比 SYSCLK 慢、因此、无论温度发生变化、我们始终可以正确采样。

    DS 中有一些对此的引用、但它们不清楚我们试图使用第一个 GO 位的上述预分频位的实现。

    感谢您的耐心等待、很高兴事情在您的系统中正常工作。

    此致!
    马修