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

输入捕获简介
输入捕获模式可以用来测量脉冲宽度或者测量频率。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 |= 1<<0;    //使能定时器时钟
    RCC->APB2ENR |= 1<<2; //使能GPIOA时钟
    GPIOA->CRL &= 0xFFFFFFF0;//GPIOA 下拉输入
    GPIOA->CRL |= 0x00000008;
    GPIOA->ODR |= 0<<0; //下拉输入

    TIM2->ARR=arr;//自动重装载值  定时器计数到该值的时候发生更新中断
    TIM2->PSC=psc;//预分频系数

    TIM2->CCMR1 |= 1<<0; //CC1通道被配置为输入,IC1映射到TI1上
    TIM2->CCMR1 |= 1<<4; //采样频率,2个事件后生效

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

    TIM2->DIER |= 1<<1; //允许捕获/比较中断
    TIM2->DIER |= 1<<0; //允许更新中断
    TIM2->CR1 |= 1<<0; //使能计数器

    MY_NVIC_Init(2,0,TIM2_IRQn,2); //中断分组
}

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

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

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

1、处理溢出情况

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

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

//中断处理
u8 TIM2_CAP_STA = 0;
u16 TIM2_CAP_VALUE = 0;
void TIM2_IRQHandler(void){
    u16 INT_IP = TIM2->SR;

    if(INT_IP&(1<<0)){//溢出
        if(TIM2_CAP_STA&0x3F){//脉宽太长
            if(TIM2_CAP_STA&0x40){//已经捕获到上升沿
                TIM2_CAP_STA |= 1<<7;//设置成功捕获
                TIM2_CAP_VALUE = TIM2->CCR1; //获取捕获的值
                TIM2->CCER &= 0<<1; //上升沿捕获
              TIM2->CCER |= 1<<0; //使能捕获
            }
            else{
                TIM2_CAP_STA = 0;
                TIM2_CAP_VALUE = 0;
            }
        }
        else
            TIM2_CAP_STA++;
    }

    if(INT_IP&(1<<1)){ //捕获
        if(TIM2_CAP_STA&0x40){//已经捕获到上升沿
            TIM2_CAP_STA |= 1<<7;//设置成功捕获
            TIM2_CAP_VALUE = TIM2->CCR1; //获取捕获的值
            TIM2->CCER &= 0<<1; //上升沿捕获
            TIM2->CCER |= 1<<0; //使能捕获
        }else{//还没捕获到上升沿
            TIM2_CAP_STA |= 1<<6; //设置捕获到上升沿
            TIM2_CAP_VALUE = 0;
            TIM2->CCER |= 1<<1; //下降沿捕获
            TIM2->CNT = 0; //计数器清零
        }
    }
    TIM2->SR=0;//清除定时器状态(中断标志)
}

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

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

      TIM2->CCER &= 0<<1; //上升沿捕获
      TIM2->CCER |= 1<<0; //使能捕获
时间: 2024-10-29 10:47:38

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

STM32学习笔记11(通用定时器作为输入捕获2)

通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的

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

测量脉冲宽度或者测量频率 ? 基本方法 1.设置TIM2?CH1为输入捕获功能:? 2.设置上升沿捕获:? 3.使能TIM2?CH1捕获功能:? 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: ?5.捕获到下降沿后,存入capture_buf[1],改为捕获上升沿:? 6.捕获到上升沿后,存入capture_buf[2],关闭TIM2?CH1捕获功能:? 7.计算:capture_buf[2]?-?capture_buf[0]就是周期,capture_buf[1]?-?c

STM32之输入捕获以及小小应用(库)

五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在这里.智商和情商比我高的人估计又知道我要说什么了..没错了..今天我们来了解"葵花宝典"第STM32篇之输入捕获,也就是上文所讲的"吸星大法", 那输入捕获可以用来干嘛呢??这个问题问的好,输入捕获可以用来测量脉冲宽度或者测量频率,假如要捕获一个脉冲的高电平脉宽,我们要

stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

STM32学习笔记3(TIM输入捕获)

PWM 输入捕获模式< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 一.概念理解 PWM输入捕获模式时输入捕获模式的特例 1.每个定时器有四个输入通道IC1.IC2.IC3.IC4,且IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系 2.两个TI输出映射了两个ICx信号 3.这两个ICx信号分别在相反的极性边沿有效 4.两个边沿

STM32F4——定时器原理及应用(中断、输入捕获、PWM输出)

一.简介: 不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器.通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器的原理和应用.对于通用定时器根据位数和计数方式的不同又可以分为3类,相关分类的图表如下: 二.应用: 1.更新:计数器的上溢或下溢.2.事件触发.3.输入捕获.4.输出比较.5.支持针对定位的增量编码和霍尔传感器电路.5.触发输入作为外部时钟或按周期电源管理.下边会针

STM32 输入捕获配置

在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器 的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面, 完成一次捕获.同时还可以配置捕获时是否触发中断/DMA 等. 1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

STM32——输入捕获实验原理及配置步骤

输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获.同时还可以配置捕获时是否触发中断/DMA 等. 二.输入捕获流程: 例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤: 1.配置TIMx_CCMR1寄存器CC2S='01',配置通

stm32cube--通用定时器--输入捕获

用定时器输入捕获做红外线接收实验.(此次试验以通道2为例) ①stm32cube配置 ② ③ ④程序中主要用到的输入捕获相关寄存器 uint16_t tim_sr,tim_ccer,tim_ccr; tim_sr=htim->Instance->SR;//状态寄存器 tim_ccer=htim->Instance->CCER;//捕获.比较使能寄存器 tim_ccr=htim->Instance->CCR2;//捕获比较寄存器2(即用来保存通道2发生中断时的CNT寄存器