计划使用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。