在ARM嵌入式C编程中使用定时器

时间:2012-01-05 14:02:56

标签: c timer operating-system embedded

我正在用C编写一个乒乓式游戏,它将通过LCD屏幕在ARM板上运行。游戏的部分要求是“魔术时间”。

“魔法时间”时段以5到10秒之间的随机间隔发生 - 即,在最后“魔术时间”时段之后的5到10秒之间,持续2到10秒的随机持续时间。

1 个答案:

答案 0 :(得分:2)

我真的不明白你的问题(你是通过定时器中断每秒执行这段代码,还是?),但是我第一眼就看到了一些错误:

while (magicTime == true) {
    magicTimeLength++;
    magicTime == magicTimeLength;
}

最后一行(magicTime == magicTimeLength;)不执行任何操作 - 它只是评估magicTime是否等于magicTimeLength,因此您将进入死循环。

我认为你想要这样做:

  1. 初始magicTimeOccurence,随机值在5和10之间。
  2. 初始magicTimeLength,随机值在2和10之内。
  3. 如果magicTimeOccurence大于0,则每秒减少一次 它的价值是一个。
  4. magicTimeOccurence点击0后,减少magicTimeLength值 一个人。
  5. 检查magicTimeLength是否大于0.如果是,那就是魔术 时间段(因此,将magicTime标志设置为true)。递减 magicTimeLength
  6. 如果magicTimeLength,请将magicTime设为false并转到第1步。
  7. 您应该以1秒的时间初始化timer0中断。我认为你用

    完成了它
    /* Set timer 0 period */
    T0PR = 0;
    T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC);
    

    但要确保每秒都会触发。

    以下是示例代码,它应该显示我的意思。

    /* In     void InitTimer0Interrupt() */
    
    ...
    T0TCR_bit.CE = 1;     /* Counting Enable */
    
    magicTimeOccurence = 5+(rand()%5);
    magicTimeLength = 2+(rand()%8);
    magicTime = false;
    
        __enable_interrupt();
    }
    
    /* In     void Timer0IntrHandler (void) */
    
    void Timer0IntrHandler (void) {
    
    
        /* clear interrupt */
        T0IR_bit.MR0INT = 1;
        VICADDRESS = 0;
        if(magicTimeOccurence > 0)
        {
            magicTimeOccurence--;
        }
        else if(magicTimeLength > 0){
            magicTime = true;
            magicTimeLenght--;
        }
        else{
            magicTime = false;
            magicTimeOccurence = 5+(rand()%5);
            magicTimeLength = 2+(rand()%8);
        }
    
         /* take action on timer interrupt */
    }