打印

请教下STM32的定时器输入捕获

[复制链接]
6036|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abin0415|  楼主 | 2012-12-4 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各路大神,小弟在用定时器输入捕获时,一直无法进入中断。以下为TIM1的通道2的寄存器配置。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
static void TIM1_GPIO_Config(void)
{
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);        
}

static void TIM1_IC_Config(void)
{
    TIM_ICInitTypeDef TIM_ICInitStructure;
          TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
          TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
          TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
          TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
          TIM_ICInitStructure.TIM_ICFilter = 0;       
          TIM_ICInit(TIM1,&TIM_ICInitStructure);
    TIM_ClearFlag(TIM1, TIM_FLAG_CC2);       
    TIM_Cmd(TIM1, ENABLE);        
    TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);       

}

static void NVIC_TIM1_IC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    /* Configure the NVIC Preemption Priority Bits */  
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
          /* enabling interrupt */
          NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
}

中断处理函数,
/**
  * @brief  This function handles TIM1 capture compare interrupt request.
  * @param  None
  * @retval None
  */
void TIM1_CC_IRQHandler(void)
{
         if(TIM_GetITStatus(TIM1,TIM_IT_CC2)!= RESET)
   {  
     TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);               
  }
}
PB14用作TIM1的通道2,输入峰峰值为2.9V的脉冲,一直无法进入中断,烦请各路大神指点。小弟50分奉上。

沙发
airwill| | 2012-12-4 16:34 | 只看该作者
怎么没有看到开启定时器时钟呢?
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  // 开启 TIM1 时钟

使用特权

评论回复
板凳
abin0415|  楼主 | 2012-12-4 16:41 | 只看该作者
airwill 发表于 2012-12-4 16:34
怎么没有看到开启定时器时钟呢?
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  // 开启 TIM1 时 ...

有啊,代码上面一行就是开启TIM1时钟

使用特权

评论回复
地板
airwill| | 2012-12-4 16:43 | 只看该作者
代码上面一行就是开启TIM1时钟?
哪行呀, 我怎么没有看到, 是你没有贴出来吗?

使用特权

评论回复
5
abin0415|  楼主 | 2012-12-4 16:57 | 只看该作者
airwill 发表于 2012-12-4 16:43
代码上面一行就是开启TIM1时钟?
哪行呀, 我怎么没有看到, 是你没有贴出来吗? ...

第一段代码的上头,没有贴在代码段里面。最上头有一行文字,下一行就是开TIM1时钟。您再看下。运行此代码后TIM1->CNT一直在计数。由此可断定TIM1是开着的。

使用特权

评论回复
6
song19881218| | 2012-12-4 16:59 | 只看该作者
定时器配置呢?

使用特权

评论回复
7
airwill| | 2012-12-4 16:59 | 只看该作者
哦, 不在代码里的上边, 我看到了

使用特权

评论回复
8
abin0415|  楼主 | 2012-12-4 17:06 | 只看该作者
airwill 发表于 2012-12-4 16:43
代码上面一行就是开启TIM1时钟?
哪行呀, 我怎么没有看到, 是你没有贴出来吗? ...

烦请大神看看哪个配置的不对,现在情况是TIM1->CNT一直计数,PB14管脚有峰峰值2.9V的脉冲输入,但就是不产生中断。中断标志位也没有置位。

使用特权

评论回复
9
abin0415|  楼主 | 2012-12-4 17:08 | 只看该作者
song19881218 发表于 2012-12-4 16:59
定时器配置呢?

现在TIM1配置为输入捕获,您指的定时器配置具体是什么配置呢?

使用特权

评论回复
10
airwill| | 2012-12-4 17:44 | 只看该作者
我找了下例子里还要这样的函数, 你试试看
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP1);

使用特权

评论回复
11
abin0415|  楼主 | 2012-12-4 18:32 | 只看该作者
airwill 发表于 2012-12-4 17:44
我找了下例子里还要这样的函数, 你试试看
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP1);
...

试过了,这个也不行。这句是选择Trigger中断的中断源。我想要输入捕获的中断。

使用特权

评论回复
12
wudayongnb| | 2012-12-5 09:15 | 只看该作者
你没初始化定时器的时基啊,只是初始化了输入捕获模块,你把完整代码贴出来

使用特权

评论回复
13
abin0415|  楼主 | 2012-12-5 11:28 | 只看该作者
wudayongnb 发表于 2012-12-5 09:15
你没初始化定时器的时基啊,只是初始化了输入捕获模块,你把完整代码贴出来 ...

这就是我的定时器代码,都在上面了。现在发现PB14是TIM1的CH2N,通道2的反相端是不是只做输出,不做输入?

使用特权

评论回复
14
mfy0501| | 2012-12-5 13:39 | 只看该作者
void TIM1_Configuration(void)
{
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;//配置TIMER1作为计数器   
        TIM_DeInit(TIM1);
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;          //  自动重装值
   TIM_TimeBaseStructure.TIM_Prescaler = 0;          //预分频系数,计时精度=psc*ck_int
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // Time base configuration
} 时钟的基本配置也要有的

使用特权

评论回复
15
mfy0501| | 2012-12-5 13:40 | 只看该作者
TIM_Cmd(TIM1, ENABLE);

使用特权

评论回复
16
abin0415|  楼主 | 2012-12-5 16:19 | 只看该作者
mfy0501 发表于 2012-12-5 13:39
void TIM1_Configuration(void)
{
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;//配置TIMER1作为计 ...

如果单纯的考虑输入捕获,TIM Base是不需要的。当然你也可以设置,设置就是设置计数时间单位,即多长时间CNT加一,就可以得到两个脉冲之间的时间,进而做其他处理。

使用特权

评论回复
17
a1104030212| | 2014-4-2 13:03 | 只看该作者
这个问题解决了吗?我也遇到了。。程序一直进中断。。很可能是什么标志位没清除

使用特权

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

本版积分规则

个人签名:细节决定成败,态度决定高度。

17

主题

2105

帖子

5

粉丝