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.

[参考译文] EK-TM4C1294XL:使用计时器和中断创建周期性信号时遇到问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/582970/ek-tm4c1294xl-trouble-creating-periodic-signal-using-timers-and-interrupts

器件型号:EK-TM4C1294XL

我正在尝试使用2个计时器创建一个周期性信号、因为我需要的引脚未作为 CCP 进行连接。  一个计时器是周期性的400us 计时器、另一个计时器在递增10us 之前等待触发。  该引脚在400us 计时器中断上变为高电平、在另一个计时器的中断上10us 后变为低电平。

问题是、信号的高电平时间大部分时间为10us、但有时会变化~+/- 4us。 (根据示波器) 它并不总是保持在10us。  发生这种情况的原因可能是什么?

为了方便测试、我附加了该项目、并发布了以下代码片段:

TimerConfigure (TIMER4_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICY_UP | TIMER_CFG_B_ONE_SHOT_UP);
TimerLoadSet (TIMER4_base、TIMER_A、(Board_CLOCK / TIM5_FREQ)- 1);
TimerIntDisable (TIMER4_BASE、TIMER_TIMEOUT、TIMER_TIMEOUT、TIMER_TIMEOUT、TIMEOUT

TimerIntEnable (TIMER4_base、TIMER_TINA_TIMEOUT);

TimerLoadSet (TIMER4_base、TIMER_B、TIM5B_10US);
TimerIntDisable (TIMER4_base、TIMER_TIMB_TIMEOUT);
TimerIntClear (TIMER4_base、TIMER_TIMB_TIMEOUT);
TimerIntEnable (TIMER4_base、 Timer_TIMB_TIMEOUT);
TimerControlWaitOnTrigger (TIMER4_base、TIMER_B、true);

TimerEnable (TIMER4_base、 Timer_A);
TimerEnable (TIMER4_BASE、TIMER_B);

void Timer5A_HWI_Fxn (UARg arg)
{
HWREG (0x40061040)= 0x10;// K4

//清除中断
TimerIntar (TIMER4_BASE、TIMER_TIMER_TIMEOUT);
}TIMER4_BASE




(TIMER4_TIMER)
/ TIMER4_BASE (TIMER4) TimerInter 0x400B (TIMER_TIMER_TIMER);// TIMER4_BASE (TIMER4) TimerInter 0_TIMER (TIMER_TIMER = 0x400B (TIMER_TIMER


e2e.ti.com/.../pwmled_5F00_TivaTM4C1294NCPDT.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Petar:
    首先、您为什么不考虑使用计时器的 PWM 模式来生成具有所需占空比的 PWM? 使用中断来设置和清除引脚的方式在很大程度上取决于生成计时器中断时 CPU 正在执行的任务。 例如、如果 CPU 正在处理其他更高的(非 Timer4)中断或异常。 这将影响进入 Timer4 ISR 的时间。 在 Timer5A_HWI_Fxn 中、您可以在退出 ISR 之前清除中断。 实际清除与 ISR 退出时间相关的标志需要一些周期。 这可能会导致重新进入 ISR。 因此、我建议您将 TimeIntClear 放置在 ISR 的开头、或者在退出 ISR 之前读取标志、更好地将其放置在 ISR 的开头。 这将保证真正清除标志。 最后一点是,当 API 可用于执行相同的函数(即 GPIOPinWrite())时,我们不鼓励用户执行直接寄存器写入。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试了中断清除失效防护、这不是问题。 附加的工程是一个简单的工程、不包含其他中断。  我想在不使用 PWM 的情况下尝试这种方法。

    我只是想知道为什么会发生这种摆动。

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

    当我导入您的项目时、我看到它正在运行 TI-RTOS。 RTOS 本身使用中断在任务之间切换。 当时间太短时、400uS 定时器发生在 RTOS 中断期间、被延迟4us。 当时间过长时、10us 中断发生在 RTOS 中断期间、延迟4us。 您可以按照 Charles 的建议使用 PWM、也可以启动不使用 RTOS 的工程。