STM32定时器5的输入捕获实验

此处使用的普中开发板,实验内容定时器5输入捕获通道1的高电平时长。

软件实现方法:

定时器5主要使用了两个功能:

①时基单元;②输入捕获;

从下文可知,通过定时器5捕获到相应的极性(eg:上升沿或高电平and so on)后,保存计数器的当前值到捕获/比较寄存器(TIMx_CCRx)中。而后,通过第二次捕获成功后,通过差值就可以求出该极性的周期或保持时间。此实验室捕获高电平的时间,通过先捕获上升沿再捕获下降沿,即可求出一个高电平的时长。


数据手册描述如下:

在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存
器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果开放
了中断或者DMA操作,则将产生中断或者DMA请求。如果发生捕获事件时CCxIF标志已经为
高,那么重复捕获标志CCxOF(TIMx_SR寄存器)被置1。写CCxIF=0可清除CCxIF,或读取存储
在TIMx_CCRx寄存器中的捕获数据也可清除CCxIF。写CCxOF=0可清除CCxOF。 
以下例子说明如何在TI1输入的上升沿时捕获计数器的值到TIMx_CCR1寄存器中,步骤如下: 
选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的
CC1S=01,只要CC1S不为’00’,通道被配置为输入,并且TIMx_CCR1寄存器变为只读。 
●  根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是
TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,
我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以fDTS频率)连续采样8次,以确
认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。 
选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。 
● 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预
分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。 
● 设置TIMx_CCER寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中(使能输入捕获)。 
● 如果需要,通过设置TIMx_DIER寄存器中的CC1IE位允许相关中断请求,通过设置
TIMx_DIER寄存器中的CC1DE位允许DMA请求。 
当发生一个输入捕获时: 
● 产生有效的电平转换时,计数器的值被传送到TIMx_CCR1寄存器。 
●  CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而CC1IF未曾被清除,
CC1OF也被置1。 



● 如设置了CC1IE位,则会产生一个中断。 
● 如设置了CC1DE位,则还会产生一个DMA请求。 
为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢

出标志之后和读取数据之前可能产生的捕获溢出信息。


使用库函数可以简化许多步骤,毕竟是别人包装好的函数来着。

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
	TIM_ICInitTypeDef TIM5_ICInitStructure;

	NVIC_InitTypeDef NVIC_InitStructure;

	/* 开启定时器5时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);	 //使能TIM5时钟

	TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1); //清除中断和捕获标志位

	TIM_TimeBaseInitStructure.TIM_Period = 0xffff;	 //设定计数器自动重装值 	
	TIM_TimeBaseInitStructure.TIM_Prescaler = 71;   //以1Mhz的频率计数 一次即是1us
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	  //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	 //TIM向上计数模式
	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1映射到TI1上 
	TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 
	TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 
	TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
	TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波 
	TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化TIM5输入捕获通道1	
	
	//中断分组初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;	//打开TIM5的全局中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;	//抢占优先级为0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	  //使能
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM5,ENABLE); //使能或者失能TIMx外设
	TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE );	//使能或者失能指定的TIM中断

中断处理函数

void TIM5_IRQHandler()	  //定时器5输入捕获中断函数
{
	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=0xffff;		
				}
				else
				{
					TIM5CH1_CAPTURE_STA++;	
				}
			}
		}	
	}
	if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获1发生捕获事件
	{
		if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
		{
			TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿 
			TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //获得TIMx输入捕获1的值
			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_CC1|TIM_IT_Update); //清除中断标志位
}

库函数的处理方式,是将手册上说到条件逐一封装到TIM_ICInitTypeDef 结构体中,再通过TIM_ICInit()函数将相应的值填写到寄存器中即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值