lm3s811定时器跑死



我用timer0做延时用,发现程序偶尔会死在延时函数里,debug发现都死在TimerValueGet();系统时钟为6M,timer0的配置和延时函数如下,望大神指点,谢谢

void Timer0_Configuration(void)

 TimerDisable(TIMER0_BASE, TIMER_A); 
 TimerPrescaleSet(TIMER0_BASE, TIMER_A, 6) ;   // 计数器频率 sysclk / 6 = 1M   
 TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_ONE_SHOT);
 TimerLoadSet(TIMER0_BASE, TIMER_A, 1010);    //根据不同的系统时钟设定value
  TimerEnable(TIMER0_BASE, TIMER_A);
}

void Delay_1ms(void)

 Timer0_Configuration();
 TimerEnable(TIMER0_BASE, TIMER_A);
 while(1)
 {
  if(TimerValueGet(TIMER0_BASE, TIMER_A) < 10)      //待定1ms跳出
  break;
 }
 TimerDisable(TIMER0_BASE, TIMER_A);
}

  • 1,如果需要一个延时,建议你用TI的driverlib库提供的延时函数,精度不错而且节省一个硬件定时器。

    void BSP_MsDelay(ULONG ulCount)
    {
    ULONG uldms = SysCtlClockGet() / 1000;
    SysCtlDelay(ulCount * uldms / 3);
    return;
    }

    2,如果你需要用中断的形式做一个定时,根据不同的时钟去设定定时器的value就可以了,等到中断产生,

    说明定时时间到达,所以你不需要再while(1)中轮询定时器的value。

    3,即使按照你的思路,在while(1)中查询定时器的值。你定义的定时器是单次触发的,而且定时器是独立

    的外设,定时器在计数的时候是不受cpu干涉的。所以你通过if判断来跳出while(1)很可能捕获不到那个状态。

    因为

    Once the 0x0000 state is reached, the timer reloads its start value from
    GPTMTnILR and GPTMTnPR on the next cycle.

    你需要确认一下,待到计数为0的时候,是不是计数器又装载了初值,如果这样的话,你这种判断方式是不正确的。