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配置