打印

正点原子stm32输入捕获代码问题

[复制链接]
5137|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a2582006460|  楼主 | 2013-7-31 08:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我看正点原子输入捕获的代码是看见定义了2个变量来确定捕获成果与否

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值




//定时器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=0XFFFF;
                                }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->CNT=0;                                        //计数器清空
                                 TIM5->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }
        TIM5->SR=0;//清除中断标志位             
}
这是计时器中断的函数
沙发
acgean| | 2013-7-31 18:57 | 只看该作者
不知道楼主的问题是什么, 这段程序好用吗?

很多板子的例程直接用, 可能未必好用, 最后先看明白人家的程序是怎么回事后再用

使用特权

评论回复
板凳
a2582006460|  楼主 | 2013-8-1 07:20 | 只看该作者
acgean 发表于 2013-7-31 18:57
不知道楼主的问题是什么, 这段程序好用吗?

很多板子的例程直接用, 可能未必好用, 最后先看明白人家的程序 ...

我就是不知道这两个值怎么在捕获的时候改变的,不然怎么判断捕获成功了呢?
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值

使用特权

评论回复
地板
林中木| | 2015-9-10 17:22 | 只看该作者
我现在在学习原子的视频,可惜你的帖子时间很早。
个人理解:
        程序一开始会在捕获到上升沿的时候进入下面的程序。
=========================================================
                    else                   //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                  //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                TIM5CH1_CAPTURE_STA|=0X40;            //标记捕获到了上升沿
                                 TIM5->CNT=0;                                    //计数器清空
                                 TIM5->CCER|=1<<1;                            //CC1P=1 设置为下降沿捕获
                        }
============================================
经过上面的程序后,会把变量 TIM5CH1_CAPTURE_STA赋值为0X40,如果发生了事件更新Update,就会把TIM5CH1_CAPTURE_VAL赋值,当TIM5CH1_CAPTURE_STA=0X40时,程序的将按照if语句里的对应条件执行下去,你再理解一下吧。

使用特权

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

本版积分规则

28

主题

150

帖子

0

粉丝