输入捕获实验

这个实验的效果是:按住按钮,然后放开,串口会打印按住的时间.

捕获原理如图。计数器有捕获功能。没有捕获的时候,定时器也可以在工作。设置为上升沿捕获,有上升沿的时候,会触发中断进入中断函数。

先把定时器清零。然后在捕获期间,定时器会溢出,要计算溢出的次数。同时在中断函数中,已经修改为下降沿捕获了。

在下降沿捕获的时候,读取当时的计数器的值。这样再加上溢出的次数,就能算出总时间了。

中断函数的流程图如下:

函数代码如下:


#include "stm32f4xx.h"
#include "gpio_config.h"
#include "delay.h"
#include "usart.h"


// GPIO基本配置
// GPIO的AF映射
// 中断配置
// 计时器的基本配置
// 计时器的捕获配置
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
u8 TIM5CH1_CAPTURE_STA=0;
u32 TIM5CH1_CAPTURE_VAL;
int main(void)
{
long long temp=0;
/* Clock Enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); // enable TIM5 clock

/* UART1 and delay init */
delay_init();
uart_init(115200);

/* GPIO init */
GPIO_Init(GPIOA,GpioPortAMode);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0 AF to TIM5


/*nvic init */
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;//
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
NVIC_Init(&NVIC_InitStructure); //
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新和捕获中断

/* TIM5 init */
// 定时器的时钟源有4个,最常用的就是内部时钟源CK_INT。经过选择器以后的时钟,叫做CK_PSC.
//如果选择了CK_INT做时钟源,CK_INT=CK_PSC
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //即fDTS,是CK_INT与数字滤波器之间的分频比,和计数器的计数频率没关系
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period=0XFFFFFFFF; //就是计数溢出值,也是自动重载值
TIM_TimeBaseStructure.TIM_Prescaler=83; //计数器的预分频,具体的频率为CK_PSC/(TIM_Perscaler+1)
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);


/* catch init */
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CCER寄存器,是通道选择,TIM5有4个通道
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //见通用定时器框图,是TI1/2和IC1/2时间的映射关系
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //类似捕获滤波,如高电平捕获,可以设置抓到1个高电平就捕获,还是连续8个高电平才捕获
TIM5_ICInitStructure.TIM_ICFilter = 0x00;//滤波器采样频率
TIM_ICInit(TIM5, &TIM5_ICInitStructure); //
TIM_Cmd(TIM5,ENABLE ); //使能定时器5



while(1)
{


delay_nms(300);

if(TIM5CH1_CAPTURE_STA&0x80)
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp=temp*0xFFFFFFFF;
temp+=TIM5CH1_CAPTURE_VAL;
printf("HIGH:%lld us\r\n",temp);
TIM5CH1_CAPTURE_STA=0;
}

}


}

//捕获状态 TIM5CH1_CAPTURE_STA的定义
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)

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; //溢出次数太多,捕获时间太长,算一次成功捕获。
TIM5CH1_CAPTURE_VAL=0xFFFFFFFF;
}
else TIM5CH1_CAPTURE_STA++; //溢出次数没有太多,溢出次数加1
}
}

if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)  //捕获中断
{
if(TIM5CH1_CAPTURE_STA==0x40) //是否已经捕获到高电平
{
TIM5CH1_CAPTURE_STA|=0x80; //刚才已经捕获到高电平,这次又捕获,说明捕获到低电平了,就是一次成功的捕获了
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //为下一次捕获做准备
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //读取当前计数器的值
}
else  //第一次捕获,说明是高电平捕获
{TIM5CH1_CAPTURE_STA=0x0; 
TIM5CH1_CAPTURE_VAL=0x0; //计数器清零
TIM5CH1_CAPTURE_STA|=0x40;
TIM_Cmd(TIM5,ENABLE );
TIM_SetCounter(TIM5,0);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); // 配置为低电平捕获
TIM_Cmd(TIM5,ENABLE );
}

}

}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);

}




				
时间: 2024-12-28 14:18:10

输入捕获实验的相关文章

输入捕获

#include "timer.h"#include "led.h"#include "usart.h" //TIM14 PWM部分初始化 //PWM输出初始化//arr:自动重装值//psc:时钟预分频数void TIM14_PWM_Init(u32 arr,u32 psc){ //此部分需手动修改IO口设置 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_Tim

cortex_m3_stm32嵌入式学习笔记(十):输入捕捉实验(定时器的输入捕捉)

输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能. STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值( TIMx_CNT)存放到对应的通道的捕获/比较寄存器( TIMx_CCRx)里面,完成一次捕获.同时还可以配置捕获时是否触发中断/DMA 等. 本章我们用到 TIM2_CH1 来捕获高电平脉宽,也就是要先设置输入捕获为上升沿

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

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

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寄存器

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

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

STM32F0xx_TIM输入捕获(计算频率)配置详细过程

前言 关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能. STM32芯片多数为16位计数,但基本上都有1个或两个32位的定时器,可惜的是我们最常使用的F1系列芯片中没有32位的定时器,F030中也没有,具体请看数据手册. 今天主要总结关于STM32F0系列输入捕获,捕获信号频率,即所谓逻辑分析仪检测数字频率的功能. 今天使用32位的TIM2作为捕获的定时器,为什么是32位,原

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

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

STM32F103 输入捕获

最近这几周各种考试,各种课程设计,唉,我得复习复习了,所以啦,博客暂停直到6-25之后继续更新,欢迎阅读. STM32F103 输入捕获信号: /*--------------------------------------------------------------------------- * Project: Time.h * Name: zwp * Date: 2014/6 *------------------------------------------------------

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

输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将此刻定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获. 使用TIM2输入捕获的配置步骤:1.开启TIM2时钟,配置PA0为下拉输入.需要使用到PA0作为TIM2_CH1上面的脉冲输入.2.设