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.

[参考译文] TM4C129XNCZAD:在 CCP 转换时启动定时器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/566397/tm4c129xnczad-start-timer-on-ccp-transition

器件型号:TM4C129XNCZAD

我想让计时器在输入切换时以系统时钟的速率启动和递增。  我假设输入将是与定时器关联的 CCP 管脚、并考虑到这一点设计了硬件。

我看到有一种方法可以将计时器设置为单次触发模式、以便在其"链"中的另一个计数器触发时启动计数器、但看不到如何根据输入执行该操作。

我知道在输入切换时可能会发生中断、我可以在 ISR 中检查系统时间、但与此相关的延迟有多种-这是计时器的点。


具体而言、我希望将计时器用作误差计算器。  我将有一个 ISR、由连接到另一个 GPIO 的同一信号触发。  计时器的重点是、我将能够通过检查 ISR 中计时器的幅度来确定中断的精确延迟。

是否有方法通过 Tivaware 进行设置、或者如果没有、直接寄存器访问?

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

    Greg、有趣的问题... 我会假设这是"很可能的"、但我在 Tivaware (NOR 或直接寄存器)上找不到答案。 显然、不存在这样的"计时器启动触发器"。
    但是、也有一些选项。 查看此主题:
    e2e.ti.com/.../564508
    您可以很轻松地保持计时器计数器的滚动、在第一次转换时读取事件计数器、然后在第二次转换时再次读取-您应该会发现您所需的差异。 请注意、有一个寄存器保存发生引脚转换时的精确计数器值。

    BTW:如果 TimerValueGet ()从连续计数寄存器(一个偏移量0x050)或"边沿最后一个事件寄存器"(一个偏移量0x048)读取、则 TivaWare 文档不会将其清除。 我必须直接查看代码才能找到它。 TI 可能会为两者创建单独的函数、因为 API 说明可能会误导开发者。 如今、我很少通过直接读取寄存器值而不是使用 TivaWare 调用来读取计时器计数器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在一个显著的兔子洞之后:根据所引用的示例、我想我必须使用 DMA 在 CCP 触发时抓取计时器值...

    我发现该计时器可以配置为"输入边沿计时模式"(在您的答案中提到)、在该模式下、计时器可以自由运行、并且配置的 CCP 事件会导致当前计时器值被注入 HW 寄存器。 然后、在 ISR 中、我可以在当前计时器值和鼠标值之间执行一个增量。

    我建议回答这个问题、如果我回答正确、请验证。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只有原始海报(即您在此处)可以"验证"答案。 此类信息应在您查看此主题中的任何帖子时显示...

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

    请注意、使用输入边沿计时模式时、在超时(翻转)边界上发生两个事件、因此无法确定此类翻转的数量。 将计时器与周期计时器同步是安全的、这样可以对超时进行计数以正确确定时间间隔。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    明白。

    该事件大约每4秒发生一次。

    我希望你和我一样有信心在这个时间范围内为中断提供服务。 )

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

    中断正常。 它的服务速度相当快。 但是、由于偶数发生在秒范围内、我希望您实施超时计数器、并且能够对滚动数进行计数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定您是否理解。 计时器用于确定(和偏移)中断延迟。 根据定义、每次事件发生时都会生成中断。 ISR 将在翻转周期内发生。 如果不是这样、则会出现更大的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Greg

    现在、让我们假设边沿以计数0xFFFE 捕获。 中断处理程序需要12-14个时钟周期来执行。 现在记录了捕获时间、但发生了翻转、当前计数接近0x000A。 这种情况一定会在某个时间点发生。

    我不确定您通过记录边沿和 ISR 执行的当前计时器值来尝试执行什么操作。 也许有必要提供详细的解释。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Greg Winters45"]如果不是这样,则会出现更大的问题。

    Greg、

    那么、确实存在更大的问题。 但这不是 MCU 问题、而是实施策略一。

    当中断发生时、您的 MCU 可能正在处理另一个中断-可能是一个简短的25个周期1 -但仍然会在适当注意您的定时器 IRQ 之前完成该操作。 在另一个时刻、您的 MCU 可能在主线程中不执行任何操作、并立即处理请求。 简单:它不是确定性的。

    这就是你需要做的就是在转换发生时(通过 GPTMTAR 寄存器)使用计数器值的原因。 如果您在14或75个周期之后处理事件、您仍可以使用正确的即时信息!

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不需要、您无需使用 DMA 来获取 CCP 事件计时器的值。
    关于该帖子的讨论仅指出、由于 DMA 比中断/复制速度更快、因此选择使用 DMA 将让您测量"距离更近"的事件、而不是使用。 但这仅在我们谈论纳秒时适用。
    只需读取 GPTMTAR 寄存器。 您的家庭作业是弄清这是什么、以及哪个 Tivaware 函数(如果有)将为您完成这项工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    布鲁诺:

    很抱歉、您的原始帖子听起来让我不感激。  这不是我的目的、研究 DMA 路径很有趣、但在确定如何使 DMA 实际触发时、我看到、正如您所指出的、在捕获事件的点、计时器模块(而不是 ARM CPU) 将一个定时器当前值的副本保存到硬件寄存器(GPTMTAR)中。  这甚至比 DMA 更快、因为没有可能的总线冲突。  然后、当 ARM CPU 最终接近处理中断时、您可以使用 GPTMTAV 和 GPTMTAR 之间的差异来计算 ARM CPU ISR 延迟(这是我想要的)。  因此、无论 ISR 开始执行需要多长时间、我都确切知道信号发生的时间。

    我直接使用 HWREG 宏来访问 GPTMTAR 寄存器。  当 Tivaware 不足时、我可以直接操作。

    谢谢、

    Greg

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您在谈论滚动时还在谈论其他事情。
    您所描述的内容可以通过检查负结果以及在加载值中重新加载(在递增计数时)来轻松处理。
    我已经添加了代码来处理这种情况。
    谢谢、Greg
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Greg Winters45"]如果我对您的原始帖子听起来不感激,那我会很抱歉。

    不是,格雷格!!!

    我也不是要暗示这一点! 有时、通过读取器的瞬时偏置产生的双绞线来读取短信...

    我们总是很高兴能尝试和帮助那些有奉献精神的研究员。 在我在这个论坛上读到/收到的所有帖子中、只有一个事件让我感到很失望-然后我很清楚这是不喜欢的!

    谢谢

    布鲁诺

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

    不仅仅是负面结果。 但会产生偏离结果。 由于计时器在翻转时不提供超时中断或加载中断、我们如何确保发生翻转的次数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是顺序:

    1. 捕获事件发生、这将导致发生两件事情:
      1. 定时器的当前值被保存到 GPTMTAR 中
      2. 捕获中断被挂起。
    2. 不久的将来、在 GPTMTAILR 中值指定的计数数量内、ARM CPU 处理挂起的捕捉中断(不能发生多次翻转)。
    3. 在捕获 ISR 中、将 GPTMTAV - GPTMTAR 放入一个名为"DIFF"的变量中
    4. 如果发生翻转、GPTMTAV 将小于 GPTMTAR、"DIFF"中的值将为负。 在这种情况下、添加 GPTMTAILR 中存储的值。  这将为您提供正确的时间差。

    如果您想某个东西可能会在很长的时间内屏蔽中断、从而导致多次发生翻转、那么理论上是这样的、但在本例中不是这样。  在我的应用中、中断不会被长时间屏蔽。

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

    您好 Greg

    您对其进行了很好的总结。

    [引用 user="Greg Winters45">如果您想在很长的时间内屏蔽中断、导致多次发生翻转、那么理论上是这样的、但在本例中不是这样。  在我的应用程序中、中断不会被长时间屏蔽。[/quot]

    这是我希望您保护代码的内容。 另外、如果应用中发生了类似的情况、可能也无法检测到翻转计数、提示看门狗执行 NMI 操作。