打印

关于STM32的定时器输入捕获问题

[复制链接]
5034|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhpg009|  楼主 | 2012-4-25 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhpg009 于 2012-4-25 18:12 编辑

TIM1使能之后,当捕获到一个上升沿时,也就是发生了一个输入捕获事件,如果设置了中断,则会产生一个中断,此时计数器TIM2_CNT被传到TIM1_CCR1寄存器中并进行比较,我是用TIM1进行捕获脉冲个数,用TIM2进行计数。TIM2定时为1s 。
我想问的是,它们之间在比较什么? 比较大小吗??   还是比较看他们的值是否匹配??  TIM1_CCR1是存放当前捕获的脉冲个数的吗??
假设,TIM2_CNT计数的周期为0.1ms(频率为10KHZ),且TIM2_CNT当前的值为10,
当发生捕获事件后,TIM2_CNT的值会被传到TIM1_CCR1(TIM1_CCR1当前捕获的脉冲个数的为10)中与其进行比较,匹配之后进入TIM1中断,记下脉冲的个数NUM值。然后TIM1继续捕获,当TIM2定时1S到了之后,TIM1捕获到多少个脉冲?????

void TIMER1_Configration(void)
{
  TIM_ICInitTypeDef    TIM_ICInitStructure;   
  /*定时器1捕获设置,每4个事件触发一次捕获*/
  TIM_ICInitStructure.TIM_Channel =TIM_Channel_1;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;   
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;              
  TIM_ICInitStructure.TIM_ICFilter = 0;         
  TIM_ICInit(TIM1,&TIM_ICInitStructure);
   
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);               
  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);                          
  TIM_Cmd(TIM1, ENABLE);                                                                        
}


void TIMER2_Configration(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;      
   TIM_TimeBaseStructure.TIM_Prescaler = 7199;   
   TIM_TimeBaseStructure.TIM_Period = 10000;   
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;         
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);      
   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM2, ENABLE);

}
沙发
香水城| | 2012-4-25 18:31 | 只看该作者
TIM1使能之后,当捕获到一个上升沿时,也就是发生了一个输入捕获事件,如果设置了中断,则会产生一个中断,此时计数器TIM2_CNT被传到TIM1_CCR1寄存器中并进行比较,我是用TIM1进行捕获脉冲个数,用TIM2进行计数。TIM ...
zhpg009 发表于 2012-4-25 18:09


使用TIM1进行捕获,发生了一个输入捕获事件时,是计数器TIM1_CNT被传到TIM1_CCR1寄存器中,而不是TIM2_CNT,TIM1的操作与TIM2没有关系。

计数器TIM1_CNT的内容被传到TIM1_CCR1寄存器后,这次捕获的操作就结束了,没有什么所谓的比较。

使用特权

评论回复
板凳
zhpg009|  楼主 | 2012-4-25 18:41 | 只看该作者
void TIM1_CC_IRQHandler(void)
{

  if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!= RESET) //每4个事件触发一次捕获,并产生一次中断
  {  
     TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); //清除TIM1捕获/比较1的中断标记(TIM1->SR的CC1IF)   
     PULSECAP_InitStructure.CapCountNum++; //捕获的脉冲个数自增
  }
}


void TIM2_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
    {
       TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
       PULSECAP_InitStructure.FreqValue = PULSECAP_InitStructure.CapCountNum <<2;         
       PULSECAP_InitStructure.CapCountNum = 0; //1s之后将统计的脉冲数清零
    }
}

这是TIM1和TIM2的中断服务函数!
TIM1的中断是 记录脉冲数

TIM2的中断1s之后将统计的脉冲数清零

他们没关系吗???

使用特权

评论回复
地板
zhpg009|  楼主 | 2012-4-25 18:43 | 只看该作者
这份程序的TIM1_CNT是空值,对吗??

使用特权

评论回复
5
香水城| | 2012-4-25 18:48 | 只看该作者
在硬件上,TIM1和TIM2的唯一关系是:它们都在同一个芯片上并共享供电,除此之外,在操作上没有任何关系。

你的程序里有什么关系,是你自己软件的问题,我不知道。

使用特权

评论回复
6
zhpg009|  楼主 | 2012-4-25 18:55 | 只看该作者
哦。谢谢!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:进取

16

主题

139

帖子

0

粉丝