注册 登录
查看: 1037|回复: 17

[K60] 开PIT0中断测试lptmr脉冲计数功能为什么一直输出计数值为0,新手求指点,多谢!!!

[复制链接]
发表于 2014-3-11 19:40:05 | 显示全部楼层 |阅读模式
uint8 TestFlage=0;
uint16 add=0;
void PIT0_IRQHandler();
void main()
{
  uint16 count;
  
#define INT_COUNT  0xFFFF          //LPT 产生中断的计数次数  
//  DisableInterrupts;                             //禁止总中断

    NVIC_SetPriorityGrouping(4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级
    NVIC_SetPriority(PIT0_IRQn,2);          //配置优先级
//    NVIC_SetPriority(LPTMR_IRQn,1);          //配置优先级
    FTM_PWM_init(FTM0, FTM_CH0,20*1000,15);
    FTM_PWM_init(FTM0, FTM_CH1,20*1000,0);
   lptmr_pulse_init(LPT0_ALT1, INT_COUNT, LPT_Rising);   
     
   pit_init(PIT0, 10000);                           //初始化PIT1,定时时间为: 0.2ms
   set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);                  //设置 PIT0 的中断复位函数为 PIT0_IRQHandler
   enable_irq(PIT0_IRQn);
//   enable_irq(LPTMR_IRQn);
   EnableInterrupts;                                            //开总中断  
    while(1)
    {               
       if( TestFlage==1 )
      {      
        TestFlage=0;
        lptmr_pulse_clean();                                    //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)        
        count           =   lptmr_pulse_get();                  //保存脉冲计数器计算值        
        printf("LPTMR脉冲计数为:%d\n",   count);                 //打印计数值
      }         
    }
}
void PIT0_IRQHandler()
{      
    PIT_Flag_Clear(PIT0);       //清中断标志位
    add++;
      if( add==10000 )
      {
        add=0;      
        TestFlage=1;
      }
}
关掉PIT0中断用掩饰读取计数值就正常,请问怎样配置才行???
回复

使用道具 举报

发表于 2014-3-11 19:45:49 | 显示全部楼层
我今天也遇到这个问题,坐等山外哥解答
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 19:46:15 | 显示全部楼层
我用的是 @version    v5.0
回复 支持 反对

使用道具 举报

发表于 2014-3-11 19:58:23 | 显示全部楼层
MrC.R 发表于 2014-3-11 19:46
我用的是 @version    v5.0

一天攻破k60代码?
回复 支持 反对

使用道具 举报

发表于 2014-3-11 19:58:38 | 显示全部楼层
MrC.R 发表于 2014-3-11 19:46
我用的是 @version    v5.0

一天攻破k60代码?
回复 支持 反对

使用道具 举报

发表于 2014-3-11 20:01:12 | 显示全部楼层
ゞ從此消失╭ァ 发表于 2014-3-11 19:58
一天攻破k60代码?

不是山外哥的板子吧?我之前看过,新版本的芯片,是有改动的,忘了在哪里看到的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 20:07:26 | 显示全部楼层
栾端静 发表于 2014-3-11 20:01
不是山外哥的板子吧?我之前看过,新版本的芯片,是有改动的,忘了在哪里看到的。

对头,但是跑山外哥LPTMR脉冲计数例程是可以的,是哪里配置错了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 20:11:45 | 显示全部楼层
ゞ從此消失╭ァ 发表于 2014-3-11 19:58
一天攻破k60代码?

是的,不行再用旧版本的那个开LPTMR中断,算中断次数呗,就是想知道为啥,学的不好啊
回复 支持 反对

使用道具 举报

发表于 2014-3-11 20:14:35 | 显示全部楼层
MrC.R 发表于 2014-3-11 20:11
是的,不行再用旧版本的那个开LPTMR中断,算中断次数呗,就是想知道为啥,学的不好啊

旧版本能用,新版本不能用?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 20:23:35 | 显示全部楼层
危隽洁 发表于 2014-3-11 20:14
旧版本能用,新版本不能用?

不是啊,旧版本里是同时 开了PIT0中断,和Lptmr中断的,新版本测试程序没有用到中断就可以读脉冲计数值,但开了PIT0中断计数就不行了,不明白啊不明白。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 20:24:36 | 显示全部楼层
危隽洁 发表于 2014-3-11 20:14
旧版本能用,新版本不能用?

不是啊,旧版本里是同时 开了PIT0中断,和Lptmr中断的,新版本测试程序没有用到中断就可以读脉冲计数值,但开了PIT0中断计数就不行了,不明白啊不明白。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-11 22:22:43 | 显示全部楼层
MrC.R 发表于 2014-3-11 20:24
不是啊,旧版本里是同时 开了PIT0中断,和Lptmr中断的,新版本测试程序没有用到中断就可以读脉冲计数值, ...

你都没有写lptmr的中断处理函数,导致溢出了,读取结果有误
回复 支持 反对

使用道具 举报

发表于 2014-3-11 22:38:38 | 显示全部楼层
我用的是旧的版本。   还是挺好的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-12 10:50:46 | 显示全部楼层
山外メ雲ジ 发表于 2014-3-11 22:22
你都没有写lptmr的中断处理函数,导致溢出了,读取结果有误

uint8 TestFlage=0;
uint16 add=0;
volatile uint32 LPT_INT_count = 0;

void PIT0_IRQHandler();
void LPTMR_IRQHandler();
void main()
{
  uint16 count;
  
#define INT_COUNT  500          //LPT 产生中断的计数次数  
//  DisableInterrupts;                             //禁止总中断

    NVIC_SetPriorityGrouping(4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级
    NVIC_SetPriority(PIT0_IRQn,2);          //配置优先级
    NVIC_SetPriority(LPTMR_IRQn,1);          //配置优先级
   
    FTM_PWM_init(FTM0, FTM_CH0,20*1000,15);
    FTM_PWM_init(FTM0, FTM_CH1,20*1000,0);
   
   lptmr_pulse_init(LPT0_ALT1, INT_COUNT, LPT_Rising);   
     
   pit_init(PIT0, 10000);                           //初始化PIT1,定时时间为: 0.2ms
   set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);                  //设置 PIT0 的中断复位函数为 PIT0_IRQHandler
   set_vector_handler(LPTMR_VECTORn ,LPTMR_IRQHandler);                  //设置 PIT0 的中断复位函数为 PIT0_IRQHandler
   enable_irq(PIT0_IRQn);
   enable_irq(LPTMR_IRQn);
   EnableInterrupts;                                            //开总中断  
    while(1)
    {               
       if( TestFlage==1 )
      {      
        TestFlage=0;
//        lptmr_pulse_clean();                                    //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)        
//        count           =   lptmr_pulse_get();                  //保存脉冲计数器计算值        
//        printf("LPTMR脉冲计数为:%d\n",   count);                 //打印计数值
        
        count = LPTMR0_CNR;                                                     //保存脉冲计数器计算值
        lptmr_pulse_clean();                                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
        printf("1秒钟LPT读取脉冲:%d个\n", LPT_INT_count * INT_COUNT +  count);  //读取间隔1秒的脉冲次数
        LPT_INT_count = 0;                                                      //清空LPT中断次数
               
      }         
    }
}
void PIT0_IRQHandler()
{      
    PIT_Flag_Clear(PIT0);       //清中断标志位
    add++;
      if( add==10000 )
      {
        add=0;      
        TestFlage=1;
      }
}


void LPTMR_IRQHandler()
{
  
LPT_INT_count++;                    //中断溢出加1
LPTMR_Flag_Clear();       //清中断标志位  

}强烈支持,非常感谢哥们强烈支持,非常感谢哥们强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-12 10:51:54 | 显示全部楼层
头上两只角 发表于 2014-3-11 22:38
我用的是旧的版本。   还是挺好的。

强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-12 10:52:25 | 显示全部楼层
危隽洁 发表于 2014-3-11 20:14
旧版本能用,新版本不能用?

强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-12 10:52:51 | 显示全部楼层
栾端静 发表于 2014-3-11 20:01
不是山外哥的板子吧?我之前看过,新版本的芯片,是有改动的,忘了在哪里看到的。

强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-12 10:53:18 | 显示全部楼层
ゞ從此消失╭ァ 发表于 2014-3-11 19:58
一天攻破k60代码?

强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部