OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2815|回复: 5

两路输入捕获成功,四路失败求指导

[复制链接]

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-4-24
在线时间
17 小时
发表于 2020-5-16 14:55:05 | 显示全部楼层 |阅读模式
1金钱
做项目需要用到输入捕获,之前做的两路,tim5的ch1和ch2,都是上升沿捕获,连续捕获到ch1和ch2上的上升沿会记录一次时间差
现在想增加tim2的ch3和ch4,但是增加的这两路却捕获不到,用的stm32f103rct6的芯片,网上查到tim5ch3ch4和tim2ch3ch4是一个端口
麻烦大家帮我看看问题出在哪里,所有程序都是按照前面两路设定的,不知道为什么前面两路可以,后面两路不行



//定时器5输入捕获配置
TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM5_Cap_Init(u16 arr,u16 psc)
{           
            GPIO_InitTypeDefGPIO_InitStructure;
            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       NVIC_InitTypeDef NVIC_InitStructure;
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);    //使能TIM5时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能GPIOA时钟
            
            GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1;  //PA0 清除之前设置  
            GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD; //PA0 输入  
            GPIO_Init(GPIOA,&GPIO_InitStructure);
            GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);                                                               //PA0 下拉
            
            //初始化定时器5 TIM5         
            TIM_TimeBaseStructure.TIM_Period= arr; //设定计数器自动重装值
            TIM_TimeBaseStructure.TIM_Prescaler=psc;  //预分频器   
            TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
            TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式
            TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
            //初始化TIM5输入捕获参数
            TIM5_ICInitStructure.TIM_Channel= TIM_Channel_1; //CC1S=01       选择输入端 IC1映射到TI1
         TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      //上升沿捕获
         TIM5_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //映射到TI1
         TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
         TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
         TIM_ICInit(TIM5, &TIM5_ICInitStructure);
            
            TIM5_ICInitStructure.TIM_Channel= TIM_Channel_2; //CC1S=01       选择输入端 IC1映射到TI2
         TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      //上升沿捕获
         TIM5_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //映射到TI2
         TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
         TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
         TIM_ICInit(TIM5, &TIM5_ICInitStructure);
            
            
            //中断分组初始化
            NVIC_InitStructure.NVIC_IRQChannel= TIM5_IRQn;  //TIM3中断
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;  //先占优先级2
            NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;  //从优先级0
            NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; //IRQ通道被使能
            NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
            
            TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断         
            TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
            
       TIM_Cmd(TIM5,ENABLE );    //使能定时器5
   
}
u8  TIM5CH1_CAPTURE_STA=0;   //输入捕获状态                                                      
u16    TIM5CH1_CAPTURE_VAL;       //输入捕获值
//定时器5中断服务程序     
            
void TIM5_IRQHandler(void)
{
  if((TIM5CH1_CAPTURE_STA&0X80)==0)   //还未成功捕获         0x80=1000 0000               1
       {         
          if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)   // 判断定时器是否发生更新(溢出)中断
              {            
                 if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 0x40=0100 0000
                      {
               
                                       TIM5CH1_CAPTURE_STA++;                                
                      }         
              }
          if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
               {               
                  if((TIM5CH1_CAPTURE_STA&0X40)==0)                        
                      {
                                                                                                                                 
                         TIM_SetCounter(TIM5,0);                                                                                                        
                         TIM5CH1_CAPTURE_STA=0;                              //清空
                                               TIM5CH1_CAPTURE_VAL=0;
                                               TIM5CH1_CAPTURE_STA|=0X40;                    //标记捕获到了上升沿                                                                                                                                          
                      }
                }               
          if(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
             {        
                if(TIM5CH1_CAPTURE_STA&0X40)               
                      {           
                     TIM5CH1_CAPTURE_VAL=TIM_GetCapture2(TIM5);                                                               
                      TIM5CH1_CAPTURE_STA|=0X80;                  //标记成功捕获到一次高电平脉宽                                                                                                                                       
                      }
             }
}
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清除中断标志位
    TIM_ClearITPendingBit(TIM5,TIM_IT_CC1); //清除中断标志位
    TIM_ClearITPendingBit(TIM5,TIM_IT_CC2); //清除中断标志位  
}
//定时器2输入捕获配置
TIM_ICInitTypeDef TIM2_ICInitStructure;
void TIM2_Cap_Init(u16 arr,u16 psc)
{           
            GPIO_InitTypeDefGPIO_InitStructure;
            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       NVIC_InitTypeDef NVIC_InitStructure;
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);    //使能TIM5时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能GPIOA时钟
            
            GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3;  //PA0 清除之前设置  
            GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD; //PA0 输入  
            GPIO_Init(GPIOA,&GPIO_InitStructure);
            GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);                                                               //PA0 下拉
            
            //初始化定时器5 TIM5         
            TIM_TimeBaseStructure.TIM_Period= arr; //设定计数器自动重装值
            TIM_TimeBaseStructure.TIM_Prescaler=psc;  //预分频器   
            TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
            TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式
            TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
            //初始化TIM5输入捕获参数
            TIM2_ICInitStructure.TIM_Channel= TIM_Channel_3; //CC1S=01       选择输入端 IC1映射到TI1
         TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      //上升沿捕获
         TIM2_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //映射到TI1
         TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
         TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
         TIM_ICInit(TIM2, &TIM2_ICInitStructure);
            
            TIM2_ICInitStructure.TIM_Channel= TIM_Channel_4; //CC1S=01       选择输入端 IC1映射到TI2
         TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      //上升沿捕获
         TIM2_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //映射到TI2
         TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频
         TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
         TIM_ICInit(TIM2, &TIM2_ICInitStructure);
            
            
            //中断分组初始化
            NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;  //TIM3中断
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;  //先占优先级2
            NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;  //从优先级0
            NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE; //IRQ通道被使能
            NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
            
            TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC3,ENABLE);//允许更新中断 ,允许CC1IE捕获中断         
            TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
            
       TIM_Cmd(TIM2,ENABLE );    //使能定时器5
   
}
u8  TIM2CH3_CAPTURE_STA=0;   //输入捕获状态                                                      
u16    TIM2CH3_CAPTURE_VAL;       //输入捕获值
//定时器2中断服务程序     
            
void TIM2_IRQHandler(void)
{
  if((TIM2CH3_CAPTURE_STA&0X80)==0)   //还未成功捕获        0x80=1000 0000               1
       {         
          if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   // 判断定时器是否发生更新(溢出)中断
              {            
                 if(TIM2CH3_CAPTURE_STA&0X40)//已经捕获到高电平了 0x40=0100 0000
                      {                           
                                       TIM2CH3_CAPTURE_STA++;                                
                      }         
              }
          if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)//捕获1发生捕获事件
               {               
                 if((TIM2CH3_CAPTURE_STA&0X40)==0)                        
                      {
                          TIM_SetCounter(TIM2,0);                                                                                             
                         TIM2CH3_CAPTURE_STA=0;                              //清空
                                               TIM2CH3_CAPTURE_VAL=0;
                                               TIM2CH3_CAPTURE_STA|=0X40;                    //标记捕获到了上升沿                                                                                                                                          
                      }
                }               
          if(TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)//捕获1发生捕获事件
             {        
                if(TIM2CH3_CAPTURE_STA&0X40)               
                      {                    
                     TIM2CH3_CAPTURE_VAL=TIM_GetCapture4(TIM2);                                                               
                      TIM2CH3_CAPTURE_STA|=0X80;                  //标记成功捕获到一次高电平脉宽                                                                                                                                       
                      }
             }
}
   TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
    TIM_ClearITPendingBit(TIM2,TIM_IT_CC3); //清除中断标志位
    TIM_ClearITPendingBit(TIM2,TIM_IT_CC4); //清除中断标志位  
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-16 14:55:07 | 显示全部楼层
回复

使用道具 举报

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-4-24
在线时间
17 小时
 楼主| 发表于 2020-5-16 15:12:42 | 显示全部楼层
配置里面有错误吗
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-5-16 15:32:19 | 显示全部楼层
【战舰(探索者)同一个定时器四路(三路)输入捕获过程】http://www.openedv.com/forum.php?mod=viewthread&tid=289337
回复

使用道具 举报

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-4-24
在线时间
17 小时
 楼主| 发表于 2020-5-16 16:40:03 | 显示全部楼层
login_FAE 发表于 2020-5-16 15:32
【战舰(探索者)同一个定时器四路(三路)输入捕获过程】http://www.openedv.com/forum.php?mod=viewthrea ...

谢谢
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-11-16
在线时间
9 小时
发表于 2020-6-26 19:50:57 | 显示全部楼层
MINI板咋弄呢,大佬
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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