定时器初始化函数如下:
voidTimerInit(void)
{
// 配置定时器 / 计数器 2 为 64 位模式
TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
// 设置周期
TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
// 使能定时器 / 计数器 2
TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
}
这里,使能定时器2的时候,TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);只是使能了timer12部分,即只设置了ENAMODE12,而没有设置ENAMODE34,但是定时器明明是配置在64位模式的,这是为什么?因为手册上说到,在64位定时器模式下,ENAMODE34字段没有任何影响,所以就不用理会ENAMODE34了。
(指南P1387)
定时器中断初始化函数如下:
voidTimerInterruptInit(void)
{
// 注册中断服务函数
IntRegister(C674X_MASK_INT4, TimerIsr);
// 映射中断到 DSP 可屏蔽中断
IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);
// 使能 DSP 可屏蔽中断
IntEnable(C674X_MASK_INT4);
// 使能定时器 / 计数器中断
TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}
其中,语句IntEventMap(C674X_MASK_INT4, SYS_INT_T64P2_TINTALL);将定时器2的T64P2_TINTALL(EVT#=25)中断映射到4号CPU可屏蔽中断,T64P2_TINTALL为TINT12和TINT34的组合中断,只有当定时器计数满timer12产生TINT12,并且也计满了timer34产生TINT34时,才会产生T64P2_TINTALL中断,它是TINT12和TINT34的and,表明64位定时器全都计满了设定的周期值。
(手册P93)
中断服务函数如下:
voidTimerIsr(void)
{
// 禁用定时器 / 计数器中断
TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 清除中断标志
IntEventClear(SYS_INT_T64P2_TINTALL);
TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 改变 LED 状态
GPIOPinWrite(SOC_GPIO_0_REGS, 109, Flag);
Flag=!Flag;
GPIOPinWrite(SOC_GPIO_0_REGS, 110, Flag);
// 使能定时器 / 计数器中断
TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}
TimerIntStatusClear(SOC_TMR_2_REGS,TMR_INT_TMR12_NON_CAPT_MODE);语句将timer2的中断控制与状态寄存器INTCTLSTAT(Timer Interrupt Control and Status Register)的中断标志位PRDINTSTAT12清除。这里我觉得源程序逻辑好像有点问题(虽然从实质效果来说并没有问题,这个后面说到),因为
TMR_INT_TMR12_NON_CAPT_MODE的值是0x00000001u,对应到INTSTAT寄存器的是中断使能位PRDINTEN12位,而不是中断状态位PRDINTSTAT12。我觉得TMR_INT_TMR12_NON_CAPT_MODE应该改成
TMR_INTSTAT12_TIMER_NON_CAPT,值是0x00000002u,这就对应上了中断状态位PRDINTSTAT12了。不过从实质效果来说,其实这里不加感觉也行,因为前面TimerIntDisable的时候就已经往PRDINTSTAT位写1了,而根据手册,往该位写1实质是清除该位。
(指南P1414)