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.

[参考译文] TM4C1294KCPDT:SysCtlClockFreqSet 改变 OSCCLK

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/857208/tm4c1294kcpdt-sysctlclockfreqset-changing-oscclk

器件型号:TM4C1294KCPDT

当配置为使用带有 MOSC 作为其源的 PLL 时、我对 SysCtlClockFreqSet 有疑问。 在这种情况下、我看到该函数执行以下操作:

  1. 为 MOSC 加电
  2. 将 OSCSRC 设置为 PIOSC
  3. 快速计算
  4. 将 OSCSRC 和 PLLSRC 都设置为 MOSC
  5. 配置 PLL 并等待 PLL 锁定。 出现超时返回错误。
  6. 将 SYSCLK 从 OSCCLK 更改为 PLL。
  7. 将 OSCSRC 设置为 PIOSC (稍后添加到地址勘误表 SYSCTL#23)

我想知道为什么在#4中 OSCSRC 更改为 MOSC、以及它是否真的有必要。 我看不到任何明显的目的。 更改为 PIOSC、然后几乎立即更改为 MOSC 也似乎很奇怪。 也许第二个变化只是为了改变 PLLSRC? 勘误表似乎支持这一点:"它将 OSCCLK 设置为 MOSC、这不是必需的"。

这在采用晶体的典型系统中可能无关紧要、但我有一个时钟源可能需要一些时间来启动。 我确实有一些时间来延迟调用 SysCtlClockFreqSet 直到时钟准备就绪、但我怀疑有时可能会失败。

我原本希望死时钟输入会导致在#5中等待 PLL 锁定的超时、但似乎错过了在#4中对 OSCSRC 的第二次更改、这会首先杀死 CPU。 有机会使用看门狗计时器从该计时器中恢复、但超时错误会更灵活。 此外、此时的看门狗复位与稍后在应用代码中的看门狗复位几乎是无法区分的、这使得调试变得更加困难。

此时、我将尝试在启动后不久跟踪罕见的 WDT 复位。 如果我可以重现它、我想知道它是否在时钟切换期间。 为此、我已经修改了 SysCtlClockFreqSet、使其在切换到 PLL 之前一直保持在 PIOSC 上。 它看起来工作正常、如果在时钟输入死区时调用 SysCtlClockFreqSet、那么我现在会得到一个特定的错误、而不是 WDT 复位。 我对可能的意外后果有点担心。 此更改是否会触发任何已知问题?

int main (void)
{
WaitForFpgaToSignalThat25MHzClockIsReady();
EnableWatchdog (1000/*ms*/);//在2个超时后发生复位

uint32_t clockFreq = SysCtlClockFreqSet (
SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、
CPU_CLOCK _Hz // 120 MHz
);
IF (clockFreq!= CPU_clock_Hz)
{
//这应该是为了处理 PLL 锁定故障。
//对于常用的 SysCtlClockFreqSet、如果是时钟、它不会被触发
//输入已死(且已绕过等待)。 在这种情况下是看门狗
//复位发生。
LogError (clock_FAIL);
SystemReset();
}

IF (ResetCauseIsWatchdog())
LogError (安全装置);
ClearResetCaus();

DisplayLoggedErrors();
RunApplication();
}

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

    [引用 user="bB_"]为此,我已修改 SysCtlClockFreqSet,使其在切换到 PLL 之前一直保持在 PIOSC 上。[/quot]

    您好、BB_、

    我认为、当存在外部 XTAL 或 MOSC 之前已加电时、PIOSC 绝不应是主时钟源。 我们似乎有类似的问题、想知道您正在运行的是哪个版本的驱动程序库? 我使用的是21171、而更新的是214178、这会粗鲁地更改先前的 Tivaware 版本 PYSDIV 位和 PLL 频率分频寄存器设置。

     [引用 user="bb_">此时、我将尝试在启动后不久跟踪罕见的 WDT 复位。 i[/报价]

    您是否偶然在 ARM 链接器设置下启用了项目保持看门狗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我理解你在做什么以及为什么,但你的担心是合理的。 在为 不同时钟域设置时钟分频器时、很少会出现间歇性问题、因此在设计 SysCtlClockFreqSet()函数时花费了大量的精力。 MOSC 和 PIOSC 之间的切换不是任意的。 虽然修改后的例程可能大部分时间都正常工作、但在极少数情况下、其中一个时钟设置可能无法正确写入、并且器件可能会锁定。
    作为替代方案、请考虑指定一个被设置为标志的静态变量、以指示您正在设置 PLL。 如果发生看门狗复位、请检查该标志以查看您是否处于设置 PLL 频率的代码的关键部分。

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

    非常详细——海报和供应商!

    供应商的替代方案-尽管受到启发且资源丰富-(看起来)容易受到攻击、但"看门狗复位可能正在"进行中"(在该"标志集"之前的几分钟)!   (因此(也许)使该安全机制失效-这不是真的吗?)  

    显然、预测并克服众多"严格的时钟域要求"证明了"极端(通常持续)挑战"。

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

    您好 CB1、

    让我稍微扩展一下这个问题。 我建议在调用 SysCtlClockFreqSet()前设置一个"标志"、在该函数完成后清除该标志。 如果您获得看门狗复位且该标志为"设置"、则可以合理地确保在该函数调用期间发生看门狗复位。 确实、在设置标志之前有可能发生看门狗复位、但是根本原因将不同于 SysCtlClockFreqSet()函数。

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

    尊敬的 Bob:

    谢谢-非常感谢。

    现在、有几个很好的记录-这里-'SysCtlClockFreqSet()'有、'Set near Records for '

    • 供应商更新、修改、延长、更正的次数
    • 大小-代码的范围很广
    • 可能发生混乱

    我接受您的"深入描述"、尤其是因为您"允许"比赛或接近比赛"条件(对冲警报)-之前已注明。

    员工/我"假设"对"深度和广度"进行了"内部辩论"-使用"单 MCU 时钟设置函数"提出了要求!

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

    [引用 user="BP101]\n 我们似乎有类似的问题,想知道您运行的是哪个版本的驱动程序库? 我使用的是21171、而更新的是214178、这会粗鲁地更改先前的 Tivaware 版本 PYSDIV 位和 PLL 频率除数寄存器设置。[/QUERP]

    2.1.4.178 -最新版本

    [引用 user="BP101"]是否已在 ARM 链接器设置下偶然启用项目保持看门狗?

    它并不像您可以意外为 ARM 目标启用的那样、因为您显然 需要定义 WDTCTL_sym 才能使其正常工作、但它未指定(关闭)。 在到达 main 之前、我不启用看门狗。  

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

    [引用 user="Bob Crosby">作为替代方法、请考虑指定一个设置为标志的静态变量、以指示您正在设置 PLL。 如果发生看门狗复位、请检查该标志以查看您是否在代码的关键部分设置 PLL 频率。

    这似乎是一个更安全的选择。 谢谢。