1、通用定时器输入捕获功能简介

  通用定时器的输入捕获模式可以用来测量脉冲宽度或者测量频率。

  STM32的每个通用定时器都有4个输入捕获的通道,分别是TIMx_CH1、TIMx_CH2、TIMx_CH3、TIMx_CH4。

  STM32通过检测通道上的边沿信号,在边沿信号发生变化时(上升沿或下降沿变化),将当前定时器计数器的值(寄存器TIMx_CNT的值)存放到对应通道的捕获/比较寄存器TIMx_CCRx里面,通过记录两次边沿信号的时间,来计算脉冲宽度或频率。

2、通用定时器输入捕获详解  

  通用定时器框图如下:

  图中红色框部分就是通用定时器的输入捕获功能。

  TIMx_CH1、TIMx_CH2、TIMx_CH3、TIMx_CH4分别对应通用定时器的4个输入捕获通道。

  从通用定时器框图可以看到每路输入捕获通道的结构都是差不多的。

  以CH1为例,通用定时器通过TIMx_CH1脚位产生信号TI1,TI1经过滤波器后,将信号传输给边沿检测器,边沿检测器检测到准确的边沿信号之后,产生TI1FP1和TI1FP2信号(这两个信号其实是一样的,只是输出的路径不一样),TI1FP1信号提供给IC1,IC1经过预分频器之后,产生捕获信号,这时候定时器计数器的当前值被锁存到捕获/比较寄存器中,而且TIMx_SR状态寄存器的CC1IF标志位被置1,如果使能了通道1输入捕获的中断功能,就会产生中断。

  在红色的框图中,TI1的输入可以选择TIMx_CH1、TIMx_CH2、TIMx_CH3这3个通道的异或,这个功能好像是高级定时器的霍尔传感器功能,这里不用管,用作输入捕获功能的时候T1就默认选择TIMx_CH1输入就好。

  输入滤波器:

  输入捕获通道通过设置TIMx_CCMRx捕获/比较模式寄存器的ICxF[3:0]位来配置滤波器。

  这里需要注意的是,输入捕获有4个通道,而捕获/比较模式寄存器只有两个,分别是TIMx_CCMR1和TIMx_CCMR2,通道1由TIMx_CCMR1的低8位配置;通道2由TIMx_CCMR1的高8位配置;通道3由TIMx_CCMR2的低8位配置;通道4由TIMx_CCMR2的高8位配置。

  还要注意的是,捕获/比较模式寄存器在不同状态下时,配置的功能是不一样,如果通道被配置成输出,那么捕获/比较模式寄存器是用来配置输出功能;如果通道被配置成输入,则捕获/比较模式寄存器是用来配置输入功能。捕获/比较模式寄存器TIMx_CCMRx的CCxS[1:0]位用来配置通道是输出还是输入。当CCxS[1:0] = 00时,通道被配置为输出。当CCxS[1:0] != 0时,通道被配置为输入。  

  下图是通道1的IC1F[3:0]位的寄存器说明图:

  图中的FCK_INT是定时器的输入频率,一般是MCU的主频(要看具体的设置)。而FDTS是根据TIMx_CR1控制寄存器的bit9~bit8位CKD[1:0]的值来确定:

  当CKD = 00时,FDTS = FCK_INT。

  当CKD = 00时,FDTS = 2*FCK_INT。

  当CKD = 00时,FDTS = 4*FCK_INT。

  图中的N是指滤波长度,假设IC1F[3:0] = 0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以FCK_INT的频率,连续采样8次通道1的电平,如果都是高电平,则说明这是一个有效的触发信号。

  滤波器可以滤除哪些脉宽低于一定时间的脉冲信号,从而达到滤波的效果,当然也可以选择不滤波。

  边沿检测器:

  边沿检测器可以检测信号是上升沿还是下降沿,只有跟设定的边沿对得上的信号才能触发输入捕获功能。

  边沿检测器可以设定为上升沿触发或是下降沿触发,这是通过捕获/比较使能寄存器TIMx_CCER的CCxP位来选择的。

  同样CCxP的位在通道位输入和输出是具有不同的配置功能。当通道设为输入时,CCxP用来设置边沿检测器。

  当CCxP = 0是,输入捕获是在上升沿的时候触发。

  当CCxP = 1时,输入捕获是在下降沿的时候触发。

  TIxFPx信号:

  从通用定时器框图中可以看到,信号在经过输入滤波器和边沿检测器之后,每个通道都会产生2个信号:

  通道1:TI1FP1和TI1FP2。

  通道2:TI2FP1和TI2FP2

  通道3:TI3FP1和TI3FP2

  通道4:TI4FP1和TI4FP2

  其实TIxFP1和TIxFP2的信号是同一个,但是他们输出的方向不一样,所以用不同的名称来区分,从图中可以看出:

  TI1FP1作为输入源提供给IC1,而TI1FP2作为输入源提供给IC2。

  TI2FP1作为输入源提供给IC2,而TI2FP2作为输入源提供给IC1。

  TI3FP1作为输入源提供给IC3,而TI3FP2作为输入源提供给IC4。

  TI4FP1作为输入源提供给IC4,而TI4FP2作为输入源提供给IC3。

  也就是说TIMx_CH1和TIMx_CH2的输入信号是可以交互到IC1和IC2的;TIMx_CH3和TIMx_CH4的输入信号也可以交互到IC3和IC4。

  具体ICx的输入源的选择是通过捕获/比较寄存器TIMx_CCMRx的CCxS[1:0]位决定的,比如IC1的输入源的选择:

  当CC1S[1:0] = 00时,通道1被配置为输出。

  当CC1S[1:0] = 01时,通道1被配置为输入,IC1的输入源选择TI1FP1。

  当CC1S[1:0] = 10时,通道1被配置为输入,IC1的输入源选择TI2FP2。

  当CC1S[1:0] = 11时,通道1被配置为输入,IC1的输入源选择TRC。

  其它通道的配置也是类似的,可以参照着查看参考手册。

  预分频器:

  输入捕获的预分频器是通过TIMx_CCMRx的ICxPSC[1:0]位配置的。

  当ICxPSC[1:0] = 00时,无预分频,捕获输入口上检测到的灭一个边沿都触发一次捕获。

  当ICxPSC[1:0] = 01时,捕获输入口上检测到2个边沿才触发一次捕获。

  当ICxPSC[1:0] = 10时,捕获输入口上检测到4个边沿才触发一次捕获。

  当ICxPSC[1:0] = 11时,捕获输入口上检测到8个边沿才触发一次捕获。

  捕获输入中断:

   当输入捕获成功之后,计数器的值(TIMx_CNT)被传送到TIMx_CCRx寄存器,并且状态寄存器TIMx_SR的相应通道位CCxIF标志被置位,如果相应的中断使能控制位被置位,则会产生中断。

  当CCxIF标志位被置位时,如果不清楚CCxIF标志位,则再次捕获成功之后,会将状态寄存器TIMx_SR的相应通道位CCxOF置位,指示通道重复捕获。

3、通用定时器输入捕获的配置流程 

  首先需要先打开定时器和通道IO口的时钟。将通道IO口配置成复用输入,具体是配置成上拉输入或下拉输入还是悬空,根据具体需求来设定。

  设置定时器的计数频率,当产生捕获时,用来计时,需要注意定时器溢出的问题,当定时器溢出之后,会清除定时器计数器的值(向上计数)或重新赋值初值(向下计数),在计算捕获时间的时候,如果有溢出,需要加上溢出的时间。

  通过捕获/比较模式寄存器TIMx_CCMRx配置通道为输入模式,配置映射关系(即选择ICx的输入源),配置滤波器,配置输入捕获的预分频器。

  通过捕获/比较使能寄存器TIMx_CCER来选择输入捕获的边沿信号,是上升沿触发还是下降沿触发。在使用输入捕获功能之前,必须先使能,而输入捕获的使能是通过置位捕获/比较使能寄存器TIMx_CCER的相应位来实现的。

  通过DMA/中断使能寄存器TIMx_DIER使能相应的中断。

  最后通过控制寄存器TIMX_CR1使能定时器,让定时器开始计数。

4、HAL库操作通用定时器的输入捕获功能

  以配置TIM3的通道1为例,TIM3的通道1对应的脚位是PA6,初始化代码如下:

 TIM_HandleTypeDef TIM3_Handler_Init;
TIM_IC_InitTypeDef CAPTURE_Handler_Init; void CAPTURE_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); TIM3_Handler_Init.Instance = TIM3;
TIM3_Handler_Init.Init.Prescaler = -; //分频为1MHZ
TIM3_Handler_Init.Init.Period = ; //定时50ms
TIM3_Handler_Init.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&TIM3_Handler_Init); CAPTURE_Handler_Init.ICPolarity = TIM_ICPOLARITY_RISING;
CAPTURE_Handler_Init.ICPrescaler = TIM_ICPSC_DIV1;
CAPTURE_Handler_Init.ICSelection = TIM_ICSELECTION_DIRECTTI;
CAPTURE_Handler_Init.ICFilter = ;
HAL_TIM_IC_ConfigChannel(&TIM3_Handler_Init,&CAPTURE_Handler_Init,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&TIM3_Handler_Init,TIM_CHANNEL_1); HAL_TIM_IC_Start(&TIM3_Handler_Init,TIM_CHANNEL_1); HAL_NVIC_SetPriority(TIM3_IRQn,,);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}

  第1、2行是定义TIM3和输入捕获的句柄变量。

  第6到第15行是打开TIM3和IO口的时钟,并且配置IO口的状态。

  第17到第21行是配置TIM3的计数时钟(多少时间计数器计数一次)、计数周期(多久溢出)和计数方式(向上或向下或中央对齐模式)。

  第23行是选择边沿触发信号,这里选上升沿触发。

  第24行是选择输入捕获分频器的系数,这里选择1分频,也就是不分频。

  第25行是选择通道的映射,即选择ICx的输入源,这里选择TI1作为IC1的输入源。

  第26行是选择输入捕获的滤波器,这里选择不滤波。

  第27行是通过HAL_TIM_IC_ConfigChannel()函数初始化相应的输入捕获通道。

  第29行是通过HAL_TIM_IC_Start_IT()函数使能输入捕获的中断功能,如果不使能则无法进入中断。

  第31行是通过HAL_TIM_IC_Start()函数使能输入捕获功能,这样输入捕获的功能才会被打开,这个函数还是能了通用定时器,让通用定时器开始工作。

  

  

  

  

STM32F103ZET6通用定时器的输入捕获的更多相关文章

  1. STM32(9)——通用定时器作为输入捕捉

    通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获 ...

  2. STM32F103ZET6通用定时器

    1.通用定时器简介 通用定时器是由一个可编程预分频器驱动的16位自动装载计数器构成.通用定时器可以应用于多种场合,如测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM).使用通用定时 ...

  3. STM32使用定时器实现输入捕获

    输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信 ...

  4. STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

    测量脉冲宽度或者测量频率   基本方法 1.设置TIM2 CH1为输入捕获功能:  2.设置上升沿捕获:  3.使能TIM2 CH1捕获功能:  4.捕获到上升沿后,存入capture_buf[0], ...

  5. STM32 HAL库学习系列---定时器TIM 输入捕获功能

    基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...

  6. stm32 输入捕获

    根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平脉宽 计算公式 N * ARR + CCRx2 首先设置定时器通道为上升沿捕获,这样在t1时刻,就会捕获到当前的CNT值,然后立即清 ...

  7. (stm32f103学习总结)—输入捕获模式

    一.输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种.STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕获功能.输入捕获可以对输入 ...

  8. [置顶] STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

  9. STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

随机推荐

  1. CyclicBarrier源码探究 (JDK 1.8)

    CyclicBarrier也叫回环栅栏,能够实现让一组线程运行到栅栏处并阻塞,等到所有线程都到达栅栏时再一起执行的功能."回环"意味着CyclicBarrier可以多次重复使用,相 ...

  2. JetBrains 第二轮:再为免费全家桶续命三个月

    昨天分享了如何通过参与JetBrains的解密任务来获取正版全家桶的兑换码.今天 JetBrains 一早继续在Twitter推出第二波任务: 下面,我们就继续来一起参与一下,为我们的正版JetBra ...

  3. 曹工杂谈:花了两天时间,写了一个netty实现的http客户端,支持同步转异步和连接池(1)--核心逻辑讲解

    背景 先说下写这个的目的,其实是好奇,dubbo是怎么实现同步转异步的,然后了解到,其依赖了请求中携带的请求id来完成这个连接复用:然后我又发现,redisson这个redis客户端,底层也是用的ne ...

  4. javaScript 基础知识汇总 (十)

    1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...

  5. Core + Vue 后台管理基础框架8——Swagger文档

    1.前言 作为前后端分离的项目,或者说但凡涉及到对外服务的后端,一个自描述,跟代码实时同步的文档是极其重要的.说到这儿,想起了几年前在XX速运,每天写完代码,还要给APP团队更新文档的惨痛经历.给人家 ...

  6. Natas1 Writeup(查看页面源码)

    Natas2: 提示密码就在本页,但右键被禁用,可以使用F12或者抓包查看元素得到flag. flag:ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi 常用的查看源码方法:右键查看. ...

  7. golang超级mapper包 - coven

    coven介绍 你可以把它理解成.NET 的 AutoMapper,java的modelmapper 一个快速的转换器去,支持结构到结构,切片到切片和映射到映射非反射转换,类型与嵌套指针支持. 不支持 ...

  8. (转载)Why you shouldn't use Entity Framework with Transactions

    Why you shouldn't use Entity Framework with Transactions EntityFramework This is a .net ORM Mapper F ...

  9. Python实现一个ORM模型类

    ORM是三个单词首字母组合而成,包含了Object(对象-类),Relations(关系),Mapping(映射).解释过字面意思,但ORM的概念仍然模糊.私以为要理解一个事物,最好的法子是搞明白它出 ...

  10. matplotlib.pyplot.text

    matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=<deprecated parameter>, **kwargs)[sour ...