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.

[参考译文] TM4C129DNCPDT:无中断定时器计数器

Guru**** 662690 points
Other Parts Discussed in Thread: TM4C129DNCPDT, EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1212287/tm4c129dncpdt-timer-counter-without-interrupt

器件型号:TM4C129DNCPDT
主题中讨论的其他器件: EK-TM4C1294XL

您好!  

  我正在开发 TM4C129DNCPDT 和 TI-RTOS 以及 Tivaware 驱动程序库。

  如何设置计时器计数器增量每1us 一次?  我们不需要任何中断、我们需要拉计数器值。

设置

void init_timerCounter ()

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0)

}
TimerClockSourceSet (timer_B、timer_clock_system);
TimerConfigure (TIMER_B、TIMER_CFG_PERIOD_UP);
TimerLoadSet (TIMER0_BASE、TIMER_B、ui32SysClock/1000);
TimerPrescaleSet (TIMER0_BASE、TIMER_B、16);
TimerIntDisable (TIMER0_BASE、TIMER_B);
TimerEnable (TIMER0_BASE、TIMER_B);

}

对于计数器值获取

uint32_t = time1;

 Time1 = TimerValueGet (TIMER0_BASE、TIMER_B);

出现一些运行时错误。

可能是我做错了事。  

此致、

总结

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

    您好!

     以下两行错误。 API 的第一个参数应为  TIMER0_BASE。 当你为定时器指定源时钟时、它将应用于 TIMER_A 和 TIMER_B  

    TimerClockSourceSet (timer_B、timer_clock_system);
    TimerConfigure (TIMER_B、TIMER_CFG_PERIOD_UP);

    TivaWare 库中有一些计时器示例。 您可以在中找到它们  

     C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\timers

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\timer_edge_capture

    和中的几个示例:

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\timer

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

    您好、Charles、感谢您的帮助。

      我测量的脉冲实际值为10us 至150us。 大多数时候,我得到非常接近的价值,如12us/11us/10us。 但有时我得到20us/17us。 我得到这样的一个或两个来自10个样本(脉冲宽度)的样本(脉冲宽度)。 我将遵循您的建议示例(C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\timer_edge_capture)。 我仅使用一个计时器。 我们将从函数发生器生成脉冲。

    如何解决该问题?

    请检查我的配置一次。

    空 timer_Init (void)

    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

    while (!MAP_SysCtl_Periph_TIMER0)

    }
    MAP_TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK_SYSTEM)
    MAP_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIOD_UP);
    MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、0xFFFF)
    MAP_TimerPrescaleSet (TIMER0_BASE、TIMER_A、0xFF)
    MAP_TimerIntDisable (TIMER0_BASE、TIMER_A);
    MAP_TimerEnable (TIMER0_BASE、TIMER_A);
    }

    空 PP3_ISR ()

    MAP_GPIOIntClear (GPIO_PORTP_BASE、GPIO_INT_PIN_3);
    EdgeD = MAP_GPIOPinRead (GPIO_PORTP_BASE、GPIO_PIN_3);
    开关(EdgeD)

        情形8:  //上升沿
        pr =(MAP_TimerValueGet (TIMER0_BASE、TIMER_A))+(MAP_TimerPrescaleGet (TIMER0_BASE、TIMER_A)<< 16);
        中断;

        情形0:   //下降沿
        PF =(MAP_TimerValueGet (TIMER0_BASE、TIMER_A))+(MAP_TimerPrescaleGet (TIMER0_BASE、TIMER_A)<< 16);
        IF (PF>PR)
        {
         PLSWArry[PC++]=((PF-PR)/120);//时钟= 120
        }
        方案
           PLSWArry[PC++]=((PF + 16777215)- PR)/120;//时钟=120

        中断;
    }
    }

    此致、

    总结  

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

    您好!

    请参阅我在  C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\timer_edge_capture 中提供的示例。 如果要测量 A 输入引脚、则 应将计时器配置为"输入边沿时间捕获"模式、如 TIMER_CFG_A_CAP_TIME_UP。 请参阅数据表中的输入边沿计时模式。  

    由于不测量 长脉冲、因此可以仅使用24位分辨率的 Timer_A 或 Timer_B。 您可以将捕获事件配置为双边沿、使其能够同时测量输入的高相位和低相位。  

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

    您好、Charles。

       实际上、计时器捕获和比较模式不适用于 PP3、而在我们的硬件中、该模式连接到 PP3的两个边沿。

     INIT_PP3_ISR ()

    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    while (!MAP_SysCtl_Periph_GPIOP)

    }
    MAP_GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、GPIO_PIN_3);
    MAP_GPIODMATRIGGER Enable (GPIO_PORTP_BASE、GPIO_PIN_3);
    MAP_GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_3、GPIO_Both_EDGE);// GPIO_Rising _EDGE 和下降沿
    MAP_GPIOIntEnable (GPIO_PORTP_BASE、GPIO_INT_PIN_3);

    }

    gpioPULSE_hwi = Hwi_create (INT_GPIOP3_TM4C129、PULSE_DETECT_ISR、&gpioPULSE_hwiParams、&EB_HiPulse);//硬件中断启用
    if (gpioPulse_hwi == NULL)

    system_abort ("***硬件中断创建脉冲监视器失败");
    }

    Hwi_enableInterrupt (INT_GPIOP3_TM4C129);   

    那么、有没有其他方法可以解决这个硬件(PP3)问题?  

    谢谢。此致、

    Sumit Chaulya

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

    您好!

      您的方法存在问题。 如果下一个边沿太快、您可能使用一个计时器就错过了它。 假设您得到一个上升沿的 PP3中断。 处理器需要一些时间/周期来对其进行响应并跳转到 ISR。 在 ISR 中、您将清除 PP3中断标志。 如果下一个下降沿在您清除标志的同时快速出现、该怎么办? 因为您只需清除标志、您就会丢失下降沿事件。 在下一个上升沿中断中、您将测量周期而不是占空比。 解决方案是在两个不同引脚上使用两个计时器、其中一个在上升沿生成中断、另一个在下降沿生成中断。 以下是开发该示例以解决捕获短脉冲问题的方法。  

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

    您好、Charles。

       我的脉冲测量在使用 TIMER0_BASE 和 TIMER_A 时可以正常运行

       但是  、如果使用 TIMER0_BASE、TIMER_B、我将无法获得正确的值。

       我是不是做了什么错了??

    void timer_config (void)

    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

    while (!MAP_SysCtl_Periph_TIMER0)

    }
    MAP_TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK_SYSTEM)
    MAP_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIOD_UP);
    MAP_TimerLoadSet (TIMER0_BASE、TIMER_B、0xFFFF)  
    MAP_TimerPrescaleSet (TIMER0_BASE、TIMER_B、0xFF)
    MAP_TimerIntDisable (TIMER0_BASE、TIMER_B);
    MAP_TimerDisable (TIMER0_BASE、TIMER_B);
    }

    //测量  

    void measure_func()

    MAP_GPIOIntClear (GPIO_PORTP_BASE、GPIO_INT_PIN_3);
    EdgeD = MAP_GPIOPinRead (GPIO_PORTP_BASE、GPIO_PIN_3);
    开关(EdgeD)

    情形8://上升沿
    pr =(MAP_TimerValueGet (TIMER0_BASE、TIMER_B))+(MAP_TimerPrescaleGet (TIMER0_BASE、TIMER_B)<< 16);
    中断;

    情况0://下降沿
    PF =(MAP_TimerValueGet (TIMER0_BASE、TIMER_B))+(MAP_TimerPrescaleGet (TIMER0_BASE、TIMER_B)<< 16);
    Swi_post (PULSE_DETECT_Swi);//调用 PULSE_DETECT_Swi_func
    中断;
    }

    }

    此致、

    总结  

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

    您好!

    MAP_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIOD_UP);
    [/报价]

    如果您要使用计时器 B、则此行错误 当您使用 TIMER_CFG_PERIOD_UP 时、这是为了使用全宽度计时器、即将 Timer_A 和 Timer_B 组合成一个32位计时器。

    如果只想使用 TIMER_B、那么应该如下  

    TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIOD_UP);