TI中文支持网
TI专业的中文技术问题搜集分享网站

请教,多个Timer不稳定

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

Camel Santo:

中断内没有重新配置定时器,只是进入IO口写高,清标志,退出前IO写低。

Nancy Wang:

回复 Camel Santo:

芯片型号是什么?
请将代码发出来看一下。

Camel Santo:

回复 Nancy Wang:

片子为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]

}

Nancy Wang:

回复 Camel Santo:

看配置好像没什么问题,方便将工程传上来我这边测试看一下,是否有一样的问题。

Camel Santo:

回复 Nancy Wang:

test_timer.rar

Camel Santo:

回复 Nancy Wang:

已上传,请看是什么问题。。

Nancy Wang:

回复 Camel Santo:

抱歉现在给您回复,我测试了一下,触发周期是一样的,没有出现你描述的不稳定现象。

Camel Santo:

回复 Nancy Wang:

没关系。
您测试使用的就是我的那个程序? 为什么我这里就是如图那样。。。没道理啊

Nancy Wang:

回复 Camel Santo:

是的,只是将你程序中的定时时间改成了1s。

赞(0)
未经允许不得转载:TI中文支持网 » 请教,多个Timer不稳定
分享到: 更多 (0)