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); 将定时器 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 )
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮