输入捕获实验是电容按键检测实验的前提所以需要先学习用TIM实现输入捕获

1、系列目录

  1. 基本计时实验
  2. 输入捕获实验(实验3的基础)
  3. 电容按键检测实验
  4. 输出PWM实验
  5. PWM驱动无刷电机实验

2 、输入捕获原理

定时器都有四个通道,我们需要将使用其中一个通道与开发板的按键相同,例如正点原子F1精英板的KEY_UP按键和TIM5_CH1为共用IO(PA0),所以我们只需要开启TIM5的捕获功能即可计时按键的高低电平变化。
所以要使用到
TIM_TimeBaseInitTypeDef和TIM_ICInitTypeDef这两个结构体,Base结构体已经在上一节解释,现在来分析IC这个结构体

3、IC结构体分析

TIM_ICInitTypeDef看名字就知道和输入有关,因为IC的I = in 输入
TIM_OCInitTypeDef当然也有OC O=out 输出,将会在PWM实验中使用到

typedef struct
{uint16_t TIM_Channel;      /*!< Specifies the TIM channel.This parameter can be a value of @ref TIM_Channel */uint16_t TIM_ICPolarity;   /*!< Specifies the active edge of the input signal.This parameter can be a value of @ref TIM_Input_Capture_Polarity */uint16_t TIM_ICSelection;  /*!< Specifies the input.This parameter can be a value of @ref TIM_Input_Capture_Selection */uint16_t TIM_ICPrescaler;  /*!< Specifies the Input Capture Prescaler.This parameter can be a value of @ref TIM_Input_Capture_Prescaler */uint16_t TIM_ICFilter;     /*!< Specifies the input capture filter.This parameter can be a number between 0x0 and 0xF */
} TIM_ICInitTypeDef;

TIM_Channel:选择使用通道几进行捕获
TIM_ICPolarity:选择高电平、低电平、高低电平触发输入捕获
TIM_ICSelection:配置CCMR1寄存器的CC1S位
(00输出,01输入IC1映射在TI1上,10输入IC1映射在TI2上,11输入IC1映射在TRC上)
TIM_ICPrescaler:输入信号分频值
TIM_ICFilter:滤波器,多少次捕获触发一次中断

4 、捕获时间计算

捕获时间t :
t = num * T
总计数次数num:
num = (TIM5CH1_CAPTURE_STA & 0x3F)* arr + TIM5CH1_CAPTURE_VAL
时钟周期T:
在 基本计时实验中的第四部分已经分析过。

5、重点代码分析

如果分析不明白可以查看我对自定义寄存器这种办法的详细讲解 用户自定义寄存器详解

6、代码示例

/*
*TIM5配置
*/
void TIM5_Config(u16 arr,u16 psc)
{GPIO_InitTypeDef            GPIO_InitStructure;    TIM_TimeBaseInitTypeDef      TIM_TimeBaseStructure;TIM_ICInitTypeDef             TIM_ICInitStructure;   NVIC_InitTypeDef             NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//PA0 配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);//提前强制拉低//TIM5基础配置    //计时器时钟 = APB总线时钟/分频因子//                           pscTIM_TimeBaseStructure.TIM_Period = arr;//重装载值/最大计数值TIM_TimeBaseStructure.TIM_Prescaler = psc;//预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//TIM5输入捕获配置TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择TIM5的CH1通道TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//将IC1映射到IT1TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//信号分频值,不分频TIM_ICInitStructure.TIM_ICFilter = 0x00;//不滤波TIM_ICInit(TIM5,&TIM_ICInitStructure);//中断优先级配置  优先级:2 0NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM5,TIM_IT_Update | TIM_IT_CC1 ,ENABLE);// TIM5计数更新中断、CCR1捕获中断使能TIM_Cmd(TIM5,ENABLE);  //使能TIM5
}
/*
*TIM5输入捕获 中断服务函数
*/
u8  TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL;    //输入捕获值
int a=0;
void TIM5_IRQHandler(void)
{if((TIM5CH1_CAPTURE_STA & 0x80) == 0)//未捕获成功{if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET) //再次检测是否有中断{  if(TIM5CH1_CAPTURE_STA & 0x40)//已经捕获到高电平{if((TIM5CH1_CAPTURE_STA & 0x3F) == 0x3F )//到达计时最大值,不能再进行计数;所有数据附上最大值{  TIM5CH1_CAPTURE_STA |= 0x80;//将捕获状态位(bit8)设为1,标记成功捕获TIM5CH1_CAPTURE_VAL = 0xFFFF;}else {TIM5CH1_CAPTURE_STA++;}}}if(TIM_GetITStatus(TIM5,TIM_IT_CC1) != RESET){if(TIM5CH1_CAPTURE_STA & 0x40)//从第一个高电平开始,捕获到第一个下降沿{TIM5CH1_CAPTURE_STA |= 0x80;//置位bit8,标记为一次捕获结束TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);   //????????????????????????}             else//第一个高电平刚到{ TIM5CH1_CAPTURE_STA = 0;TIM5CH1_CAPTURE_VAL = 0;TIM_SetCounter(TIM5,0);   //全部清空TIM5CH1_CAPTURE_STA |= 0x40;//标记捕获到上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//????????????????????????              }}}TIM_ClearITPendingBit(TIM5,TIM_IT_Update | TIM_IT_CC1);//同时清空两个中断标志}
/*
*main.c
*/
主函数中需要配置arr和psc,再根据TIM5CH1_CAPTURE_STA和TIM5CH1_CAPTURE_VAL的值计算出定时时间即可

STM32 TIM定时器的使用(2)——输入捕获相关推荐

  1. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

  2. STM32 TIM定时器的使用(1)——定时

    1.定时器简介 STM32中,定时器的应用非常广泛,涉及计时.信号检测.电机控制等等,并且定时器章节的介绍在STM32F1的手册里面也占据了大量的篇幅,足以看出定时器的重要性. 我将会做5个实验来学习 ...

  3. stm32 TIM定时器中断

    一.TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断: 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 ...

  4. STM32 TIM定时器 库函数学习笔记

    一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正. TIM_DeInit(TIM2);//注意:按缺省值复位后,时钟源为内部时钟,不必再 ...

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

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

  6. stm32捕获比较通道是干嘛的_STM32第八章-TIM输入捕获

    在第七章我们介绍了 STM32 的定时器作为 PWM 输出的使用方法,这一章,我们将向大家介绍通用定时器作为输入捕获的使用.这个输入捕获在哪个地方会用到呢?如果你玩过小车就会知道小车的编码器测速就用到 ...

  7. STM32遥控方法SONY PS2 、航模,STM32定时器PWM输入捕获航模接收机

    PS2接线: 买家会给你程序和说明: 接线: GND接STM32 GND VCC接STM32 VCC DAT接 STM32 PB12 CMD接STM32 PB13 CS接 STM32 PB14 CLK ...

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

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

  9. STM32单个定时器四通道输入捕获

    以前就纠结过能不能一个定时器进行多路的输入捕获,因为毕竟输出四路的PWM是轻松随意的,当时大概想了一下觉得可能会比较麻烦就一直没去尝试,最近组里的同学做方波测频和测占空比遇到了问题,又提到了这个,今天 ...

最新文章

  1. php 删除一周前,linux下删除7天前日志的代码(php+shell)
  2. 【Git】Git 基础命令 ( 添加暂存文件 git add | 提交文件至版本库 git commit | 查看版本库状态 git status | 查询文件修改 git diff )
  3. educational round 前缀和_总结分析634个以re为前缀的单词得出了re为前缀组合单词意思规律
  4. ubuntu14.04 python2.7 安装配置OpenCV3.0
  5. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题...
  6. 《ASP.NET 本质论》源码下载
  7. 关于CoreData的使用
  8. springboot框架学习理解下
  9. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
  10. 认知无线电与软件定义无线电的区别
  11. dbfs和dbm的换算_功率W与dBm的对照表及关系(转)
  12. SQLServer获取2020年节假日列表(可用于Java、.NET,Python,C++等实现)
  13. 一个简单的Perl脚本求单条序列的GC含量
  14. GitHub iOS开源项目
  15. HTML的DOCTYPE是什么意思
  16. 如何将页脚(footer)保持在页面底部
  17. spanning tree protocol
  18. android 仿百度地图,仿百度地图街景实现
  19. 水瓶座的女人,生活中不只需要代码(转帖)
  20. 简单的java爬虫程序

热门文章

  1. 编程之美里的挖雷游戏:
  2. 问财同花顺spider(爬虫)2接上篇没有实现的页面滚动问题
  3. java面试题总结(八)--Java面试题全集(上)
  4. 目标检测 YOLOv5 - v6.2版本模型在瑞芯微 Rockchip设备从训练到C++部署实践
  5. 录音怎么转换成文字?安利这几款软件给你
  6. a-select下拉展示中英文,选择回填中文
  7. 计算机网络:数据链路层设备 网桥与交换机
  8. 杰理之测试失真度【篇】
  9. php 写入txt换行_php 写入txt文件内容换行的方法
  10. RPA(影刀)无需写代码抓取某东的商品信息