输入捕获简介
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。

STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将此刻定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

使用TIM2输入捕获的配置步骤:
1、开启TIM2时钟,配置PA0为下拉输入。
需要使用到PA0作为TIM2_CH1上面的脉冲输入。
2、设置TIM2的ARR和PSC ,预分频系数与预装载值
3、设置TIM2的CCMR1
CCMR1寄存器控制着输入捕获1和2的模式,包括映射关系,滤波和分频等。、
4、设置TIM2的CCER,开启输入捕获,并设置为上升沿捕获。
CCER是定时器的开关,并且可以设置输入捕获的边沿。
5、设置TIM2的DIER,使能捕获和更新中断,并编写中断服务函数。
因为我们要捕获的是高电平信号的脉宽。所以,第一次捕获是上升沿,第二次捕获是下降沿。所以必须在捕获上升沿之后,设置捕获边沿就下降沿。同时如果脉宽比较长,那么定时器就会溢出,必须对溢出做处理。这两件事我们都是在中断中实现的,所以这里必须开启捕获中断和更新中断。
6、设置TIM2的CR1,使能定时器

代码如下:

//TIM2_Cap初始化
//arr 自动重装载值
//psc 预分频系数
void TIM2_Cap_Init(u16 arr,u16 psc){ RCC->APB1ENR |= <<; //使能定时器时钟
RCC->APB2ENR |= <<; //使能GPIOA时钟
GPIOA->CRL &= 0xFFFFFFF0;//GPIOA 下拉输入
GPIOA->CRL |= 0x00000008;
GPIOA->ODR |= <<; //下拉输入 TIM2->ARR=arr;//自动重装载值 定时器计数到该值的时候发生更新中断
TIM2->PSC=psc;//预分频系数 TIM2->CCMR1 |= <<; //CC1通道被配置为输入,IC1映射到TI1上
TIM2->CCMR1 |= <<; //采样频率,2个事件后生效 TIM2->CCER |= <<; //捕获使能
TIM2->CCER |= <<; //上升沿捕获 TIM2->DIER |= <<; //允许捕获/比较中断
TIM2->DIER |= <<; //允许更新中断
TIM2->CR1 |= <<; //使能计数器 MY_NVIC_Init(,,TIM2_IRQn,); //中断分组
}

如果需要完成一次高电平脉宽的捕获,在完成上升沿捕获之后就需要重新设置捕获的方向,设置成下降沿捕获,当成功完成一次上升沿-下降沿捕获,就可以通过定时器的计数器的值计算出此次捕获的高电平的脉宽。

同时在完成上升沿捕获后,会出现计数器溢出的情况,我们还需要在中断中处理计数器溢出的情况。

所以在定时器中断中我们需要做两件事

1、处理溢出情况

2、上升沿 下降沿之间的转换

有很多种方式,下面是我的处理方式:

//中断处理
u8 TIM2_CAP_STA = ;
u16 TIM2_CAP_VALUE = ;
void TIM2_IRQHandler(void){
u16 INT_IP = TIM2->SR; if(INT_IP&(<<)){//溢出
if(TIM2_CAP_STA&0x3F){//脉宽太长
if(TIM2_CAP_STA&0x40){//已经捕获到上升沿
TIM2_CAP_STA |= <<;//设置成功捕获
TIM2_CAP_VALUE = TIM2->CCR1; //获取捕获的值
TIM2->CCER &= <<; //上升沿捕获
TIM2->CCER |= <<; //使能捕获
}
else{
TIM2_CAP_STA = ;
TIM2_CAP_VALUE = ;
}
}
else
TIM2_CAP_STA++;
} if(INT_IP&(<<)){ //捕获
if(TIM2_CAP_STA&0x40){//已经捕获到上升沿
TIM2_CAP_STA |= <<;//设置成功捕获
TIM2_CAP_VALUE = TIM2->CCR1; //获取捕获的值
TIM2->CCER &= <<; //上升沿捕获
TIM2->CCER |= <<; //使能捕获
}else{//还没捕获到上升沿
TIM2_CAP_STA |= <<; //设置捕获到上升沿
TIM2_CAP_VALUE = ;
TIM2->CCER |= <<; //下降沿捕获
TIM2->CNT = ; //计数器清零
}
}
TIM2->SR=;//清除定时器状态(中断标志)
}

在中断处理的过程中需要注意两件事:
1、更新中断和捕获中断的处理顺序

2、重新设置为上升沿捕获的书写方式

      TIM2->CCER &= <<; //上升沿捕获
TIM2->CCER |= <<; //使能捕获

STM32使用定时器实现输入捕获的更多相关文章

  1. STM32F103ZET6通用定时器的输入捕获

    1.通用定时器输入捕获功能简介 通用定时器的输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32的每个通用定时器都有4个输入捕获的通道,分别是TIMx_CH1.TIMx_CH2.TIMx_CH3 ...

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

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

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

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

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

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

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

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

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

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

  7. stm32 输入捕获

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

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

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

  9. STM32之定时器输入捕获

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

随机推荐

  1. libuv移植到android

    编译环境是linux + ndk,你要先添加好NDK路径的环境变量,然后进入libuv目录执行以下两句完成编译. $ source ./android-configure $NDK gyp $ mak ...

  2. 几何+思维 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest K. Revenge of the Dragon

    题目链接:http://codeforces.com/gym/101149/problem/K 题目大意: 给你两个点a,b.一个人在a点,一个人在b点,b点的人要追杀a的点,他的跑步速度是a的两倍. ...

  3. 莫队+分块 BZOJ 3809

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1634  Solved: 482[Submit][Status][Di ...

  4. 分块基础练习 UESTC 1324

    http://acm.uestc.edu.cn/#/problem/show/1324 思路:基础分块,这个是一个特别简单的分块,就当做是一个练习了.然后这题也是很简单的单点线段树更新. //看看会不 ...

  5. HDU 5700 优先队列(或者multiset) 或 线段树

    题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即 ...

  6. ② 设计模式的艺术-08.桥接(Bridge)模式

    为什么需要桥接(Bridge)模式 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题? 采用多层继承结构: 多层继承结构代码示例 Computer.java package co ...

  7. Redis实战(六)管道

    https://www.cnblogs.com/huangxincheng/p/6212406.html

  8. LintCode 532: Reverse Pairs

    LintCode 35: Reverse Linked List 题目描述 翻转一个链表. 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1 ...

  9. Linux命令之uptime

    这是什么 uptime用来查看系统已经启动了多长时间了. 它显示的信息和w命令的头(第一行)是一样一样的. 举个栗子 举一个实际的应用场景: 比如发现服务器上的某些没有加入开机启动的服务挂了一片,这个 ...

  10. zepto.js 实现原理解析

    zepto 是移动端常用的 dom 库,代码轻巧,操作方式类同 jquery.那么 zepto 的核心实现原理是什么呢?