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.

[参考译文] MSPM0L1306:如何检测 GPIO 在计时器周期内是否有上升沿?

Guru**** 2897200 points

Other Parts Discussed in Thread: MSPM0L1306, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1646434/mspm0l1306-how-to-detect-that-a-gpio-had-a-rising-edge-during-a-timer-period

器件型号: MSPM0L1306
主题: SysConfig 中讨论的其他器件

大家好、我已经浏览了关于计时器、GPIO 和事件结构的学院示例和教程。 我们的目标是将 GPIO 上升沿路由到计时器(捕获)、这样在计时器周期结束时、我们可以确定 IO 引脚上是否存在任何活动(例如任何数量的上升沿)。 我们不希望在每个上升沿中断或唤醒 CPU、只希望在时间周期结束时唤醒、并知道是否存在至少一个上升沿。

这似乎应该是可能的,但我们找不到任何例子,我们试图构建一个不起作用(项目代码在这里: gpio_to_timer_event.zip )  。 我们需要的内容类似于 SDK 中的“comp_dac_timer_event“示例、但该示例在每个比较器事件时唤醒、我们需要保持低功耗模式、直到计时器到期。

我们的工程(使用 MSPM0L1306 Launchpad)使用 syscfg 定义计时器、GPIO 引脚和事件结构以捕获计时器捕捉寄存器中的上升沿。 但是、当我们在时间段结束时读取捕获寄存器时、即使计时器运行时存在(许多)上升沿、它们也始终读为零。

希望获得任何帮助、建议或工作示例。

 

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

    您需要的是“边沿计数“;这在 timx_timer_mode_compare_edge_count 示例中进行了演示(此处)。 此示例对 CTR 中的边沿进行计数、然后在 CTR 达到 5 时中断。 将加载值任意设置为高电平相对容易(因此 CTR 永远不会达到它)、然后以间隔获取 CTR 值。

    我怀疑您想使用相同的计时器来计算和测量间隔。 可以完成此操作、但 Driverlib / SysConfig 不会太简单。 最方便的做法可能是采用第二个计时器、在周期模式下使用该计时器(重复向上计数到加载值)、并在加载中断时获取第一个计时器的 CTR。

    【编辑:轻微澄清】

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

    谢谢、这正是我需要的样本、以了解如何完成此操作。 我修改了它以添加另一个(间隔)计时器、它定期读取计数器(我不够专业,不能尝试让同一个计时器同时读取计数器)。 我设置计数器计时器时不进行中断、因为我永远不希望它唤醒系统。

    我将计时器计数设置为最大 (65535) 和 “边沿计数递增计数“模式。 在间隔计时器 ISR 中、我读取该计数器、然后将其复位为零、以便在每个周期内开始:

          edgeCount = DL_TimerG_getTimerCount(COMPARE_0_INST);
          DL_TimerG_setTimerCount(COMPARE_0_INST、 0);
          如果 (edgeCount == 0){
            //最后一个时间段内没有事件
          }
          否则
            //在最后一个时间段内至少有一个事件
          }
    我想在读取计数器和将其设置为零之间存在一个很小的竞态条件、这样可能会错过一个事件。 我假设 ISR 可以存储最后一次读取的计数并与该计数进行比较,而不是零,并跳过 setTimerCount() 调用(并假设它将在 65535 时翻转)。
    感谢您的帮助、让这个概念验证发挥作用。