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.

[参考译文] TM4C1294NCPDT:SYSCLK 不是预期的那样。

Guru**** 1839440 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具与软件:

您好!

我可能在 PLL 方面有问题。

在对定制电路板进行开关循环通电时、我发现了这个问题。

问题非常罕见、 仅每100...4000个周期发生一次。

该电路板使用25MHz 晶体、我们设置 PLL 以生成120MHz 系统时钟。

此外、我们使用时钟输出引脚(PQ4)生成8.33MHz 时钟(PF1/3)、使用25MHz 在 PF1上生成780kHz 时钟。

此外、我们将 I2C 用于某些传感器数据。

失败时、我们可以看到:

- PQ4 8.33MHz ->良好

- PWM 时钟~48kHz ->错误

- I2C 时钟~3kHz ->错误

-延迟时间比预期时间长->不好

我们使用了旧的 TivaWare、但将其更新为最新(2.2.0.295)、即 SYSCLT#22和 SYSCTL#23的原因。

我只能在这里发布代码块。

以下是我的代码。 有什么想法如何实现这一点吗?

// The system clock frequency.
uint32_t g_ui32SysClock;

int main(void)
{
    ///////////////////////////////////////////////////////////////////////////
    // Initialization
    ///////////////////////////////////////////////////////////////////////////

    g_ui32SysClock = init_CPU();
    init_CLKOut();
    init_M0PWM1_MC();
    
    // more code
    ...
    ...
    ...
}

uint32_t init_CPU(void)
{
    uint32_t ui32SysClock;

    //
    // Make sure the main oscillator is enabled because this is required by
    // the PHY.  The system must have a 25MHz crystal attached to the OSC
    // pins.  The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal
    // frequency is 10MHz or higher.
    //
    MAP_SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ);

    // Run from the PLL at 120 MHz.
    // Note: SYSCTL_CFG_VCO_240 is a new setting provided in TivaWare 2.2.x and
    // later to better reflect the actual VCO speed due to SYSCTL#22.
    //
    ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                           SYSCTL_OSC_MAIN |
                                           SYSCTL_USE_PLL |
                                           SYSCTL_CFG_VCO_240), 120000000);

    return(ui32SysClock);
}

void init_CLKOut(void)
{
    //
    // Enable pin PQ4 for CLK-Output for FPGA
    // use the Main Oscillator (MOSC) = 25MHz and divided by 3
    // 25MHz / 3 = 8.333MHz
    // CLK-Output is enabled
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);

    //
    // Wait for the GPIOQ module to be ready.
    //
    while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOQ))
    {
    }

    MAP_GPIOPinConfigure(GPIO_PQ4_DIVSCLK);
    GPIOPinTypeDIVSCLK(GPIO_PORTQ_BASE, GPIO_PIN_4);
    MAP_SysCtlClockOutConfig(SYSCTL_CLKOUT_EN | SYSCTL_CLKOUT_MOSC, 3);
}

void init_M0PWM1_MC(void)
{
    //
    // Enable M0PWM1
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

    //
    // Wait for the PWM0 module to be ready.
    //
    while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_PWM0))
    {
    }

    //
    // Set the PWM clock source to the system clock divided by 1.
    // 120MHz / 1 = 120MHz
    //
    MAP_PWMClockSet(PWM0_BASE, PWM_SYSCLK_DIV_1);
    
    //
    // Enable GPIO-F
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    
    //
    // Wait for the GPIO module to be ready.
    //
    while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
    {
    }

    //
    // Configure the GPIO pin muxing to select M0PWM1 functions for these pins.
    // This step selects which alternate function is available for these pins.
    // This is necessary if your part supports GPIO pin function muxing.
    // Consult the data sheet to see which functions are allocated per pin.
    //
    MAP_GPIOPinConfigure(GPIO_PF1_M0PWM1);

    //
    // Configure the PWM function for PF1.
    // Consult the data sheet to see which functions are allocated per pin.
    //
    MAP_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);

    //
    // Configure the M0PWM to count up/down without synchronization.
    //
    MAP_PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN |
                        PWM_GEN_MODE_NO_SYNC);

    //
    // Set the PWM period to 780kHz.  To calculate the appropriate parameter
    // use the following equation: N = (1 / f) * SysClk.  Where N is the
    // function parameter, f is the desired frequency, and SysClk is the
    // system clock frequency.
    // In this case you get: (1 / 780kHz) * (120MHz/1) = 154 cycles.  Note that
    // the maximum period you can set is 2^16.
    //
    MAP_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 154);

    //
    // Set PWM0 to a duty cycle of 50%.  You set the duty cycle as a function
    // of the period.  Since the period was set above, you can use the
    // PWMGenPeriodGet() function.  For this example the PWM will be high for
    // 50% of the time or 77 clock ticks (154 / 2).
    //
    MAP_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, 77);

    //
    // Disables (false) the PWM0 Bit1 (PF1) output signal.
    //
    MAP_PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, false);

    //
    // Enables the timer/counter for a PWM generator block.
    //
    MAP_PWMGenEnable(PWM0_BASE, PWM_GEN_0);
}

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

    您好!

     也可以输出分频的系统时钟而不是分频的 MOSC。

     -是否看到分频系统时钟错误?

     -这只发生在一个板或多个板上?

     -故障率是多少?

     -您在旧版本和新版本/最新 TivaWare 版本上都遇到相同的问题吗?

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

    您好!

    感谢您的答复。 正如我写在我的第一篇文章:

    [报价用户 id="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be "]

    失败时、我们可以看到:

    - PQ4 8.33MHz ->良好

    - PWM 时钟~48kHz ->错误

    - I2C 时钟~3kHz ->错误

    -延迟时间比预期时间长->不好

    [报价]

    我们会看到错误的 PWM 时钟、I2C 时钟和延迟/处理时间也更长。

    如果我在重新计算 SYSCLK 时钟错误、可以得到7.5MHz (48.68kHz * 154)上的值。

    init_cpu()的返回值为 good -> 120MHz。

    在 init_cpu()和 init_M0PWM1_MC ()之间是否需要更多的延迟时间?

    这一情况是否只发生在一个主板上还是多个主板上?

    这会在多个电路板上发生。

    故障率是多少?

    每100...4000个周期发生一次、但通常超过1000个周期。

    您在旧版本和新版本/最新 TivaWare 版本上都遇到同样的问题吗?

    有。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5279374 #5279374"]

    正如我写在我的第一篇文章:

    失败时、我们可以看到:

    - PQ4 8.33MHz ->良好

    - PWM 时钟~48kHz ->错误

    - I2C 时钟~3kHz ->错误

    [报价]

    我知道您使用 SYSCTL_CLKOUT_MOSC 标志在 DIVSCLK 引脚上输出 MOSC/3、即8.33Mhz。 尽管 ui32SysClock 返回的频率为120MHz、但我想查看实际的 SYSCLK 输出、如果您使用 SYSCTL_CLKOUT_SYSCLK 标志、则 SYSCLK/3的应为40MHz。  

    [报价 userid="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5279374 #5279374"]

    我们会看到错误的 PWM 时钟、I2C 时钟和延迟/处理时间也更长。

    如果我在重新计算 SYSCLK 时钟错误、可以得到7.5MHz (48.68kHz * 154)上的值。

    [报价]

     如果 SYSCTL_CLKOUT_SYSCLK  与/3分频器一起使用、我想知道 DIVSCLK 是否等于7.5/3=2.6Mhz、而不是预期的40MHz。  

    [报价 userid="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5279374 #5279374"]

    在 init_cpu()和 init_M0PWM1_MC ()之间是否需要更多的延迟时间?

    [报价]

    如果它在经过一千次电源循环后仅发生一次故障、那么我认为这不是软件问题。

    [报价 userid="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5279374 #5279374"]

    这会在多个电路板上发生。

    故障率是多少?

    每100...4000个周期发生一次、但通常超过1000个周期。

    您是否在旧版本和新版本/最新 TivaWare 版本上都看到相同的问题?

    有。

    [报价]

    我不知道问题的原因是什么。 我会提出一些建议。  

     -您可以运行库存 TivaWare 示例 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\pwm_invert 吗? 请按原样运行、不要修改。 这个示例生成一个具有25%或75% PWM 的15MHz PWM。 您看到 PWM 周期是否正确?  

    -你有没有任何问题的电路板?

    -如果你有一个电路板完全没有问题,那么请进行 ABA 交换测试。 将 MCU 从可疑的板交换到已知正常的板。 您可以重复同样的问题吗? 还要将已知良好的 MCU 从正常的板交换到可疑的板。 您可以重复同样的问题吗? 如果问题已隔离到 MCU 或电路板、我们将进行 ABA 交换测试。 假设您有一些已知正常的板没有显示问题。  

     -如果您的所有电路板都出现故障,那么您可以在 EK-TM4C1294XL LaunchPad 电路板上重复同样的问题吗? 请注意、由于 PQ4用作电源监测器输入、因此 LaunchPad 上的 PQ4无法用于输出 DIVSCLK。 因此、如果打算在 LaunchPad 上尝试、请确保您注释掉用于输出 DIVSCLK 的代码、否则您需要稍微破解电路板。 请参阅此帖子。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/345762/tiva-c-series-tm4c1294-connected-launchpad

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

    好的、感谢您的帮助。

    我将时钟输出源更改为 MAP_SysCtlClockOutConfig (SYSCTL_CLKOUT_EN | SYSCTL_CLKOUT_SYSCLK 、15)、这样我的时钟仍然围绕8MHz (120MHz / 15)。

    PWM_INVERT 演示工程无法按原样运行、原因是我们在定制板上使用了 PF2。

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

    您好!

     如果  MAP_SysCtlClockOutConfig (SYSCTL_CLKOUT_EN |  SYSCTL_CLKOUT_SYSCLK  、15)在 PQ4引脚上产生8MHz、那么它告诉我从 PLL 派生的 SYSCLK 是正确的。 请参阅数据表中的时钟树图。 另请参见下面的。  

    我无法按原样运行 PWM_inverted 演示项目、原因是我们客户定制板上使用了 PF2。

    您是否能够修改 PWM_INVERT 以 在其他引脚上输出 PWM 信号? 我只是想确保这不是您的软件问题。 PWM_INVERT 是一个经过验证的示例。 如果它在您的电路板上也发生了故障、则应研究硬件。  

    您还没有告诉我在 LaunchPad 上运行您自己的代码会得到什么样的结果。

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

    我将引脚从 PWM_INVERT DEMO 更改为引脚 PF1、它在我们的电路板上运行。

    我在您的演示中注意到以下几点:

    -你不使用 SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ)

    -您无需等待外设准备就绪,就像您在[常见问题解答]常见 TM4C 解决的问题和一般信息中所描述的那样

    您尚未告知我在 LaunchPad 上运行您自己的代码时的结果如何。

    我的代码也可以在 LaunchPad 上运行(尚未测试 PQ4输出)。

    两者都只是单稳态测试、不是循环测试。

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

    您好!

    将引脚从 pwm_inverted demo 更改为引脚 PF1并在我们的电路板上运行。

    您的代码与示例或者可能是硬件本身之间必须存在一些细微差异、但我目前无法说明具体情况。  您是否可以循环运行4000次并重现问题? 如果您可以通过运行示例复制不良的 PWM 频率、那么我们可以提出有关如何诊断问题的后续步骤。

    [报价 userid="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5287168 #5287168"]

    我在您的演示中注意到以下几点:

    -你不使用 SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ)

    -您无需等待外设准备就绪,就像您在[常见问题解答]常见 TM4C 解决的问题和一般信息中所描述的那样

    [报价]

    正确。 对于所有 TivaWare 示例、我还没有看到 在 SysCtlClockFreqSet 之前调用 SysCtlMOSCConfigSet 的示例 、但我不认为调用 SysCtlMOSCConfigSet 会产生任何负面影响。 你可以注释掉 SysCtlMOSCConfigSet 来查看是否有差异?

    等待外设准备就绪是一种很好的做法。 尽管示例中确实添加了该函数、但仍应添加该函数。 通常、外设需要几个周期才能准备就绪。 启用外设时钟也很重要。 无需等待、在处理器访问外设时、外设通常就绪。  

    [报价用户 id="286465" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be "]

    我们使用了旧的 TivaWare、但将其更新为最新(2.2.0.295)、即 SYSCLT#22和 SYSCTL#23的原因。

    [报价]

    我倾向于认为您正在选择正确的库、但您能否在 CCS 工程设置中确保您指向的是最新 TivaWare 版本的 driverlib.lib、而不是旧版本。  

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

    我有一个针对整个项目的自动循环测试。

    这个周末的失败再次发生。

    随着到 MAP_SysCtlClockOutConfig (SYSCTL_CLKOUT_EN |  SYSCTL_CLKOUT_SYSCLK  、15)的改变120MHz、我应该看到8MHz (SYSCTL/15)、但是我看到的是500kHz。 因此、SYSCLK 与7.5MHz 是错误的(SYSCLK/15 7.5MHz = 500kHz)。

    [报价 userid="93620" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381626/tm4c1294ncpdt-sysclk-is-not-what-it-is-supposed-to-be/5288512 #5288512"]我倾向于认为您正在选择正确的库、但您能否在 CCS 项目设置中确保您指向的是最新 TivaWare 版本而非旧版本的 driverlib.lib。  [报价]

    仅安装了最新版本。 我把旧的卸掉了。

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

    您好!

     很抱歉耽误你的时间。 由于最近的飓风袭击德克萨斯州、我们在办公室和家中都失去了电力。 大多数时间我没有手机服务。  不确定我们何时会恢复正常。

     您是否有可以正常工作的电路板? 如果您的电路板至少有一个正常工作、则可以进行 ABA 交换测试。  

     如果您没有任何工作板、那么您是否可以在 Launchpad 上进行自动测试?

     使用您到目前为止提供的所有信息、我无法诊断 PLL 输出损坏、经过几千次下电上电后出现故障的问题。