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.

请教,多个Timer不稳定

计划使用4个timer,独立中断运行,如图timer2和timer3,进入时间点不稳定,请问有可能是什么原因?

  • 中断内没有重新配置定时器,只是进入IO口写高,清标志,退出前IO写低。
  • 芯片型号是什么?
    请将代码发出来看一下。
  • 片子为6748,主要代码如下,来自StarterWare和Tronlong例程

    int main(void)
    {
    // 外设使能配置
    PSCInit();


    // GPIO 管脚复用配置
    GPIOBankPinMuxSet();

    // GPIO 管脚初始化
    GPIOBankPinInit();
    /* Set up the Timer2 peripheral */
    TimerSetUp64Bit();

    /* Set up the AINTC to generate Timer2 interrupts */
    TimerIntrSetUp();

    /* Enable the timer interrupt */
    TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    TimerIntEnable(SOC_TMR_3_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    /* Send the first String */
    //UARTPuts("Tencounter: 9", -1);

    /* Start the timer. Characters from cntArr will be sent from the ISR */
    TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
    TimerEnable(SOC_TMR_3_REGS, TMR_TIMER12, TMR_ENABLE_CONT);


    /* Disable the timer. No more timer interrupts */
    // TimerDisable(SOC_TMR_2_REGS, TMR_TIMER12);

    /* Halt the program */
    while(1);
    }

    /*
    ** Timer Interrupt Service Routine
    */
    static void Timer2_Isr(void)
    {
    GPIOPinWrite(SOC_GPIO_0_REGS, 113, GPIO_PIN_HIGH); // GPIO7[0] R47

    /* Disable the timer interrupt */
    TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    /* Clear interrupt status in DSPINTC */
    IntEventClear(SYS_INT_T64P2_TINTALL);

    TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    /* Signal application to print a new character */
    flagIsrCnt = 1;

    /* Enable the timer interrupt */
    TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    GPIOPinWrite(SOC_GPIO_0_REGS, 113, GPIO_PIN_LOW); // GPIO7[0] R47

    }
    static void Timer3_Isr(void)
    {
    GPIOPinWrite(SOC_GPIO_0_REGS, 114, GPIO_PIN_HIGH); //GPIO7[1] R48

    /* Disable the timer interrupt */
    TimerIntDisable(SOC_TMR_3_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    /* Clear interrupt status in DSPINTC */
    IntEventClear(SYS_INT_T64P3_TINTALL);

    TimerIntStatusClear(SOC_TMR_3_REGS, TMR_INT_TMR12_NON_CAPT_MODE);

    /* Signal application to print a new character */
    flagIsrCnt = 1;

    /* Enable the timer interrupt */
    TimerIntEnable(SOC_TMR_3_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    GPIOPinWrite(SOC_GPIO_0_REGS, 114, GPIO_PIN_LOW); //GPIO7[1]R48


    }

    static void TimerSetUp64Bit(void)
    {
    /* Configuration of Timer */
    TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
    TimerConfigure(SOC_TMR_3_REGS, TMR_CFG_64BIT_CLK_INT);

    /* Set the 64 bit timer period */
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, 5500);//TMR_PERIOD_LSB32
    TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
    TimerPeriodSet(SOC_TMR_3_REGS, TMR_TIMER12, 6000);
    TimerPeriodSet(SOC_TMR_3_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);

    }

    /*
    ** Set up the ARM Interrupt Controller for generating timer interrupt
    */
    static void TimerIntrSetUp(void)
    {

    /* Initialize the DSPINTC */
    IntDSPINTCInit();

    /* Register the Timer ISR */
    IntRegister(C674X_MASK_INT4, Timer2_Isr);
    IntRegister(C674X_MASK_INT5, Timer3_Isr);

    /* Map Timer interrupts to DSP maskable interrupt */
    IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);
    IntEventMap(C674X_MASK_INT5, SYS_INT_T64P3_TINTALL);

    /* Enable DSP interrupt in DSPINTC */
    IntEnable(C674X_MASK_INT4);
    IntEnable(C674X_MASK_INT5);

    /* Enable DSP interrupts */
    IntGlobalEnable();

    }


    /****************************************************************************/
    /* */
    /* PSC 初始化 */
    /* */
    /****************************************************************************/
    void PSCInit(void)
    {
    // 使能 GPIO 模块
    // 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
    }

    /****************************************************************************/
    /* */
    /* GPIO 管脚复用配置 */
    /* */
    /****************************************************************************/
    void GPIOBankPinMuxSet(void)
    {
    SYSCFG0Regs.PINMUX0.all =PINMUX0_VALUE;
    SYSCFG0Regs.PINMUX1.all =PINMUX1_VALUE;
    SYSCFG0Regs.PINMUX2.all =PINMUX2_VALUE;
    SYSCFG0Regs.PINMUX2.all = PINMUX2_VALUE ;
    SYSCFG0Regs.PINMUX3.all = PINMUX3_VALUE ;
    SYSCFG0Regs.PINMUX4.all = PINMUX4_VALUE ;
    SYSCFG0Regs.PINMUX5.all = PINMUX5_VALUE ;
    SYSCFG0Regs.PINMUX6 .all = PINMUX6_VALUE ;
    SYSCFG0Regs.PINMUX7.all = PINMUX7_VALUE ;
    SYSCFG0Regs.PINMUX8 .all = PINMUX8_VALUE ;
    SYSCFG0Regs.PINMUX9 .all = PINMUX9_VALUE ;
    SYSCFG0Regs.PINMUX10.all = PINMUX10_VALUE;
    SYSCFG0Regs.PINMUX11 .all= PINMUX11_VALUE;
    SYSCFG0Regs.PINMUX12.all = PINMUX12_VALUE;
    SYSCFG0Regs.PINMUX13 .all= PINMUX13_VALUE;
    SYSCFG0Regs.PINMUX14 .all= PINMUX14_VALUE;
    SYSCFG0Regs.PINMUX15.all = PINMUX15_VALUE;
    SYSCFG0Regs.PINMUX16.all = PINMUX16_VALUE;
    SYSCFG0Regs.PINMUX17.all = PINMUX17_VALUE;
    SYSCFG0Regs.PINMUX18.all = PINMUX18_VALUE;
    SYSCFG0Regs.PINMUX19.all = PINMUX19_VALUE;


    }

    /****************************************************************************/
    /* */
    /* GPIO 管脚初始化 */
    /* */
    /****************************************************************************/
    void GPIOBankPinInit(void)
    {
    // 配置 LED 对应管脚为输出管脚
    // OMAPL138 及 DSP C6748 共有 144 个 GPIO
    // 以下为各组 GPIO BANK 起始管脚对应值
    // 范围 1-144
    // GPIO0[0] 1
    // GPIO1[0] 17
    // GPIO2[0] 33
    // GPIO3[0] 49
    // GPIO4[0] 65
    // GPIO5[0] 81
    // GPIO6[0] 97
    // GPIO7[0] 113
    // GPIO8[0] 129
    GPIODirModeSet(SOC_GPIO_0_REGS, 113, GPIO_DIR_OUTPUT); // GPIO7[0]
    GPIODirModeSet(SOC_GPIO_0_REGS, 114, GPIO_DIR_OUTPUT); // GPIO7[1]
    GPIODirModeSet(SOC_GPIO_0_REGS, 115, GPIO_DIR_OUTPUT); // GPIO7[2]

    }

  • 看配置好像没什么问题,方便将工程传上来我这边测试看一下,是否有一样的问题。
  • 已上传,请看是什么问题。。
  • 抱歉现在给您回复,我测试了一下,触发周期是一样的,没有出现你描述的不稳定现象。
  • 没关系。
    您测试使用的就是我的那个程序? 为什么我这里就是如图那样。。。没道理啊
  • 是的,只是将你程序中的定时时间改成了1s。