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.

[参考译文] TM4C1294NCPDT:计时器复位功能仅在某些周期内有效

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/612583/tm4c1294ncpdt-timer-reset-function-works-for-only-for-some-cycles

器件型号:TM4C1294NCPDT

大家好、

我想为从 UART 接收到的每个字节重置计时器。 计时器复位仅在某些周期内有效,之后计时器根本不工作。

下面用于重置计时器的代码。

TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TimerDisable (TIMER0_BASE、TIMER_A);

HWREG (TIMER0_BASE + 0x50)= 50000;
TimerEnable (TIMER0_BASE、TIMER_A); 

因此,一旦接收到完整的堆栈,当数据再次作为计数器发送时,计时器将被禁用并重新启用。 该配置仅在启用和禁用计时器的4个周期内有效。 此时中断的产生将停止、此时定时器 已加载上述定时器值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "仅适用于4个周期..."
    什么情况?

    计时器可以是一次性计时器、它仅对一个计时器周期进行计数、然后停止计时、也可以是周期性计时器、连续计时。 您未显示如何配置计时器。

    此外、在我看来、您的问题与计时器无关、 但是、实际上您不再在 UART 上接收字节(或者、您可能只启用 RX 中断而不启用 RT 中断、因此您无法获得 UART 接收超时检测。

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

    您好 Bruno、

    感谢您的回复。
    配置被设置为一次性,但我没有在 UART 中启用流控制。 程序工作的流程是,当我接收到字节时,计时器被置于值0,然后通过中断表示通信完成,然后在中断处理程序中被禁用,接收到的整个数据包。 然后、每个查询都会执行相同的过程。但这里的问题是、我只能进行查询、并使流工作4次、尽管我尝试刷新代码的次数是多少。 在 SAW 调试窗口第4次复位计时器以加载值、但计时器不会计数、而是会计算接收到的整个数据包、因此该过程正在等待中断解析数据。

    很抱歉,如果我在问题中误导您

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Santhosh、
    您正在寻找的兔子在错误的灌木中。 该问题与您的计时器设置无关。
    尝试更简单的安排: 也许只需将电路板的一个 GPIO 配置为输出、并在接收到 UART 字节时将其切换(我是说移除计时器控制线、只需在打开计时器的相同程序位置切换引脚)。
    您可能会发现一段时间后没有收到 UART 中断... 如果这不是真正的原因、至少有助于您隔离真正的问题。
    请告诉我们、祝您好运。
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来您是在尝试响应通信超时、如果某个字节在一段时间内未到达、则会触发一些操作、但如果该字节到达、则不会触发操作。

    如果是这样,那么几天前我也有类似的问题。 看看下面的主题...

    e2e.ti.com/.../2254622

    我正在使用计时器来响应预期事件的超时。 如果事件没有发生、定时器会停止运行并触发中断。 如果事件发生、定时器将重新启动、这样它就不会触发中断、并且该过程再次开始。

    在我的情况下重新启动计时器只需要调用 TimerLoadSet()。 仔细阅读该线程中其他用户的注释,因为为使 TimerLoadSet()获得该结果,在配置定时器时必须调用 TimerUpdateMode (Timer1_base、timer_B、timer_up_load_immediate),以便 GPTMTnMR 寄存器中的 TnILD 位清零(0)。 否则 TimerLoadSet()将不会执行您希望它执行的操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、12/12、

    感谢您的答复和分享未记录的信息、上述情况清楚地描述了我所面临的问题