野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14553|回复: 21

TIM2捕获程序

[复制链接]
发表于 2015-11-14 19:27:43 | 显示全部楼层 |阅读模式
以下是我写的程序,可是为什么只有A0管脚可以捕获到值,其他的管脚都不行????????????????、、

我按照STM32中文参考手册,用其他TIMX对应管脚结果都没反应???????????????为什么,是我程序有问题吗?????、、、、、、请各位高手指导下!!!!!!!!!!!!!!!




static void TIM2_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/// TIM2ÖD¶ÏóÅÏ輶ÅäÖÃ
void TIM2_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;          
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*
* TIM_Period / Auto Reload Register(ARR) = 1000   TIM_Prescaler--71
* ÖD¶ÏÖüÆúÎa = 1/(72MHZ /72) * 1000 = 1ms
*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIM_Period(ARR) --> ÖD¶Ï ÇòTIMxCNTÖØÖÃÎa0ÖØD¼Æêy
*/
void TIM2_Cap_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
          TIM_ICInitTypeDef    TIM_ICInitStructure;
          TIM_OCInitTypeDef    TIM_OCInitStructure;
  
                /* éèÖÃTIM2CLK Îa 72MHZ */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
    TIM_DeInit(TIM2);
       
       
          TIM_TimeBaseStructure.TIM_Prescaler= (uint16_t)(72000000/2000000)-1;
          TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
          /* ×Ô¶ˉÖØ×°ÔؼÄ′æÆ÷ÖüÆúμÄÖμ(¼ÆêyÖμ) */
    TIM_TimeBaseStructure.TIM_Period=65535;
          /* ¶Ôía2¿ê±Öó½øDD2éÑùμÄê±Öó·ÖÆμ,ÕaàïûóDóÃμ½ */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_RepetitionCounter= 0x00;   
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       
          
          TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
          TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
                TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
       
          TIM_ICInitStructure.TIM_ICFilter = 0x01;
                 
                 /*TIM2μÄí¨μàËÄéèÖÃÎa  êäèë2¶»ñ  Ä£ê½ */
                TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
                TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
                TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
                TIM_ICInitStructure.TIM_Channel=TIM_Channel_4;
                TIM_ICInit(TIM2,&TIM_ICInitStructure);
               
               
               
                TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);
                TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
                TIM_ITConfig(TIM2,TIM_IT_CC3,ENABLE);
                TIM_ITConfig(TIM2,TIM_IT_CC4,ENABLE);
    TIM_Cmd(TIM2, ENABLE);                                                                                                                                               
      
}

void TIM2_ANG_Init(void)
{
        TIM2_GPIO_Config();
        TIM2_Cap_Config();       
        TIM2_NVIC_Config();
}

主题推荐

回复

使用道具 举报

发表于 2015-11-16 10:08:22 | 显示全部楼层
中断函数呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:10:45 | 显示全部楼层

这个是简化后的,因为我只需要两路捕获值

void TIM2_IRQHandler(void)
{   u8 i=0;
     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  }

if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
        TIM2Capture[0] = TIM_GetCapture1(TIM2);       
}

if(TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET)
{
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
        TIM2Capture[1] = TIM_GetCapture2(TIM2);       
}

TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE);
TIM_ITConfig(TIM2, TIM_IT_CC4, DISABLE);
}
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:11:40 | 显示全部楼层
1、参考 TIM—输入捕获(测量脉宽)这个例程,这个是用 PA0 测量 高电平的例程
这个例程只需要修改几个宏就可以改成TIM2 的 PA1来捕获 ,并不需要改其他部分的初始化代码

2、从你贴的例程来看,TIM_ITConfig ( macTIMx, TIM_IT_Update | macTIM_IT_CCx, ENABLE );这个初始化跟我们的不怎么一样。

3、你这个程序从哪里抄来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:13:58 | 显示全部楼层
fire 发表于 2015-11-16 10:11
1、参考 TIM—输入捕获(测量脉宽)这个例程,这个是用 PA0 测量 高电平的例程
这个例程只需要修改几个宏 ...

那个程序V3板子的,我的是V2不适合吧,网上参考的啊?????
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:15:49 | 显示全部楼层
Vicky 发表于 2015-11-16 10:10
这个是简化后的,因为我只需要两路捕获值

void TIM2_IRQHandler(void)

void TIM2_IRQHandler(void)
{   u8 i=0;
     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  }

if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
        TIM2Capture[0] = TIM_GetCapture1(TIM2);        
}

if(TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET)
{
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
        TIM2Capture[1] = TIM_GetCapture2(TIM2);        
}

TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE);
TIM_ITConfig(TIM2, TIM_IT_CC4, DISABLE);

}

中断里你有检测的pwm通道,但又把它disable了,那就不会在中断处理了。
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:18:49 | 显示全部楼层
Vicky 发表于 2015-11-16 10:13
那个程序V3板子的,我的是V2不适合吧,网上参考的啊?????

1、V2 跟 V3  按键 PA0 的接法都是一样的,程序通用,都是上升沿有效,具体的你参考下原理图
2、PA1在V2板子上已经在摄像头接口引出,并没有接到其他的IC,所以是没有复用,可以使用捕获的功能

3、建议参考我们可以使用的程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:19:54 | 显示全部楼层
flyleaf 发表于 2015-11-16 10:15
void TIM2_IRQHandler(void)
{   u8 i=0;
     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

最后两句我注释了也不行,而且A0一直都有反应的,A1没反应


最后两句不注释,A0捕获到的值会变,注释的话取得值就是一开始捕获的,,,,不管去不去换其他通道A1-A3都没反应
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:21:39 | 显示全部楼层
fire 发表于 2015-11-16 10:11
1、参考 TIM—输入捕获(测量脉宽)这个例程,这个是用 PA0 测量 高电平的例程
这个例程只需要修改几个宏 ...

就那一句吗????????????其他的都没问题吧??????
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:22:28 | 显示全部楼层
Vicky 发表于 2015-11-16 10:21
就那一句吗????????????其他的都没问题吧??????

其他没看出有啥问题,我再说一句,参考下我们的例程 。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:24:30 | 显示全部楼层
fire 发表于 2015-11-16 10:22
其他没看出有啥问题,我再说一句,参考下我们的例程 。

你们那个输入捕获测脉宽的吗???那是V3板的,我的V2可以用吗????还有我没有那个例程
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:27:00 | 显示全部楼层
Vicky 发表于 2015-11-16 10:24
你们那个输入捕获测脉宽的吗???那是V3板的,我的V2可以用吗????还有我没有那个例程

1、V2 跟 V3  按键 PA0 的接法都是一样的,程序通用,都是上升沿有效,具体的你参考下原理图
2、PA1在V2板子上已经在摄像头接口引出,并没有接到其他的IC,所以是没有复用,可以使用捕获的功能

3、建议参考我们可以使用的程序。 TIM—输入捕获(测量脉宽).zip (544.57 KB, 下载次数: 21)
回复 支持 反对

使用道具 举报

发表于 2015-11-16 10:29:45 | 显示全部楼层
Vicky 发表于 2015-11-16 10:24
你们那个输入捕获测脉宽的吗???那是V3板的,我的V2可以用吗????还有我没有那个例程

我再说一遍
1、这个是测量高电平的时间
2、V3跟V2通用

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 10:31:16 | 显示全部楼层
fire 发表于 2015-11-16 10:27
1、V2 跟 V3  按键 PA0 的接法都是一样的,程序通用,都是上升沿有效,具体的你参考下原理图
2、PA1在V2 ...

好的,谢谢,我看看。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-19 15:48:32 | 显示全部楼层
本帖最后由 Vicky 于 2015-11-19 16:31 编辑
fire 发表于 2015-11-16 10:29
我再说一遍
1、这个是测量高电平的时间
2、V3跟V2通用

大神你确定V2\V3都可以用这程序吗?可是好多语句都识别不了,显示错误????????????????
好难改啊。。。。。。。。。。。。。。。。我都束手无策了!!!!
而且要是你给的程序A1可以的话,那我这程序A1页应该可以啊???????????

我现在就想知道可有什么方法检查A0与A1\A2\A3的区别,为什么其他的就不行??????
回复 支持 反对

使用道具 举报

发表于 2015-11-19 17:03:06 | 显示全部楼层
Vicky 发表于 2015-11-19 15:48
大神你确定V2\V3都可以用这程序吗?可是好多语句都识别不了,显示错误????????????????
...

定时器是通用的啊,
就算不通用程序也是可以编译的,为什么你说语句识别不了?是你的编译器有问题吧
回复 支持 反对

使用道具 举报

发表于 2015-11-19 18:48:29 | 显示全部楼层
Vicky 发表于 2015-11-19 15:48
大神你确定V2\V3都可以用这程序吗?可是好多语句都识别不了,显示错误????????????????
...

1、V2 跟 V3的 PA0 接的按键都通用

2、A0可以的话,那A1/2/3也是可以的,或者你把你程序发上来我瞧瞧
回复 支持 反对

使用道具 举报

发表于 2015-11-19 18:50:03 | 显示全部楼层
Vicky 发表于 2015-11-19 15:48
大神你确定V2\V3都可以用这程序吗?可是好多语句都识别不了,显示错误????????????????
...

V3的程序用的是KEIL5,如果你用KEIL4是编译不了的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 20:50:10 | 显示全部楼层
fire 发表于 2015-11-19 18:50
V3的程序用的是KEIL5,如果你用KEIL4是编译不了的

好吧,我按照之前安装的是Keil4,可是你发的程序也只用到A0,A0本来就可以啊,要是这个程序A1\A2\A3可以的话,那我之前发的程序应该也可以啊?????????????????

而且你也说没什么错,你发的程序都不太好理解,没之前我上传的那个好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-22 20:51:53 | 显示全部楼层
flyleaf 发表于 2015-11-19 17:03
定时器是通用的啊,
就算不通用程序也是可以编译的,为什么你说语句识别不了?是你的编译器有问题吧

我想问下,TIM2\TIM3\TIM4\TIM5都是通用定时器,功能都一样,配置也一样,可是为什么有的一个通道都用不了???????????????
回复 支持 反对

使用道具 举报

发表于 2015-11-23 08:47:55 | 显示全部楼层
Vicky 发表于 2015-11-22 20:51
我想问下,TIM2\TIM3\TIM4\TIM5都是通用定时器,功能都一样,配置也一样,可是为什么有的一个通道都用不 ...

定时器换了需要修改GPIO引脚初始化部分的程序。
要不你分开一步步调吧,先调定时器定时,在开启中断,再写定时器输出,最后写捕获,一步步来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-24 13:50:11 | 显示全部楼层
flyleaf 发表于 2015-11-23 08:47
定时器换了需要修改GPIO引脚初始化部分的程序。
要不你分开一步步调吧,先调定时器定时,在开启中断,再 ...

我写好了,分别用两个定时器实现的,谢谢 啊!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-29 01:16 , Processed in 0.038467 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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