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.

[参考译文] TMS320F28027:从闪存运行时的 PLL 跛行模式

Guru**** 2845830 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1010217/tms320f28027-pll-limp-mode-when-running-from-flash

器件型号:TMS320F28027
主题中讨论的其他器件:C2000WARE

您好!

我正在配置我们的代码以从闪存运行。 当代码进入 PLL 的初始化例程时、它会停止、并且似乎 PLL 正在跛行模式下运行。 以前、我们的代码是从 RAM 中执行的、没有出现任何问题。 特定代码如下所示:  

void InitPll()
{
    //
    // 1. Make sure the PLL is not running in limp mode
    //
    if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)
    {
        EALLOW;
        //
        // OSCCLKSRC1 failure detected. PLL running in limp mode.
        // Re-enable missing clock logic.
        //
        SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;
        EDIS;

        //
        // Replace this line with a call to an appropriate
        // SystemShutdown(); function.
        //

        asm("        ESTOP0");     // Uncomment for debugging purposes
    }

接下来、我尝试了 C2000Ware 示例"flash_F2802x"。 运行此示例不会显示上述行为。 我注意到使用了不同的等待状态值、因此我在我们自己的代码中调整了等待状态、上述问题有所不同。 不过,我不明白原因。 以下是使用的特定值:

等待状态的旧值、其中 PLL 似乎处于跛形模式:

// Set the Paged Waitstate for the Flash
//
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 0;

//
// Set the Random Waitstate for the Flash
//
FlashRegs.FBANKWAIT.bit.RANDWAIT = 1;

//
// Set the Waitstate for the OTP
//
FlashRegs.FOTPWAIT.bit.OTPWAIT = 1;

等待状态的新值运行正常:

// Set the Paged Waitstate for the Flash
//
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 2;

//
// Set the Random Waitstate for the Flash
//
FlashRegs.FBANKWAIT.bit.RANDWAIT = 2;

//
// Set the Waitstate for the OTP
//
FlashRegs.FOTPWAIT.bit.OTPWAIT = 3;
 

对于"旧值"、我使用了数据表(SPRS523N)的表5-24、其中指定了所需的最小等待状态。  设置等待状态的代码在初始化 PLL 之前执行。 根据技术参考手册(SPRUI09)的理解、在复位  SYSCLKOUT 等于 2.5MHz 或400ns 后、会产生上述"旧值"。

是否有人知道 PLL 为什么会进入跛行模式?



此致、
Steven。

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

    Steven、

    我同意 Flash WS 不应自行导致时钟丢失事件。  当然、如果器件以60MHz 的频率运行、并且使用这些旧设置访问闪存、则更有可能获得非法指令(我们也可能会对指令进行错误解码)。  

    虽然复位后器件的频率为2.5MHz 是正确的;我想当您退出 Brom 时、我们已经执行了 DeviceCal ()函数、这将使内部振荡器达到其10MHz 的 DS 规格。  但是、您的旧 WS 设置应保持在20MHz 以下。

    不过、根据您的描述、丢失时钟事件发生在甚至调用 InitPLL 函数之前以及 PLL 被设置为与内部时钟相乘之前。

    您的代码中是否可能有内部0引脚振荡器的时钟源发生变化?  我想检测到这一点的问题是、在缺少时钟时、器件将自动切换回内部振荡器作为安全网。

    您能否查看相对于 InitSysCtrl()函数以及 InitPLL()函数的 InitFlash()函数在您的项目中的调用位置?

    我们还可以查看是主数组 WS 还是 OTP WS 导致了这种情况;您可以独立修改它们、并查看其中一个问题是否解决。  校准函数位于 OTP 中、如果执行不当、它将会校准振荡器、频率将无法预计。

    将查找您的回复。

    最棒的

    Matthew

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

    您好、Matthew、

    至于时钟源、我使用的是内部振荡器1。 被调用的函数顺序是第一个 InitFlash()、下一个 InitOsc1Sel()和最后一个 InitPLL()。 所有这些函数都驻留在 InitSysCtrl()中。

    我现在将顺序更改为第一 个 InitOsc1Sel(),下一个 InitPLL(),最后 一个 InitFlash()。 我们的想法是在 PLL 之后配置闪存 、因为我有一个印象、虽然代码进入了处于跛形模式的 PLL 部分、但实际上情况并非如此。 当我简单地从 Code Composer Studio 重新启动代码时、不会再次进入跛行模式部分。 此外、当代码进入跛形模式部分时、它会检查这一点  

    SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0
    但 
    SysCtrlRegs.PLLSTS.bit.MCLKSTS
    当我在 CSS 中观看时、它显示为0。 不确定这是否正常。  

    按照新的顺序、在 PLL 之后配置闪存、代码运行正常、不再进入跛行模式部分。 使用之前的顺序、我确实检查 了仅更改闪存的分页 WS。 这导致进入跛行模式。 但是、我没有选中"Changing Only the WS for the OTP (仅更改 OTP 的 WS)"。  

     

    此致、

    Steven。

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

    Steven、

    Matthew 目前已离开办公室、截至7月8日。

    您是否将 PLL 配置为生成大于25MHz 的 SYSCLK? 如果是这样、原始事件序列将使用25MHz 等待状态设置从闪存执行所有初始化序列。 当 PLL 配置为>25MHz 的操作时,等待状态将不再有效,并且 CPU 很可能从闪存中获取损坏的指令。 损坏的指令可能已将系统错误配置为缺少时钟条件。

    如果上述条件为真,只要在配置 PLL 之前增加大于25MHz 操作的等待状态,原始序列就会起作用。

    Tommy

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

    嗨、Tommy、

    我将 SYSCLK 配置为10MHz。  这是在检查 PLL 是否在跛行模式下运行后在 InitPll()函数内完成的。 (正如您从我的第一个帖子中看到的、在此函数中首先要检查跛形模式。)

    如果我理解正确、复位 后 SYSCLK 等于2.5MHz。 因此、如果代码在复位后进入 InitPLL()、25MHz 运行的等待状态应该是好的? 如果我在这里错了、请更正我的问题。  


    此致、

    Steven。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="338143" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1010217/tms320f28027-pll-limp-mode-when-running-from-flash/3739059 #3739059">我将 SYSCLK 配置为10MHz。  这是在检查 PLL 是否在跛行模式下运行后在 InitPll()函数内完成的。[/quot]

    对我来说、从浏览之前的帖子中看、速度并不明显。

    [引用 userid="338143" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1010217/tms320f28027-pll-limp-mode-when-running-from-flash/3739059 #3739059"]如果我理解正确,则在复位 SYSCLK 等于2.5MHz 后。

    是的、硬件冷复位默认值是将内部振荡器频率/4分频、典型值为2.5MHz。 但是、引导 ROM 将在复位后立即执行、因此您的应用程序将从/1频率(典型值为10MHz)启动。

    来自 TRM:

    Tommy

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

    嗨、Tommy、

    感谢您链接此额外信息。 我现在明白你的同事  Matthew 的意思。  

    但是、我认为这并不能解释上述行为。 在任何情况下、 在 PLL 之后而不是之前配置闪存都可以解决我的问题。  


    此致、

    Steven。

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

    Steven、

    我同意,我们仍然没有找到失败的根本原因。 如果您希望进一步调查、请告知我们。

    Tommy