OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 3213|回复: 7

STM32F103RCT6利用定时器2实现多路捕获

[复制链接]

  离线 

2

主题

4

帖子

0

精华

新手入门

积分
33
金钱
33
注册时间
2015-10-24
在线时间
0 小时
发表于 2015-12-6 22:29:24 | 显示全部楼层 |阅读模式
5金钱
STM32F103RCT6利用定时器2实现四路输入捕获,根据官方例程单路捕获没有问题,想改一下做成四路捕获,自己稍微改了下void TIM2_Cap_Init(u16 arr,u16 psc)的程序,发现都不行了,理论上应该是可以的我把程序贴一下请各位帮忙看看

回复

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128283
金钱
128283
注册时间
2010-12-1
在线时间
1134 小时
发表于 2015-12-6 22:54:44 | 显示全部楼层
帮顶.....
回复

使用道具 举报

  离线 

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-10-18
在线时间
1 小时
发表于 2016-11-3 19:02:42 | 显示全部楼层
同问 我也是这个问题 我用的TIM5
回复

使用道具 举报

  离线 

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-10-18
在线时间
1 小时
发表于 2016-11-3 20:28:47 | 显示全部楼层
我知道了  定时器可以多通道PWM输出 但是只能单通道捕获
回复

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

新手入门

积分
48
金钱
48
注册时间
2015-2-27
在线时间
8 小时
发表于 2017-3-15 14:10:52 | 显示全部楼层
正点原子公众号
你只打开了第一路的捕获中断,其它三路怎么能捕获得了呢?
回复

使用道具 举报

  离线 

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2017-1-29
在线时间
22 小时
发表于 2017-6-20 12:40:22 | 显示全部楼层
请问你的多路输入捕获程序调试完成了吗?怎么才能实现多路输入捕获呢,谢谢。
回复

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

新手入门

积分
43
金钱
43
注册时间
2013-11-30
在线时间
7 小时
发表于 2017-7-19 17:46:11 | 显示全部楼层
本帖最后由 海上浮萍 于 2017-7-20 13:49 编辑

//定时器2通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM2_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<0;           //TIM2 时钟使能
        RCC->APB2ENR|=1<<2;            //使能PORTA时钟  
         
        GPIOA->CRL&=0XFFFF0000;        //PA0 清除之前设置  
        GPIOA->CRL|=0X00008888;        //PA0 输入   
        GPIOA->ODR|=0<<0;                //PA0 下拉
         
         TIM2->ARR=arr;                  //设定计数器自动重装值   
        TIM2->PSC=psc;                  //预分频器

        TIM2->CCMR1|=1<<0;                //CC1S=01         选择输入端 IC1映射到TI1上
         
        TIM2->CCMR1|=1<<8;                //CC2S=01         选择输入端 IC2映射到TI2上

        TIM2->CCMR2|=1<<0;                //CC3S=01         选择输入端 IC3映射到TI3上

        TIM2->CCMR2|=1<<8;                //CC4S=01         选择输入端 IC4映射到TI4上


        TIM2->CCER|=0<<1;                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<0;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM2->CCER|=0<<5;                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<4;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM2->CCER|=0<<9;                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<8;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM2->CCER|=0<<13;                 //CC1P=0        上升沿捕获
        TIM2->CCER|=1<<12;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM2->DIER|=0x0f<<1;           //允许捕获中断                                
        TIM2->DIER|=1<<0;           //允许更新中断        
        TIM2->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM2_IRQChannel,2);//抢占2,子优先级0,组2           
}

TIM_Cap_Dat_T TIM_Cap_Dat;
u32 RGB[18];//颜射传感器数据
//定时器2中断服务程序         
void TIM2_IRQHandler(void)
{         
        u16 tsr;
        tsr=TIM2->SR;

        if(tsr&0X01)//溢出中断
        {            
                TIM_Cap_Dat.cap_time[0] += 65536;
                TIM_Cap_Dat.cap_time[1] += 65536;
                TIM_Cap_Dat.cap_time[2] += 65536;
                TIM_Cap_Dat.cap_time[3] += 65536;
        }
        if(tsr&(1<<1))//捕获1发生捕获事件
        {        
                if(TIM_Cap_Dat.state.bit.cap1_state == 0)//判断是否是第一次捕获到高电平
                {

                }
                else//第二次捕获到上升延
                {
  
                }
        }                                                                                    
         if(tsr&(1<<2))//捕获2发生捕获事件
        {        
                if(TIM_Cap_Dat.state.bit.cap2_state == 0)//判断是否是第一次捕获到高电平
                {

                }
                else//第二次捕获到上升延
                {

                }
        }
         if(tsr&(1<<3))//捕获3发生捕获事件
        {        
                if(TIM_Cap_Dat.state.bit.cap3_state == 0)//判断是否是第一次捕获到高电平
                {
   
                }
                else//第二次捕获到上升延
                {

                }
        }
         if(tsr&(1<<4))//捕获4发生捕获事件
        {        
                if(TIM_Cap_Dat.state.bit.cap4_state == 0)//判断是否是第一次捕获到高电平
                {
      
                }
                else//第二次捕获到上升延
                {

                }
        }        
        TIM2->SR=0;//清除中断标志位            
}
回复

使用道具 举报

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2017-10-31
在线时间
31 小时
发表于 2018-3-13 17:30:32 | 显示全部楼层
要开启通道2,3,4的捕捉中断
敬往事一杯酒,再爱也不回头
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-23 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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