OpenEdv-开源电子网

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

关于输入捕获中捕获判断的问题,求大神讲解

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-4-7
在线时间
1 小时
发表于 2016-4-7 13:51:52 | 显示全部楼层 |阅读模式
5金钱

作为一个新手,我有一个疑惑,关于 输入捕获实验模块中 TIM5CH1_CAPTURE_STA的定义
为什么当TIM5CH1_CAPTURE_STA最高位为零的时候是还未捕获
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 而当六位为1的时候,为捕获到了高电平。---(1)
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了        ---(2)
别告诉我就是那么定义的,文件中只有以下说明
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态        ----(3)
凭什么只在文件中写了        (3),就可以说当最高位不为零时未捕获,第六位为一时就是捕获到高电平,我知道文件中有TIM5CH1_CAPTURE_STA++
但它们的关系不甚明白,
    TIM5CH1_CAPTURE_STA满足第六位为1时,是什么样子的,凭什么说捕获到高电平了
急急急!!!







新建 Microsoft Word 文档.pdf

297.71 KB, 下载次数: 455

程序

最佳答案

查看完整内容[请看2#楼]

这个是我们自己定义的一个规则(协议),根据这个规则来做,就可以实现捕获高电平脉宽。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-4-7 13:51:53 | 显示全部楼层
这个是我们自己定义的一个规则(协议),根据这个规则来做,就可以实现捕获高电平脉宽。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-4-7
在线时间
1 小时
 楼主| 发表于 2016-4-7 13:54:00 | 显示全部楼层
这是程序

#include "timer.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//定时器 驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/4
//版本:V1.2
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//********************************************************************************
//修改说明
//V1.1 20140504
//新增TIM14_PWM_Init函数,用于PWM输出
//V1.2 20140504
//新增TIM5_CH1_Cap_Init函数,用于输入捕获
//////////////////////////////////////////////////////////////////////////////////          


//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{                                                                   
        if(TIM3->SR&0X0001)//溢出中断
        {
                LED1=!LED1;                                                                                                                       
        }                                  
        TIM3->SR&=~(1<<0);//清除中断标志位             
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为42M
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<1;        //TIM3时钟使能   
        TIM3->ARR=arr;          //设定计数器自动重装值
        TIM3->PSC=psc;          //预分频器          
        TIM3->DIER|=1<<0;   //允许更新中断          
        TIM3->CR1|=0x01;    //使能定时器3
          MY_NVIC_Init(1,3,TIM3_IRQn,2);        //抢占1,子优先级3,组2                                                                         
}

//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{                                                          
        //此部分需手动修改IO口设置
        RCC->APB1ENR|=1<<8;         //TIM14时钟使能   
        RCC->AHB1ENR|=1<<5;           //使能PORTF时钟       
        GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_AF_Set(GPIOF,9,9);        //PF9,AF9
       
        TIM14->ARR=arr;                        //设定计数器自动重装值
        TIM14->PSC=psc;                        //预分频器不分频
        TIM14->CCMR1|=6<<4;          //CH1 PWM1模式                 
        TIM14->CCMR1|=1<<3;         //CH1 预装载使能          
        TIM14->CCER|=1<<0;           //OC1 输出使能       
        TIM14->CCER|=1<<1;           //OC1 低电平有效          
        TIM14->CR1|=1<<7;           //ARPE使能
        TIM14->CR1|=1<<0;            //使能定时器14                                                                                           
}  

//定时器2通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{                 
        RCC->APB1ENR|=1<<3;           //TIM5 时钟使能
        RCC->AHB1ENR|=1<<0;           //使能PORTA时钟       
        GPIO_Set(GPIOA,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//复用功能,下拉
        GPIO_AF_Set(GPIOA,0,2);        //PA0,AF2
          
        TIM5->ARR=arr;                  //设定计数器自动重装值   
        TIM5->PSC=psc;                  //预分频器

        TIM5->CCMR1|=1<<0;                //CC1S=01         选择输入端 IC1映射到TI1上
        TIM5->CCMR1|=0<<4;                 //IC1F=0000 配置输入滤波器 不滤波
        TIM5->CCMR1|=0<<10;         //IC1PS=00         配置输入分频,不分频

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

        TIM5->EGR=1<<0;                        //软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效!
        TIM5->DIER|=1<<1;           //允许捕获1中断                               
        TIM5->DIER|=1<<0;           //允许更新中断       
        TIM5->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占2,子优先级0,组2          
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u32        TIM5CH1_CAPTURE_VAL;        //输入捕获值(TIM2/TIM5是32位)
//定时器5中断服务程序         
/*void TIM5_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM5->SR;
        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {
                if(tsr&0X01)//溢出
                {             
                          if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                                {
                                       if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                          {
                                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获了一次
                                                TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
                                           }
                                      else TIM5CH1_CAPTURE_STA++;
                                }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                           if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                               {                                 
                                      TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                                  TIM5CH1_CAPTURE_VAL=TIM5->CCR1;        //获取当前的捕获值.
                                       TIM5->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
                                 }
                                else                                                                  //还未开始,第一次捕获上升沿
                               {
                                     TIM5CH1_CAPTURE_STA=0;                        //清空
                                     TIM5CH1_CAPTURE_VAL=0;
                                     TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                     TIM5->CR1&=~(1<<0)                ;            //使能定时器2
                                      TIM5->CNT=0;                                        //计数器清空
                                      TIM5->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
                                     TIM5->CR1|=0x01;                            //使能定时器2
                                  }                    
                }                                                                                   
        }
            TIM5->SR=0;//清除中断标志位   
}

*/
void TIM5_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM5->SR;         
        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {
                if(tsr&0X01)//溢出         
                {             
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                        }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                        {                                 
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                            TIM5CH1_CAPTURE_VAL=TIM5->CCR1;        //获取当前的捕获值.
                                 TIM5->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                TIM5->CR1&=~(1<<0)                ;            //使能定时器2
                                 TIM5->CNT=0;                                        //计数器清空
                                 TIM5->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
                                TIM5->CR1|=0x01;                            //使能定时器2
                        }                    
                }                                                                                   
        }
        TIM5->SR=0;//清除中断标志位   
}



回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2016-7-20
在线时间
4 小时
发表于 2016-7-20 11:28:16 | 显示全部楼层
我也不明白啊,同问
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-7-9
在线时间
1 小时
发表于 2017-7-25 16:49:27 | 显示全部楼层
同样的疑惑。if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 这个地方视频里面说上一次捕获到高电平,问题是都没有发生第一次捕获,哪里来的上一次捕获,而且上一次捕获到高电平并不意味着就捕获到一个下降沿……
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-23 12:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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