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.

[参考译文] MSP430F5249:使用 driverlib 进行时钟设置

Guru**** 2533180 points
Other Parts Discussed in Thread: MSP-TS430RGC64C, MSP-FET

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/721324/msp430f5249-clock-setup-using-driverlib

器件型号:MSP430F5249
主题中讨论的其他器件:MSP-TS430RGC64CMSP-FET

MSP430团队、

一个奇怪的问题。  我在 MSP-TS430RGC64C 板中使用 F5249器件、但设置时钟时遇到问题。  我正在使用 driverlib 将 MCLK 设置为25MHz、并且 ACLK=REFO = 32768Hz。  以下是我的代码:

我还在示波器上测量 MCLK。  问题是只有在我在_no_operation()处设置断点(然后继续执行)时代码才能正常工作。  无论有无断点、ACLK_VALUE 和 MCLK_VALUE 都是正确的(ACLK_VALUE = 32768、MCLK_VALUE = 24969216)。  但是、如果没有断点、示波器显示的 MCLK 约为8.1MHz。  使用断点、示波器显示25MHz 的 MCLK。

有什么想法吗?  我已经对此进行了一段时间的调试、但找不到问题。

谢谢、此致、

David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    FLL 需要一些时间来调整频率。 使用 UCS_initFLSettle()等待它。

    PMM_setVCore()以多个步骤自动提高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我现在已经解决了这个问题。 它与在主循环中进入低功耗模式相关。

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

    [引述 USER="Clemens Ladiscy] FLL 需要一些时间来调整频率。 使用 UCS_initFLSettle()等待它。

    PMM_setVCore()以多个步骤自动提高电平。

    [/报价]
    Clemens、
    感谢您的回答。  PMM_setVCore ()很好。  我移植了非 DriverLib 代码、每次增加一级。  我在这里没有仔细阅读 DriverLib。
    在 UCS_initFLSettle()上,只需将超时添加到 UCS 故障检查循环。  UCS_initFLL()将一直循环,直到所有故障消失。
    我从主循环中删除了 LPM3条目、现在情况正常、这有点奇怪。  为了我的目的、这现在已经足够好了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    FLL 不会在 LPM3中运行、因此 DCO 保持当时达到的频率。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    我很高兴听到现在已经解决了这一问题。
    我这边的最后一点意见是、在和活动调试会话期间测量时钟也可能会导致问题。 因此、您还可以检查在未连接 MSP-FET 的情况下是否仍然存在此问题。

    正如您所说的、它可以为您的目的工作、我将继续并关闭此主题。
    如果有其他待决问题、请回复重新打开。

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

    布列塔、

    这里仍然有一些奇怪的东西,我不想只是继续并点燃它。  我的完整代码非常简单。  初始化时钟、设置计时器中断并进入 LPM3。  在 计时器 ISR 中、我从 USCI_A0_UART 发送一些内容。  我实际上注意到了这个问题、因为 UART 通信失败了。  我将问题归咎于 DCO/FLL 产生的错误时钟频率(因此 UART 处于错误的波特率)。  无论是否连接了调试器、都会发生这种情况。

    我用手动配置替换了 driverlib 时钟初始化、问题解决了。  主要区别在于、在轮询振荡器故障之前、手动设置中存在额外的延迟环路。  如果我返回到 driverlib 版本并在调用 UCS_initFLL()后添加相同的延迟、则 driverlib 版本有效。  或者、如果我从 FLL 设置的手动版本中删除了_delay_cycles (782000L)、它也会失败(即、UART 通信失败时 MCLK 错误)。

    我还可以查看 P4.7上的 MCLK 输出信号。  如果我禁用中断并停止调试器(在 LPM3模式下)、MCLK 信号会死(平坦线)、这是由于 DCO 关闭而预计的。  到目前为止都很好。

    但是、如果我在计时器 ISR 中设置了一个断点、我可以看到对于 driverlib 和手动配置版本、MCLK 是不正确的、没有延迟。

    那么、我们为什么需要该延迟呢?  我从 F524x 器件的 TI 示例中获取了延迟。

    如果您想继续执行该操作、我可以发送我的 CCS 项目。

    此致、

    David

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

    感谢您对此进行详细介绍。
    我想用其他硬件重现您的发现、看看是否确实存在与 driverlib 示例相关的软件问题。
    如果我理解正确、您说在使用最新 driverlib 版本中的确切示例时存在问题、对吧? 您能否快速说明您使用的确切示例?
    如果您能将 CCS 项目发送给我进行测试、我也将不胜感激。 然后、我会回来与您讨论我的调查结果。

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

    您好、Britta、

    不、我没有准确地使用 DriverLib 示例、因为这些示例不执行我正在执行的操作、特别是在设置时钟后进入 LPM3模式。

    这个问题可以从 一个问题开始、现在我们可以从 DriveLib 中解决。  在 MSP430F524x 软件示例 SLAC620.f、示例 msp430F524x_USC_10.c 中、它按如下方式初始化时钟:

    我在代码中也做了类似的事情。  现在、如果您随后进入主循环的 LPM3模式、则退出 LPM 时钟正确。  也就是说、MCLK 为25MHz。  您可以在示波器上看到它。  但是、如果您从上述代码中删除了_DELAY_CYCLLES (782000)语句、则 MCLK 不正确。  它大约为7.5MHz。

    问题是、您为什么需要此延迟?  延迟检查 DCOFFG 故障后的 DO{}循环。  如果 DCO 未稳定、您将继续在这里循环、直到它稳定。  对吧?

    编辑:好的、我读取了更多内容、并且看到只有当 DCOx 被设定为0或31时 DCOFFG 标志才被置位。  它不会检测 DCO 的稳定性、而是检测端点设置。  不过、即使没有延迟、FLL 最终也应稳定在25MHz。  它不是。  一旦您首次进入 LPM3、它永远不会恢复。

    end_edit

    缺少延迟是当我进入 LPM3模式作为主循环时 DriverLib 无法正常工作的原因。  DriverLib 在函数 USC_initFLL()中没有这个额外的延迟。  因此、如果需要、我们可以问为什么 DriverLib 没有延迟。

    我已附加我的 CCSv8.1项目。  现在已经配置好了、它使用时钟的手动配置(而不是 DriverLib)、我将延迟留在那里。  所以、一切都正常。  您可以在引脚 P4.7的示波器上观察到 MCLK 为25MHz。  现在进入 clocks.c 并注释掉该延迟。  现在运行代码时、MCLK 大约为7.5MHz。  意识到我在 LPM3中花费的大部分时间是 MCLK 处于非活动状态。  但是、示波器会触发关闭 MCLK、 因此您只能在 MCLK 处于活动 状态时看到它。  我有一个将系统以2Hz 的速率唤醒的计时器。

    e2e.ti.com/.../MSP430F5249_5F00_UsciA0_5F00_UART_5F00_DriverLib_5F00_2018Aug24.zip

    此致、

    David

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

    我已经解决了这个问题。  克莱门就在附近。  FLL 不在 LPM3下运行。  我们知道这一点。  但我没有意识到、除非您手动清零 SR 寄存器中的 SCG0位、否则 FLL 不会在从 LPM3退出时启动。  我在5xx 用户指南 SLAU208q 中发现了这一点:

    5.2.10低功耗模式下的 FLL 运行
    如果 SCG1、CPUOFF 和 OSCOFF 置位、则中断服务请求会清除 SCG1、CPUOFF 和 OSCOFF、但不会清除 SCG0。 这种情况
    意味着对于 FLL 运行、从 LPM1、LPM3或 LPM4输入的中断服务例程内、
    FLL 保持禁用状态、DCO 按照 UCSCTL0和中定义的前一设置运行
    UCSCTL1。 如果需要 FLL 操作、SCG0可由用户软件清零。

    因此、在我的 ISR 中、我清除了再次启动 FLL 的 SCG0。

    这里要做的是、我在配置时钟后很快进入 LPM3。  FLL 尚未锁定、因此正如 Clemens 提到的、当我退出 LPM3时、DCO 以任何设置运行。  通过 在 ISR 中再次启动 FLL、继续调整 DCO (直到我在 ISR 之后返回到 LPM3)。  ISR 实际上非常短、在 FLL 锁定到正确的频率之前执行了几次 ISR。  您可以在 UART 通信中看到这种情况(在我最终正确通信之前、我收到了几个错误的接收字符)。

    这实际上是一个非常微妙的问题、尤其是对于在启用 FLL 后不会增加延迟的 DriverLib。

    我将关闭此主题。


    此致、

    David

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

    再次感谢您在此处发布您的调查结果。
    我很高兴你已经解决了这个问题、但我知道这很棘手。 我将在我们的文档中进一步强调这一点是否有意义。
    感谢您与 E2E 社区分享此内容。 我确信这将有助于其他人遇到相同的问题。

    此致、
    Britta