# STM32定时器延时输入捕获学习

STM32定时器延时输入捕获学习

输入捕获:相当于将定时器和I/O口的外部中断捆绑在了一起。
它的功能有上升沿捕获、下降沿 和 触发中断这个和普通的外部中断基本没有什么区别
但是他有一个 滤波 和 隔断触发功能 我对这两个功能的理解是:

滤波: 就是 当上升沿触发时 他可以不马上触发输入捕获,过滤几次杂波在触发时间
隔断触发: 第一次事件触发后 不动作 第N次触发后在动作

实验

用STM32单片机的输入捕获功能,检测按键按下的时间

在这里插入图片描述

时间计算方式:可以的通过这个计算出定时器计数的时间
在main中的初始化函数中一定要启动定时器,否则将无法触发输入捕获,
要使能定时器溢出中段 因为有可能定时器会溢出导致测量时间和实际值偏差太大//

这里显示重点代码

/*********************************************************
定时器溢出回调函数,一秒产生一次溢出
***************************************************/
uint8_t TIM5_up_num=0;
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 {
	 if( htim->Instance==TIM5)
	 {
		TIM5_up_num++;
		 printf("TIM5_up_num:%ds\r\n",TIM5_up_num);
	 }
	 	 if( htim->Instance==TIM7)
	 {
 
		 printf("TIM7一秒中断触发\r\n",TIM5_up_num);
	 }
 
 }
 /************************************************************************
函数功能:定时器输入比较事件回调函数 
 *************************************************************************/
 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 {
	 /*输入捕获结构体*/
	   TIM_IC_InitTypeDef sConfigIC = {0};
	
		  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
			sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
			sConfigIC.ICFilter = 4;
	 /*
	 设置一个TIM的定时器输入捕获的标志位,
	 上升沿:0   下降沿:1
	 */
	 static _Bool tim3_ch1_state=0;
	float TIME_key;
  /*判断触发方式,和触发中断的定时器*/
	 if(tim3_ch1_state==0&& htim->Instance==TIM5)
	 {
		/***上升沿触发,说明按键已经按下,修改TIM5为下降沿捕获***/
		 /*停止定时器*/
		 HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_1);
		/*下降沿捕获*/
		 sConfigIC.ICPolarity= TIM_INPUTCHANNELPOLARITY_FALLING;
		 /*配置TIM5*/
		 HAL_TIM_IC_ConfigChannel(htim, &sConfigIC, TIM_CHANNEL_1);
		 /*清零寄存器*/ 
		 TIM5->CNT=0; 

		 __HAL_TIM_ENABLE_IT(&htim5, TIM_IT_UPDATE);
		 		 /*使能TIM5输入捕获*/
		 	HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);
		 /*将标志位设置成下降沿*/
		 tim3_ch1_state=1;
		 
	 }else if(tim3_ch1_state==1&& htim->Instance==TIM5)
	 {
		/***下降沿触发,说明按键已经松开 ***
		 ***记录定时器的值 修改TIM5为下降沿捕获***/
			TIME_key=TIM5->CNT;
		 TIME_key=(TIME_key/10000)+TIM5_up_num;
		 printf("TIME_key:%f秒\r\n",TIME_key);
		 /*停止定时器*/
		 HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_1);
		/*上升沿捕获*/
		 sConfigIC.ICPolarity= TIM_INPUTCHANNELPOLARITY_RISING;
		 /*配置TIM5*/
		 HAL_TIM_IC_ConfigChannel(htim, &sConfigIC, TIM_CHANNEL_1);
		 /*清零寄存器*/ 
		 TIM5->CNT=0; 
		 TIM5_up_num=0;
		 /*禁止定时器溢出更新中断*/
		 __HAL_TIM_DISABLE_IT(&htim5, TIM_IT_UPDATE);
		 /*使能TIM5输入捕获*/
		 	HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);
		 /*将标志位设置成上升沿*/
		 tim3_ch1_state=0;
	 
	 }
 
 }

#STM32CudeMX配置
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公子 魏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值