计划使用4个timer,独立中断运行,如图timer2和timer3,进入时间点不稳定,请问有可能是什么原因?
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.
片子为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]
}