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.

[参考译文] TM4C1290NCZAD:(再次)计时器计数器更新导致意外的程序停止

Guru**** 2914580 points

Other Parts Discussed in Thread: TM4C1290NCZAD

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1646657/tm4c1290nczad-again-unexpected-program-halt-caused-by-timer-counter-update

器件型号: TM4C1290NCZAD

因为没有响应,我创建了一个新的线程。

尊敬的专家:

我的客户正在 使用 TI TM4C1290NCZAD 和 TI DriverLib 开发两相步进电机的控制程序。  这 不是基于 PWM 的电机控制。 相反、通过在每次中断时更新下一个计时器值来加速和减速电机。

在运行期间、他们发现程序随机停止运行的问题。  可通过对电路板进行下电上电来恢复系统。
发生该问题时、也无法通过 JTAG 调试器进行连接、并且调试环境中会显示以下错误消息:

“Cortex_M4_0:连接到目标时出错:(错误–2062 @ 0x0)无法停止器件。 重置器件、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、和/或尝试更可靠的 JTAG 设置(例如下 TCLK)。 (仿真包 8.0.27.9)“

经过我们的调查、他们发现问题可以通过在更新计时器计数器值之前停止计时器一次、然后在更新后再次启用计时器来解决。

具体而言、他们实现了以下 / 序列:
TimerDisable (TIMER0_BASE、TIMER_A);
TimerLoadSet (TIMER0_BASE、TIMER_A、(wTimer - 1));
TimerEnable (TIMER0_BASE、TIMER_A);Disable()Enable()

我们的问题如下:

  • Q1:如果更新 计时器计数器值而不停止计时器,则可能发生什么类型的故障或异常行为?
  • 问题 2:从设计和规格的角度来看、上述 停止和重启计时器的权变措施是否是适当的解决方案?

初始化代码如下所示。

SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER0);
while(!SysCtlPeripheralReady (SYSCTL_PERIPH_TIMER0));
TimerDisable (TIMER0_BASE、TIMER_A);
TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODENT);
TimerPrescale Set (TIMER0_BASE、TIMER_A、0);
TimerLoadSet(TIMER0_BASE、TIMER_A、(g_timerPeriod –1));
TimerUpdateMode (TIMER0_BASE、TIMER_A、TIMER_UP_LOAD_TIMEOUT);
TimerIntClear (TIMER0_BASE、TIMER_TIMA_TIMEOUT);
TimerIntEnable (TIMER0_BASE、TIMER_TIMA_TIMEOUT);
IntPrioritySet (INT_TIMER0A、4);
IntEnable (INT_TIMER0A);
TimerEnable (TIMER0_BASE、TIMER_A);

此致、
正常

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

    嗨、O.H

    我稍后会检查以下 2 个问题并在稍后回复您

    • Q1:如果更新 计时器计数器值而不停止计时器,则可能发生什么类型的故障或异常行为?
    • 问题 2:从设计和规格的角度来看、上述 停止和重启计时器的权变措施是否是适当的解决方案?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、 李晓东

    感谢您的回复、很抱歉耽误您的时间。 是否有任何更新?

    此致、
    正常

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

    嗨、O.H

    Q1:如果更新计时器计数器值而不停止计时器,则可能发生什么类型的故障或异常行为?

    由于通用计时器模块 (GPTM) 硬件寄存器的同步方式、在不暂停外设的情况下动态更新计时器负载值可能会触发多个关键故障:
    1 严重的 CPU 和 JTAG 耗尽(锁定的根本原因)

    •机制:如果 TimerLoadSet() 在硬件计数器转换的确切时刻更新目标寄存器,它可能会产生无效的内部状态或立即下溢。
    •结果:计时器硬件可能会标记连续、不可清除的超时中断或进入超高频中断周期。
    •系统锁定:由于计时器中断具有更高的优先级或立即保持挂起状态、Cortex-M4 内核将其 100%的周期用于为 ISR 提供服务。 它缺少后台任务并完全丢弃 JTAG 调试访问端口 (DAP) 通信线路、抛出错误–2062。  请参阅: https://software-dl.ti.com/ccs/esd/documents/ccs_debugging_jtag_connectivity_issues.html

    2.错过超时或极端步骤延迟
    •机制:默认情况下、TM4C129x 使用立即重新加载更新运行。 如果当前计数器值为 0x00000005、并且程序向寄存器写入诸如 0x0000FFFF 之类的新值、则计数器在周期中复位。
    •结果:相反、如果当前计数器值已经相对于新配置传递了一个点、则硬件可能会完全错过其比较或超时匹配。 在向下计数器中、它可能会强制模块在完整的 32 位整数翻转周期 (0xFFFFFFFF) 内一直计数、使步进电机的下一个脉冲停止数百万个时钟周期。 请 参阅:TM4C129x 计时器运行 

    3.步进电机加速抖动
    •机制:修改运行计数器会破坏当前步长配置文件的精度。
    •结果:步骤要么突然截断(在电机中产生剧烈的咬接)、要么过度拉伸、从而扭曲加速和减速曲线。 请 参阅:TM4C129x 计时器运行

    问题 2:从设计和规格的角度来看、上述停止和重启计时器的权变措施是否是适当的解决方案?

    是的、实现的权变措施 非常合适、稳健、并且 从设计和规格的角度强烈建议使用。

    请参阅: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/414478/tm4c129-timer-capture-with-ti_rtos

    为什么此解决方案正确
    •保证确定性:调用 TimerDisable () 会完全冻结外设的内部数字逻辑状态机。 这消除了 CPU 写入配置寄存器和计时器递减计数之间的硬件竞争条件。
    •无干扰电机曲线:通过禁用计时器、更新确切的重新加载间隔并再次启用、您可以确保每个单步脉冲都与预期的数学计算相匹配。  请 参阅:TM4C129x 计时器运行 

    谢谢!

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

    嗨、 李晓东

    感谢您的支持。 我明白了。  如果我们收到客户的任何其他问题、我们将与您联系。

    此致、
    正常

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

    嗨、O.H

    我可以关闭此主题吗? 如果有更多问题、请再次与我联系

    谢谢

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

    当然、 如果我收到任何其他问题、我将创建一个新主题。

    此致、
    正常