TMS320C6748定时器64位模式

定时器初始化函数如下:

void TimerInit(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)

定时器中断初始化函数如下:

void TimerInterruptInit(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)

中断服务函数如下:

void TimerIsr(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)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值