智能车制作

标题: K60 PIT模块 [打印本页]

作者: daiminsdu    时间: 2013-1-21 22:35
标题: K60 PIT模块
我写了个PIT计数出发中断的程序,发现,计数器只进一次中断,但是在ISR中,重新加载计数值就正常了,请问是什么原因?
文档上不是讲pit工作方式是计数到0产生一个中断并且重新加载计数值,又开始计数的吗?

作者: daiminsdu    时间: 2013-1-22 12:30
求回复啊
作者: GordonFreeman    时间: 2013-1-23 09:33
进入PIT中断服务函数后要清除中断标志位才能再次进入中端

作者: daiminsdu    时间: 2013-1-23 13:21
GordonFreeman 发表于 2013-1-23 09:33
进入PIT中断服务函数后要清除中断标志位才能再次进入中端

谢谢您的回复我在中断服务子程序里清过中断了,以下是我PIT初始化程序和ISR程序,请您帮我看一下:
初始化程序:
void pit_init(PITn pitn, u32 cnt)
{

    //PIT 用的是 Bus Clock 总线频率
    //溢出计数 = 总线频率 * 时间

    /* 开启时钟*/
    SIM_SCGC6       |= SIM_SCGC6_PIT_MASK;                            //使能PIT时钟

    /* PIT模块控制 PIT Module Control Register (PIT_MCR) */
    PIT_MCR         &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );      //使能PIT定时器时钟 ,调试模式下继续

    switch(pitn)
    {
    case PIT0:   
              {
                PIT_LDVAL0  = cnt;                                         //设置溢出中断时间
                PIT_TFLG0=0x1;                                             //清中断标志位
                PIT_TCTRL0 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
                enable_irq(0 + 68);                                        //开接收引脚的IRQ中断
              }

      break;
      case PIT1:
              {
                PIT_LDVAL1  = cnt;                                         //设置溢出中断时间
                PIT_TFLG1=0x1;                                             //清中断标志位
                PIT_TCTRL1 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
                enable_irq(1 + 68);                                        //开接收引脚的IRQ中断
              }


      break;
      case PIT2:  
              {
                PIT_LDVAL2  = cnt;                                         //设置溢出中断时间
                PIT_TFLG2=0x1;                                             //清中断标志位
                PIT_TCTRL2 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
                enable_irq(2 + 68);                                        //开接收引脚的IRQ中断
              }

      break;
      case PIT3:
              {
                PIT_LDVAL3  = cnt;                                         //设置溢出中断时间
                PIT_TFLG3=0x1;                                             //清中断标志位
                PIT_TCTRL3 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
                enable_irq(3 + 68);                                        //开接收引脚的IRQ中断
              }

      break;

      }
}

ISR程序:
void pit0_isr(void)
{
  PIT_TFLG0=0x1;                                  //Clear the flag  
  GPIOA_PCOR|=GPIO_PCOR_PTCO(GPIO_PIN(28));       //Lighten yellow,E2
  delay();
  GPIOA_PCOR|=GPIO_PCOR_PTCO(GPIO_PIN(29));       //Lighten green,E3
  delay();
  j++;

}


作者: liming77    时间: 2016-1-17 20:29
需要使能中断优先级




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2