wuyage

把FTM当做普通的定时器来使用

0
阅读(3772)

  FTM是功能强大的模块,有的客户在定时器不够用的时候会考虑把它当做一个简单的定时器来使用,但是官方的demo里却没有这样的例程,客户面对FTM中的一大堆寄存器可能会无从入手,为此做了一个简单的demo,实现功能为FTM0用作普通定时器,在定时器中断里翻转GPIO。

  硬件平台:TWR_K60D100M

  软件平台:IAR7.4

只要调用一个函数就可以。

void FTM_initTimer(FTM_MemMapPtr ftm, uint16 period)
{
  if(FTM0==ftm)
  {
    SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK;                       /* 使能FTM0时钟 */
  }
  else if(FTM1==ftm)
  {
    SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;                       /* 使能FTM1时钟 */ 
  }
  else if(FTM2==ftm)
  {
    SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;                       /* 使能FTM2时钟 */
  }
  FTM_MODE_REG(ftm) |= FTM_MODE_WPDIS_MASK;                 /* 禁用写保护 */
  
  FTM_MOD_REG(ftm) = period - 1;                            /* 计数终值,周期为(MOD-CNTIN+1)*时钟周期 */
  FTM_CNTIN_REG(ftm) = 0;                                   /* 计数初值 */
  FTM_CNT_REG(ftm) = 0;                                     /* 复位FTM计数器为CNTIN */
  FTM_SC_REG(ftm) = (FTM_SC_CLKS(1) | FTM_SC_PS(7))| FTM_SC_TOIE_MASK;
                                                            /* 选择BusClock时钟分频,使能中断位 */	
  
  enable_irq(INT_FTM0-16);/* 打开中断 */


}
void ftm0_isr(void)
{

  FTM_SC_REG(FTM0) &= (~FTM_SC_TOF_MASK);/* Clear Flag */

  GPIOA_PTOR |= GPIO_PDOR_PDO(GPIO_PIN(10));/* Toggle LED */

}


需要注意的是TOF标志位的清除不是写1清除,而是写0清除。

TOF.jpg


代码见附件:

KINETIS512_V2_SC_FTM_Timer_Demo.rar