输入捕获实验库函数版本学习笔记

这里我只介绍一下timer.c中的一个函数,其他的几个函数都是初始化函数,这个大家都很清楚,也没什么好讲的。接下来就看看我接下来要讲的函数:

u8  TIM2CH1_CAPTURE_STA=0; //输入捕获状态                                                    

u16  TIM2CH1_CAPTURE_VAL;      //输入捕获值

 

//定时器2中断服务程序     

void
TIM2_IRQHandler(void)

{

 

        if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获   

         {         

                  if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)//检查指定的TIM中断发生与否:TIM 中断源 

                   

                  {           

                          if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了

                          {

                                   if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

                                   {

                                            TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次

                                            TIM2CH1_CAPTURE_VAL=0XFFFF;

                                   }
                                   else
                                   {
                                             TIM2CH1_CAPTURE_STA++;
                                   }
                          }        

                  }

                  if (TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET)//捕获1发生捕获事件

                  {       

                          if(TIM2CH1_CAPTURE_STA&0X40)                 //捕获到一个下降沿           

                          {                               

                                   TIM2CH1_CAPTURE_STA|=0X80;          //标记成功捕获到一次上升沿

                                    TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);//记下捕获的值

                                TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);//CC1P=0 设置为上升沿捕获

                          }else                                                                    //还未开始,第一次捕获上升沿

                          {

                                   TIM2CH1_CAPTURE_STA=0;                   //清空

                                   TIM2CH1_CAPTURE_VAL=0;

                                  TIM_SetCounter(TIM2,0);

                                   TIM2CH1_CAPTURE_STA|=0X40;          //标记捕获到了上升沿

                                TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);               //CC1P=1 设置为下降沿捕获

                          }                    

                  }                                                                                       

        }

 

    TIM_ClearITPendingBit(TIM2,
        
    TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

 

 

}

开头定义的两个全局变量:TIM2CH1_CAPTURE_STA的作用在接下来我们会讲到,而TIM2CH1_CAPTURE_VAL则是我们在主函数中计算时间所需要用到的数。

TIM2CH1_CAPTURE_STA是一个八位二进制数,各个位的作用如下:


1.png

现在让我们来好好看看这个中断函数。

第一个if判断判断的是TIM2CH1_CAPTURE_STA的最高位是不是0,如果为0表示还没有完全捕获到一个完整的高电平(有一个上升沿和一个下降沿),在刚开始这个判断肯定为真,现在让我们进入这个函数,紧接着的这个判断if (TIM_GetITStatus(TIM2,
TIM_IT_Update) != RESET)判断的是TIM2是否发生了中断,再下面的一层判断if(TIM2CH1_CAPTURE_STA&0X40)则是判断TIM2CH1_CAPTURE_STA的第二高位是否为1,如果为1,则表示已经接收到了一个上升沿。再往里if判断的我将会在最后的一个流程内解释清楚。

if (TIM_GetITStatus(TIM2,
TIM_IT_CC1) != RESET)这个if判断判断的则是是否捕获到你定义的捕获(这里就是上升沿捕获或者下降沿捕获),前面的初始化函数里已经初始化为上升沿捕获,所以第一次这是是判断是否捕获到上升沿。如果捕获到了,进入第二层判断,判断TIM2CH1_CAPTURE_STA的次高位是否为1,不是1则执行else内的内容。

讲了这么多,我想你们可能还没有完全理解,接下来我就以一个高电平的例子来讲一下这个中断函数。

2.png

开始了,进行第一层判断if((TIM2CH1_CAPTURE_STA&0X80)==0),这时TIM2CH1_CAPTURE_STA=00000000,为真,进入判断if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET) ,这个判断在TIM2发生中断的时候自动进入,关键在if(TIM2CH1_CAPTURE_STA&0X40)这个判断,前面我们说了TIM2CH1_CAPTURE_STA=00000000,没有执行这个判断内部代码的权利,只有次高位为1即TIM2CH1_CAPTURE_STA=x1xxxxxx时,才有权利进去。所以,我们把他先放在一边。

接下来我们看这个判断if (TIM_GetITStatus(TIM2, TIM_IT_CC1)!= RESET),前面我们也说了,这个是判断是否捕获到上升沿的。好的,这个判断就是我们的开始,当我们捕获到一个上升沿的时候,进入,if(TIM2CH1_CAPTURE_STA&0X40)为假,执行else,

else

{

                  TIM2CH1_CAPTURE_STA=0;          

                          TIM2CH1_CAPTURE_VAL=0;

                         TIM_SetCounter(TIM2,0);

                  TIM2CH1_CAPTURE_STA|=0X40;  

               TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);                                         

}

这里让TIM2CH1_CAPTURE_STA的次高位为1了,而且改成了捕获下降沿!!!!!

然后在接下执行中断函数的时候 ,我们就有进入这个if(TIM2CH1_CAPTURE_STA&0X40)判断的权利,因为现在TIM2CH1_CAPTURE_STA=01xxxxxx,现在我们看这个判断内的代码:

if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)

{

         TIM2CH1_CAPTURE_STA|=0X80;

         TIM2CH1_CAPTURE_VAL=0XFFFF;

}

else

{

         TIM2CH1_CAPTURE_STA++;

}

if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)这个判断的是TIM2CH1_CAPTURE_STA后六位是否都为1,如果都为1表示这个高电平的时间很长很长,这时强制将TIM2CH1_CAPTURE_STA的最高位置1,令TIM2CH1_CAPTURE_VAL=0XFFFF,完成一个高电平的接收。如果后六位不都为1,TIM2CH1_CAPTURE_STA++,表示溢出次数加1.。如此反复,直至到下降沿的到来。

当下降沿到来的时候if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)为真(因为前面已经将捕获事件改为捕获下降沿!!!这里不再是捕获上升沿),第二层判断if(TIM2CH1_CAPTURE_STA&0X40)也为真

if(TIM2CH1_CAPTURE_STA&0X40)                 

{                               

         TIM2CH1_CAPTURE_STA|=0X80;  

         TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);

TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);

}

将TIM2CH1_CAPTURE_STA最高位置1,读取最后一次中断计数器内的数,再改为捕获上升沿,为下一次读取高电平做准备。

到这里,一个高电平就读取完了,数据将在主函数中处理。

总而言之,当TIM2CH1_CAPTURE_STA最高位置1时,一个高电平就读取完了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 要管理从相机或麦克风等设备进行捕获,您将组合对象以表示输入和输出,并使用一个实例AVCaptureSession来...
    张芳涛阅读 1,559评论 0 6
  • 有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎...
    杨奉武阅读 3,145评论 0 1
  • 前端 前后端分离 这不是一篇纯技术文章,而是一篇分享我个人在前后端分离路上收获的点点滴滴的文章,以此来为准备尝试前...
    寒剑飘零阅读 1,889评论 0 22
  • 18年高考 现在才醒悟 凭一个月绘画的基础 妄想半年圆梦 不过我知道这个世界上没有不可能的事 我会义无反顾 就算会...
    鹿笙林阅读 272评论 0 1
  • 黑水白雪半壁红, 秋风秋雨正秋浓。 蜉蝣倥偬霜冷月, 半梦浮生达古钟。 黑水白雪半壑红, 秋风秋月正霜浓。 蜉蝣倥...
    Ewalnut阅读 235评论 0 0