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.

[参考译文] TM4C129ENCPDT:使用计时器的延迟

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/565653/tm4c129encpdt-delay-using-timer

器件型号:TM4C129ENCPDT

我是嵌入式编程的初学者。  我在使用 TM4C129 计时器创建延迟时遇到问题、 是否有人可以帮助我解决此问题? 。 使用的 IDE 是 keiluV5、代码构建过程成功。 我将一个切换值写入 GPIO,且在函数中提供了延迟(1ms、10ms 等)(在示波器中使用相同的代码监视 GPIO,而不使用'while (DelaySet_Flag)'; ' ,并在主代码等待开始之前调用函数 while (); 计时器工作正常)。 在主代码结束时、同一代码在等待过程中不起作用。  

请找到以下代码

谢谢

----------------------------------------------------------------------  

空延迟(uint32_t delay_value)  


uint32_t Timer_Count;

Timer_Count =(120000 * DELAY_VALUE);//以毫秒为单位计算值

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER3)){}
ROM_TimerConfigure (TIMER3_base、TIMER_CFG_PERIODICASE);

ROM_TimerLoadSet (TIMER3_base、timer_A、g_ui32SysClock);       // 120MHz

ROM_IntEnable (INT_TIMER3A);
ROM_TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT);
ROM_TimerLoadSet (TIMER3_base、INT_TIMER3A、Timer_Count);
ROM_TimerEnable (TIMER3_base、TIMER_A);

DelaySet_FLAG = 0x01;
while (DelaySet_Flag);             //中断处理程序中,DelaySet_Flag=0x00,DelaySet 标志是一个全局变量
DelaySet_FLAG = 0x01;

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

    库里安

    您的中断实现中可能有一些内容、您没有发送该部分。 您是否测试了是否发生了中断?

    此外、在代码上、您将使用系统时钟加载计时器。 您需要为其加载您正在寻找的暂停周期。 如果它只是单次触发计数、对于暂停、则周期不是最佳选项、因为您将在下次调用函数时重新配置计时器。 另一个细节、"每次调用函数时"禁用和重新启用计时器外设可能不太好。

    但是、您提供的代码会阻止 while (DelaySet)循环上的处理器。 在设置标志之前、您将无法执行任何其他操作-这不是很有用;您应力求设置某种信标、并根据这些情况决定代码执行。 在等待期间、您将处于睡眠状态或将处理器用于其他重要任务...

    Rgds

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

    正如 Bruno 向右指出的、IntEnable API 调用缺失。 此外、如果目的是延迟、那么我建议使用单次触发模式而不是周期模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Amit 和 Bruno。

    中断正在发生、我已经使用断点对它进行了分析。 考虑到上述几点、对定时器配置和中断处理程序的修改如下。  但问题是、这些代码正在详细调试分析的执行中。 但延迟函数不会返回到调用的位置。 在测试时、发现使用'ROM_SysCtlDelay()'继续执行一个1ms 延迟切换 I/O 写入正在工作、但延迟函数 cal 不工作。  

    ///----------------------------------------------

    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER3)){}

    ROM_TimerConfigure (TIMER3_base、TIMER_CFG_ONE_SHOT);

    ROM_TimerLoadSet (TIMER3_base、timer_A、g_ui32SysClock);        // 120MHz

    //--------------------------------------------------------------

    空延迟(uint32_t delay_value)

    uint32_t Timer_Count;

    Timer_Count =(120000 * DELAY_VALUE);//以毫秒为单位计算值

    ROM_IntEnable (INT_TIMER3A);
    ROM_TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT);
    ROM_TimerLoadSet (TIMER3_base、INT_TIMER3A、Timer_Count);
    ROM_TimerEnable (TIMER3_base、TIMER_A);

    while (DelaySet_Flag <1){}           //delayset 标志最初为0  


    DelaySet_FLAG = 0;    
    ROM_TimerIntDisable (TIMER3_base、TIMER_A);//禁用 Timer3中断
    ROM_TimerDisable (TIMER3_base、TIMER_A);//禁用 Timer3

    ----------------------------------------------------------------------

    空 Timer3IntHandler (空)

    INTERRUPT_Flag =(Interrupt_Flag | Timer3_interrupt);
    ROM_TimerIntClear (TIMER3_base、TIMER_TINA_TIMEOUT);
    DelaySet_Flag++;

      

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

    KurianThomas 说:
    delay 函数不会返回到调用它的位置

    您是否说它将返回错误的内存执行位置? 或者它是否滞留在您的某个条件循环中?

    您可能会持续返回到计时器 ISR 中、因为您只清除一个特定的中断标志(TIMER_TINA_TIMEOUT)、并且可能还有其他一些标志处于活动状态? 请参阅 API 示例、通常在需要清除标志的任何 IRS 中、顺序是:将所有标志读取到一个变量中、清除所有中断、并根据变量中存储的每个中断原因采取适当的措施。

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

    问题已解决。 问题是,在从另一个文件进行的 extern 调用中,变量'delaySet_Flag'未被声明为 volatile (“extern volatile uint8_t DelaySet_Flag;”)。