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:捕获模式中的 TIMER5:未生成溢出("超时")中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/577851/tm4c1294ncpdt-timer5-in-capture-mode-no-overflow-timeout-interrupt-generated

器件型号:TM4C1294NCPDT

您好!

我想测量方波信号的频率(大约25Hz)。

硬件设置由我提供、而不是由我完成。 我之前在不同的微控制器上执行此操作、方法是对16位计数器的溢出进行计数、并考虑从2个连续正边沿捕获的2个值。

因此、我在 SPLIT / 16位/递增计数"输入边沿计时模式"中设置 TIMER5 A

我的初始化代码如下所示(实际的 GPIO 配置由其他地方的 pinmux 工具完成、我检测捕获中断、以便 GPIO 设置正常)

空 TimerCCPInit (空)
{
//定时器外设使能
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER5);

//等待外设为编程做好准备
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER5));

//禁用计时器
TimerDisable (TIMER5_base、timer_both);

//计时器时钟源=系统时钟(高精度120MHz)
TimerClockSourceSet (TIMER5_base、timer_clock_system);

//拆分模式中的定时器(2x 16位、递增计数、捕捉模式)
TimerConfigure (TIMER5_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP);

//将 Timer A 的 Timer 事件类型设置为正边沿计数
TimerControlEvent (TIMER5_base、TIMER_A、TIMER_EVENT_POS_EDGE);

//将计时器预分频器设置为4,得到120MHz:4=> 30Mhz 计时器时钟
//在递增计数模式中,预分频器提供计数值的 MSB (伪24位模式)
TimerPrescaleSet (TIMER5_base、TIMER_A、4);

//递增计数模式中超时中断的上限
TimerLoadSet (TIMER5_base、TIMER_A、0xFFFF);

//寄存器 Timer5A 处理程序
TimerIntRegister (TIMER5_base、TIMER_A、Timer5AIntHandler);

//启用捕捉中断
TimerIntEnable (TIMER5_base、TIMER_CAP_EVENT | TIMER_TINA_TIMEOUT);

//启用计时器
TimerEnable (TIMER5_base、timer_A);

}

我希望在捕获事件(正常工作)和计数器从0xFFFF 溢出到0x0000 (数据表在最后一句的第13.4.4段中的"在输入边沿定时模式中、定时器在检测到边沿事件后继续运行、
但定时器间隔可以随时通过写 GPTMTnILR 寄存器和清零来改变
GPTMTnMR 寄存器中的 TnILD 位。 更改在写入后的下一个周期生效。"


因此、我假设它也会回滚并生成超时中断。

我的处理程序代码如下所示:

void Timer5AIntHandler (void)
{
//获取屏蔽的中断状态,因为我们需要检查它是否是捕获
//或溢出中断
uint32_t InterruptFlags = TimerIntStatus (TIMER5_base、true);

//检查捕捉中断
if (InterruptFlags & TIMER_CAP_EVENT)
{


//读取捕捉值
uiTimer5CaptureValue = TimerValueGet (TIMER5_base、timer_A);

//如果它是捕捉中断,清除中断标志
TimerIntClear (TIMER5_base、TIMER_CAP_EVENT);

uiTimer5溢出= 0;

//在每次捕获时将 D73切换为绿色
bLEDToggleFlag++;

if (bLEDToggleFlag & 0x01)
GPIOPinWrite (LED_D73_GREEN _N_PORT、LED_D73_GREEN _N_PIN、0);
其他
GPIOPinWrite (LED_D73_GREEN _N_PORT、LED_D73_GREEN N_PIN、LED_D73_GREEN N_PIN);
}

if (InterruptFlags & TIMER_TINA_TIMEOUT)
{
TimerIntClear (TIMER5_base、TIMER_TINA_TIMEOUT);
uiTimer5溢出++;
}
}

前面板上的 LED 以预期的25Hz 频率闪烁、如果我设置断点、我会看到 uTimer5CaptureValue (上面未显示的一些全局变量)每次都设置为当前的捕获值。

如果我在下分支中设置了一个用于检查 TIMER_TINA_TIMEOUT 的断点、它将永远不会被触发、我也会看到变量停留在零。

我在这里错过了什么?

Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Markus、您好!
    请查找此帖子中已回答的类似问题。 e2e.ti.com/.../467936

    基本上、在捕获模式中不会生成超时中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这块芯片中的另一个外设"坏了":-(

    第一次遇到 I2C 错误、在非中断驱动模式下不工作(请参阅勘误表)、第二次遇到无法读取开漏输出上的当前引脚状态(这使得 bitbang I2C 无法实现、实际上用于大量应用) 现在、即使是最基本的计时器模式也无法正常工作。

    是否有任何关于如何最好不将输入信号路由到芯片上其他输入的情况下使用第二个计时器来仿真丢失的溢出中断的建议?

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

    生成捕获和超时中断的一种方法是在周期模式中使用与事件时间捕获模式参数相同的第二个定时器、并使用 GPTMSYNC 寄存器将它们同步。 周期模式下的第二个计时器可用于生成超时中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可以是相应的"B"定时器吗? 在我的案例 TIMER5B 中? 不管怎样、它都是拆分的、否则我将不会使用它。
    同步仅在软件中完成? 例如、我不需要布线其他电线?