DSP

C6748定时器64位模式

2019-07-13 20:30发布

定时器初始化函数如下: 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);定时器2T64P2_TINTALLEVT#=25)中断映射到4CPU可屏蔽中断,T64P2_TINTALLTINT12TINT34的组合中断,只有当定时器计数满timer12产生TINT12,并且也计满了timer34产生TINT34时,才会产生T64P2_TINTALL中断,它是TINT12TINT34and,表明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的中断控制与状态寄存器INTCTLSTATTimer 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