文章目录

  • 一、内容介绍
  • 二、逻辑梳理
    • 1、初始化
    • 2、针对其中预分频为什么是72做一个解释
      • 预分频
      • 解释
    • 3、理解两个变量:STA 、VAL
  • 三、部分代码
    • 1、变量STA 、 VAL
    • 2、输入捕获初始化,定时器5通道1输入捕获配置
    • 3、中断函数,使用定时器TIM5
    • 4、计算高电平时间
  • 四、总结

一、内容介绍

之前对一个输入捕获的实验没有理解透彻,虽然当时实验是有结果,但现在时间过去太久,所以印象很模糊,搞得我再次谈到这个竟然变得语无伦次,所以我还是决定复盘。所以今天我回顾了之前自己做过的输入捕获实验-获取一个高电平的持续时间,并进行重新梳理。此次更多是帮助自己回忆并加深理解,也算是给自己擦屁股了,真是让人感到不爽。


二、逻辑梳理

1、初始化

2、针对其中预分频为什么是72做一个解释

预分频

解释

3、理解两个变量:STA 、VAL


补充:上图中,捕获方式:0-上升沿捕获,1-下降沿捕获


三、部分代码

1、变量STA 、 VAL

u8 STA;      //输入捕获状态   单字节(8位)
u16 VAL;     //输入捕获值     双字节

2、输入捕获初始化,定时器5通道1输入捕获配置

void input_init()
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* 开启定时器5时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  //使能TIM5时钟TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1); //清除中断标识位TIM_TimeBaseInitStructure.TIM_Period = 0xffff;    //设置定时器自动重装载值  TIM_TimeBaseInitStructure.TIM_Prescaler = 71;   //以1MHz的频率计数,一次是1μs(微妙)TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数模式TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//初始化TIM5的时间基数单位TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端,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输入捕获通道1//中断分组初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;   //打开TIM5的全局中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;   //抢占优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM5,ENABLE); //使能或者失能TIM5外设TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能或者失能指定的TIM中断}

3、中断函数,使用定时器TIM5

void TIM5_IRQHandler()      //定时器5输入捕获中断函数
{if((STA&0X80)==0)      //还未成功捕获。解释:STA第八位,1-捕获成功,0-未捕获成功{if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)    //TIM_IT_Update不等于0表示进入定时器更新中断(中断更新){if(STA&0X40)   //已经捕获到高电平了{if((STA&0x3f)==0x3f)    //高电平时间太长了。解释:后六位保存溢出次数,如果等于最大溢出次数表示高电平时间过长{  STA|=0x80;         //标记成功捕获了一次。解释:时间太长,强制设置为捕获成功。VAL=0xffff;        }else{STA++;  }}} }if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)       //CC1捕获1发生捕获事件{ //0-上升沿捕获,1-下降沿捕获if(STA&0X40)      //捕获到一个下降沿。解释:STA第七位判断。  解释:因为STA默认为0,并且默认配置为上升沿捕获,所以会首先执行else{TSTA|=0X80;   //第8位置1   标记成功捕获到一次完整高电平 VAL=TIM_GetCapture1(TIM5);  //获得TIMx输入捕获1的值,x=5TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获  }else{STA=0;        //清空VAL=0;        //清空TIM_SetCounter(TIM5,0);     //计数值清0STA|=0X40;    //第7位置1   标记捕获到了上升沿。     解释:此时STA为1,下次会执行if,为下降沿捕获TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获}    }TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);      //清除中断标志位
}

4、计算高电平时间

u32 temp;if((STA&0x80))                          //成功捕获到了一次完整高电平{temp=STA&0x3f;              //溢出次数temp=temp*65536;            //溢出时间 * 溢出次数 = 溢出总时间temp=temp+VAL;              //总得的高电平持续时间printf("高电平持续时间: %d us\r\n",temp);STA=0;                      //开启下一次捕获  }delay_ms(10);                   //延迟10毫秒

四、总结

高电平的输入使用外设,比如按键就可以,在此没有对外设进行回顾。

重新梳理理清了之前一直没搞明白的问题。

1、定时器更新中断,这个中断是判断是否完成了一次完整的捕获。就拿此次捕获高电平来说,一次完整的高电平捕获是捕获一次上升沿加一次下降沿,这样才算是捕获成功。而判断内部解决的主要是未捕获成功的情况,捕获成功自然就能达到目的,所以无需处理。在未捕获的情况下,还要判断已经捕获到了高电平(只是高电平没有结束,不是一次完整的捕获),给这个高电平设置了一个最大值,也就是最长持续时间,然后强制设置为捕获成功。

2、输入捕获中断,主要是捕获上升沿和下降沿。因为程序一开始就设置了首先捕获上升沿,并且STA=0。所以第一次STA&0X40结果肯定为0(假),也就不会执行 if 下面的语句,而是执行 else 里面的语句,所以就要在 else 里设置捕获到上升沿之后的操作。

3、有了第2点的理解,我们是可以根据自己的需求去设置先检测什么沿,或者是先执行 if 还是 else

4、自己其他的一些疑惑在上面后两张图片里写清楚了。

终于把屁股擦干净了。


输入捕获-获取一个高电平的持续时间相关推荐

  1. STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)

    简介 定时器的输入捕获可以用来测量脉冲宽度与PWM的输入测量,可以通过设置检测不同的跳变边沿,来实现对高低电平的计时捕获 框图 由图可知,初始化定时器进行输入捕获有以下步骤: 开启时钟,配置定时器的G ...

  2. stm32输入捕获,捕获高电平

    输入捕获就是用定时器检测引脚上的电平时间,可以检测高电平时间和低电平时间,然后可以算引脚上信号的频率和占空比. 基本思路就是利用定时器的输入捕获功能. 定时器捕获到高电平或低电平就会进入捕获中断 例如 ...

  3. 【STM32】输入捕获程序

    00. 目录 文章目录 00. 目录 01. 概述 02. 硬件设计 03. 寄存器概述 04. 配置步骤 05. 程序示例 06. 附录 07. 声明 01. 概述 输入捕获模式可以用来测量脉冲宽度 ...

  4. cc2530定时器和捕获比较_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...

  5. 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距

    文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计   下载工程文件:   https://gitee.com/Joseph_Coop ...

  6. STM32之输入捕获

    今天来简单介绍一下STM32的输入捕获功能.输入捕获说的通俗一点就是用计数器(定时器)来记录某一个脉冲高电平的时间,或者我们只捕获脉冲的上升沿或者下降沿,这具体要根据具体事例进行分析. 它的基本工作过 ...

  7. STM32F4_定时器输入捕获详解

    目录 1. 输入捕获简介 2. 输入捕获框图 3. 输入捕获模式 4. 相关寄存器 4.1 TIMx_ARR.TIMx_PSC 4.2 捕获/比较寄存器1:TIMx_CCMR1 4.3 捕获/比较使能 ...

  8. stm32f767串口下载软件_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第十四章 输入捕获实验 ...

  9. STM32CubeMX 学习(5)输入捕获实验

    个人学习记录 文章目录 一.新建工程 二.选择芯片型号 三.配置时钟 四.配置调试模式 五.定时器(输入捕获)参数配置 六.生成 Keil 工程 七.中断函数写在哪 八.测试示例 一.新建工程 二.选 ...

最新文章

  1. 简单mysql 查询_简单的mysql查询
  2. kerberos 身份认证 简介
  3. php 安装curl init,linux下为php添加curl扩展的方法及curl_init函数用法案例详解
  4. 影响网站权重的关键性因素有哪些?
  5. python和c哪个好学-C/C++和Python哪个更有前景?
  6. Linux服务器中实现文件夹可写不可删除
  7. iOS之coreData
  8. oracle对比两列数据_oracle与mysql对同一张表 两列数据的某一字段进行值的交换
  9. 数据流图中flow不显示文字_利用Flow来进行旋转流体仿真
  10. WPF入门教程系列十三——依赖属性(三)
  11. mysql的student是什么意思_复习mysql
  12. C# 系统服务 删除后禁用 ,删除不彻底;删除后无法重装问题解决方案
  13. grads插值_GrADS第6章变量和函数讲课.ppt
  14. mysql msvcp140.dll修复_丢失msvcp140.dll怎么办
  15. 计算机专业英语教程ppt,计算机专业英语教程课件.ppt
  16. Win32:三菱FX3U/FX5U读写软元件方法和注意事项
  17. 微信第三方平台授权时域名问题
  18. 【安全】靶场实战-通过MS16-032提权
  19. Matlab龚珀兹曲线模型预测,皮尔曲线预测法
  20. 北京计算机游戏专业排名2015,2015大学专业排行榜_大学最佳专业排行榜_游戏专业怎么样_52PK游戏网...

热门文章

  1. vb调用lisp中vlx函数_CAD二次开发,lisp程序生成应用程序VLX,如何在CAD里面创建一个快捷图标,点击快捷图标就可以调用程序...
  2. NOR Flash擦写和原理分析
  3. python安装AES库及使用
  4. 程序员生存环境之乔尔测试
  5. 图扑数字孪生水利工程,助力水资源合理利用
  6. 用数据带你回顾乔丹的职业生涯
  7. java servlet文件上传_JavaServlet的文件上传和下载
  8. 化工热力学习题集及答案
  9. 8-对象、构造函数、实例化
  10. u盘数据丢失可以恢复吗?教你3种轻松把u盘数据恢复的方法