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.

[参考译文] RTOS/TM4C129XNCZAD:深度睡眠导致 PWM 和 USB 问题

Guru**** 2024750 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/628752/rtos-tm4c129xnczad-deep-sleep-causing-issues-with-pwm-and-usb

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

工具/软件:TI-RTOS

尊敬的所有人:

我正在使用定制板进行 MCU 深度睡眠模式实施。 下面给出了配置详细信息

  1. 选择 MOSC (25MHz)作为深度睡眠的时钟源、并在深度睡眠中关闭 PIOSC。 运行时时钟配置为60MHz。
  2. HAL 计时器4在进入深度睡眠之前配置了10秒中断。
  3. 定时器、USB、PWM 及其相关的 GPIO 端口模块在深度睡眠中通过 SysCtlPeripheralDeepSlepEnable()启用。 通过 SysCtlPeripheralClockGating (真)启用外设时钟门控。
  4. 在进入深度睡眠之前、SysTick 也会被禁用、而在从深度睡眠中唤醒后、SysTick 也会被重新启用。 如果未添加此步骤、MCU 会立即从深度睡眠状态唤醒。
  5. 在禁用 SysTick 并进入深度睡眠之前、我正在使用__asm (" CPSID I")。 此外、_asm ("CPSIE I")在从深度睡眠模式唤醒并重新启用 SysTick 后使用。 使用这两个汇编指令 可确保先执行这些指令之间的代码、然后执行任何其他中断或进一步的代码。

我所面临的问题是、仪器进入深度睡眠后、它仅在定时器中断时唤醒、即在10秒后唤醒。 连接 USB 不会导致它从深度睡眠中唤醒。 PC 上显示一条消息、指出 USB 设备出现故障。 发生此问题后、仅在 MCU 未处于深度睡眠状态时断开并重新连接电缆后才会检测到电缆。

我遇到的另一个问题是、在深度睡眠10秒期间、LED 关闭。 一旦 MCU 从深度睡眠状态唤醒、LED 将再次打开。

请告诉我 在这里遗漏了哪些可能导致这些问题的原因、以及如何解决这些问题。 提前感谢。

Muhammad Shuaib.

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

    为了使 USB 正常工作、PLL 必须工作以提供60MHz 时钟。 在深度睡眠模式中、PLL 被禁用、因此 USB 不能按预期工作、PC 会针对 USB 器件出现故障给出错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Muhammad、
    您能否检查系统时钟在深度睡眠期间是否处于活动状态? 由于没有更多 LED、因此在深度睡眠模式期间似乎系统时钟丢失。 您能使用 SysCtlPeripheralClockGating (false)进行实验吗?它会产生什么影响吗? 这将强制外设的时钟频率与运行模式中的时钟频率相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!
    感谢您的解释。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    感谢您花时间评论此帖子。

    如果 USB 不能在深度睡眠中工作、那么 SysCtlPeripheralDeepSlepEnable 的用途是什么? 或者、此功能是否不适用于 USB?
    此外、如果出现上述情况、是否仅在 MCU 未处于深度睡眠状态时才会检测到 USB 电缆?

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

    每个外设都具有深度睡眠功能。 但是、外设时钟必须正确、外设才能正常工作。 电缆检测可能仍然有效、但在时序不符合结果的情况下、可能是不确定因素。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    感谢您的更新。

    我将尝试此操作并分享我的结果。

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

    在10秒深度睡眠的情况下、问题不仅在于未检测到电缆。 一旦电缆检测失败、当 MCU 处于深度睡眠状态且 PC 显示错误消息"USB 设备出现故障"时、即使从深度睡眠模式唤醒、也无法再次工作。 使电缆检测正常工作的唯一方法是仅在 MCU 未处于深度睡眠状态时连接电缆。
    因此、我看到 USB 器件在深度睡眠模式下保留的方式是、它将在深度睡眠模式唤醒后工作、并且不需要任何额外的配置来将 USB 恢复到其工作状态。 但是、检测电缆需要一段时间(尚未确定多少时间)、在此期间不得将 MCU 置于深度睡眠模式。 深度睡眠只能在移除电缆时启动、即 USB 挂起事件已作为最后一个事件接收。

    请在就 USB 电缆检测是否能够工作或不能在深度过程中进行之前分享您对是否仍缺少任何详细信息的专家意见。

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

    Amit、您好!

    我查看了与同一问题相关的另一篇文章、并尝试了该文章中提到的解决方案、即使用 DRISC 和漂移寄存器。 我仍然无法通过 USB 连接将 MCU 从深度睡眠模式唤醒。 此外、当我没有将 MCU 置于深度睡眠模式时、我查看了 IAR 中的 USB 寄存器、发现 DRISC 电阻显示的是"W"而不是有效值。 我无法修改该寄存器。 您对这里的情况有什么看法吗? 下面是我所提到的帖子的链接。

    谢谢、

    Muhammad Shuaib.

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

    尊敬的女士:

    为了补充 Amit 对休眠模式下 PLL 禁用的评估、我记得 在一段时间前发布 了一个有关 RTOS 和 PLL 的问题、  需要一个补丁才能使其正常工作。 也许 他们已经 在 RTOS 的较新版本中修补了它。

    [引述 USER="Muhammad Shuaib"]我所面临的问题是仪器进入深度睡眠后、它仅在定时器中断时(即10秒后)唤醒。[/QUERP]

    您 是否会发现 MCU 在    不切换唤醒引脚的情况下无法在与 MCU 连接的外部接口的任何点(例如 USB 电缆端口)从休眠模式进行磁性唤醒、这一点并不奇怪? 延迟中断之前的时间间隔  

    您的帖子还 提到 了 PWM 外设、但尚未 发布任何评论。  

    [引用用户="Muhammad Shuaib"]一旦 MCU 从深度睡眠状态唤醒,LED 就会再次打开。

    您是否 不希望 甚至不希望 GPIO 外设和 LED 在深度睡眠时关闭 、以便在 休眠模式下节省电池电量?   让休眠模式在休眠事件期间使 LED 保持亮起、这似乎不是一种反直觉的做法?

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

    您好 BP101:

    感谢您花时间添加到此帖子。

    我们使用的是最新版本的 TI RTOS 2.16.1.14。

    我相信、只有休眠模块在休眠模式下处于活动状态、并且同意您的意见。 但是、我在休眠模式方面没有遇到任何问题。 相反、正如我先前提到的、我在深度睡眠方面遇到了问题。 我相信我们在这里看到的页面是一样的、深度睡眠和休眠是不同的、有两种不同的功耗模式。 你是对的。 在休眠模式下、我确实需要关闭外设并节省能源、并且能够以这种方式工作。 但在深度睡眠方面、我确实需要一些外设在深度睡眠中保持启用状态、这对于除 USB 和 PWM 之外的所有器件都可以正常工作。 人们认为 PWM 可用于深度睡眠、这来自于随 TIVAARE 提供的 EK-TM4C1294XL 示例。 有一个名为睡眠模式的示例、其中配置了 PWM 的 LED 即使在深度睡眠模式下也能继续工作。

    我还尝试使用 SysCtlPeripheralClockGating (false)、但这似乎无法解决 PWM 或 USB 的问题。 当我的仪器进入深度睡眠状态时、LED 熄灭。 请分享您对我在这里可能遗漏的内容的看法。

    谢谢、

    Muhammad Shuaib.

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

    我已经尝试使用 SysCtlPeripheralClockGating (false)。 我甚至尝试了 PIOSC (SYSCTL_DSLP_OSC_INT)作为深度睡眠的时钟源。 不过、只要仪器进入深度睡眠状态、LED 就会熄灭。 我在深度睡眠模式中启用了 LED GPIO 端口和 PWM0模块。 您能评论一下我在这里可能遗漏的内容吗?

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

    [引用用户="Muhammad Shuaib"]。 但在深度睡眠方面、我确实需要一些外设在深度睡眠中保持启用状态、这对于除 USB 和 PWM之外的所有器件都可以正常工作

    Amit 说、在深度睡眠期间 PLL 电源被关闭、   这是否合理、PWM、 USB 外设不能将 PLL 用作时钟源、也不能进入深度睡眠?

    [引用 USER="Muhammad Shuaib"]人们认为 PWM 可以在深度睡眠下工作、这是来自 随 TIVAARE 提供的 EK-TM4C1294XL 示例[/quot]

    是的、它们使用高电流 LED 来证明休眠模式(深度睡眠)不会影响 PWM 模块的电源。

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

    您说得对、我把休眠与睡眠模式的功能混淆了。 因此、HIB 模块控制外设电源、深度睡眠通过关闭时钟来控制外设功耗。

    在将 PIOSC 设置为深度睡眠时钟源后、您是否曾按照 Amit 的建议将 PWM 模块时钟源更改为使用 PIOSC? 也许不会帮助 INT 上的 USB (外设)唤醒、因为它需要 PLL 时钟源也被更改为 PIOSC、并且来自 PLL 的 USB 必须>=30Mhz。 在这种情况下、MOSC 将被禁用、但 PIOSC 也可以将 PLL 计时为120MHz。

    数据表:

    为了进一步节能、可以通过 DSCLKCFG 中的 PIOSCPD 位禁用 PIOSC
    寄存器。 当发生深度睡眠退出事件时、硬件会将系统时钟恢复到
    在启用已有时钟之前、它在深度睡眠模式开始时的源和频率
    在深度睡眠期间停止。 如果 PIOSC 被用作 PLL 参考时钟
    在深度睡眠期间、它可能会继续提供时钟。 见281页。
    注意:如果在 DSCLKCFG 寄存器中选择 MOSC 作为深度睡眠时钟源
    MOSC 还必须在 RSCLKCFG 中配置为运行和睡眠时钟源
    深度睡眠之前的寄存器。 如果是 PIOSC、LFIOSC 或休眠 RTC 模块
    振荡器(HIBLFIOSC 或32kHz 晶振)配置为运行和睡眠时钟源
    在 RSCLKFCFG 寄存器中、MOSC 被配置为深度睡眠时钟源
    在 DSCLKCFG 寄存器中、可能有两种结果:

    ■如果 PIOSC 在深度睡眠模式下仍然通电(使用 DSCLKCFG 中的 PIOSCPD 位)
    寄存器)、那么在进入深度睡眠和时、PIOSC 被用作时钟源
    器件正常进入和退出深度睡眠状态。 MOSC 不用作
    深度睡眠中的时钟源。
    ■如果 PIOSC 已配置为在深度睡眠中断电、则器件
    可以进入深度睡眠状态、但无法正确退出。 这种情况可以避免
    将 MOSC 编程为 RSCLKCFG 中的运行和睡眠时钟源
    深度睡眠之前的寄存器。

    以提供尽可能低的深度睡眠功耗以及唤醒功能
    处理器、而无需针对时钟的更改重新配置外设、其中一些
    通信模块在模块寄存器空间中有一个偏移量为0xFC8的时钟控制寄存器。
    时钟控制寄存器的 CS 域允许用户选择 PIOSC 或 ALTCLK 作为
    模块波特率时钟的时钟源。 当微控制器进入深度睡眠模式时
    PIOSC 或 ALTCLK 也成为模块时钟的时钟源、从而允许发送和
    接收 FIFO 以在器件处于深度睡眠状态时继续运行。 显示了第242页的图5-6
    如何选择时钟。