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:无法使用计时器生成1ms 延迟。

Guru**** 2575345 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/773190/tm4c1294ncpdt-not-able-to-generate-1ms-delay-using-timers

器件型号:TM4C1294NCPDT

您好!

我们使用的是 TM4C1294NCPDT Launchpad。 在该 launchpad 中,我们通过使用计时器执行了程序来生成1ms 延迟,但我们无法生成延迟。

当我们将较小的值(例如:120000)加载到计时器寄存器时,在这种情况下,经过一段时间后,它不会进入 ISR。  

请仔细检查代码

int main (空)

ui32SysClock=SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 | GPIO_PIN_1);

TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);

 TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);

周期= 120000;

TimerLoadSet (TIMER0_BASE、TIMER_A、PERIODE-1);

IntEnable (INT_TIMER0A);
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
IntMasterEnable();

TimerEnable (TIMER0_BASE、TIMER_A);

while (1);

返回0;

空 Timer0IntHandler (空)

TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

if (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

其他

GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

谢谢、此致、

Venkatadri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您已将定时器0配置为拆分定时器(您对 TimerConfigure()的第二次调用),这意味着定时器 A 的宽度为16位。 您尝试将一个11999计数周期加载到一个16位寄存器中。 16位寄存器不能包含大于65535的数字。 如果打算将定时器0用作32位定时器,则不应包括对 TimerConfigure()的第二次调用。 您的另一个选项是使用计时器0作为拆分计时器,但通过调用 TimerPrescaleSet()来设置预分频。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回答、先生、

    我的配置与您建议的相同、但我仍然无法生成1ms 延时时间。 我加载了周期值23000以生成50ms 的延迟,但当周期值小于40000时,加载到 timerloadset()中,它不会进入计时器 ISR。 请告诉我 SIR、如何设置预分频值以生成1ms 和1ns 延时时间。

    int main (空)

    ui32SysClock=SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

    GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 | GPIO_PIN_1);

     TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);

    TimerPrescaleSet (TIMER0_BASE、TIMER_A、255);

    //period=65535;      //持续140ms

    期间= 23000;

    TimerLoadSet (TIMER0_BASE、TIMER_A、PERIODE-1);

    IntEnable (INT_TIMER0A);
    TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    IntMasterEnable();

    TimerEnable (TIMER0_BASE、TIMER_A);

    while (1);

    返回0;

    空 Timer0IntHandler (空)

    TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

    if (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

    其他

    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

    谢谢,

    Venkatadri

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

    我不知道问题是什么。 我获取了您的代码并将预分频更改为120、将计时器预加载值更改为1000、并具有1ms 周期性中断。

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_ints.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/timer.h"
    #include "driverlib/interrupt.h"
    
    uintu32t uintuinth;
    
    void 32uint_inth (void inth
    
    unsigned int period;
    
    ui32SysClock=SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    
    GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    
    TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);
    
    // 120MHz 除以120得到1MHz 计时器时钟
    TimerPrescaleSet (TIMER0_BASE、TIMER_A、120 - 1);
    
    //周期1000提供1 ms 中断
    期间= 1000;
    
    TimerLoadSet (TIMER0_BASE、TIMER_A、PERIODE-1);
    
    IntEnable (INT_TIMER0A);
    TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    IntMasterEnable();
    
    TimerEnable (TIMER0_BASE、TIMER_A);
    
    while (1);
    
    返回0;
    }
    
    void Timer0IntHandler (void)
    {
    TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    
    if (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))
    {
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
    }
    其他
    {
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob Crosby 先生:
    现在、我根据您发布的内容获得了输出。 感谢先生的快速回答。
    谢谢、
    Venkatadri。