最近想了解这个功能,看了两位博主的文章,明白了这个功能,做下笔记
//这个ISR是为了捕获发生上升沿到下降沿的时间长度而设定的 最长捕获时长为(2^22-1)*定时器计数周期
//自定义变量 TIM2CH1_CAPTURE_STA 最高位为捕获标志 为0时代表捕获进行中 为1时代表最近完成过一次捕获 次高位为捕获到高标志 后6位代表捕获到高后的溢出次数 可以理解为大尺
//自定义变量 TIM2CH1_CAPTURE_VAL 用来记录捕获结束时(下降沿)定时器的计数值 可以理解为小尺
//这个ISR是为了捕获发生上升沿到下降沿的时间长度而设定的 最长捕获时长为(2^22-1)*定时器计数周期
//自定义变量 TIM2CH1_CAPTURE_STA 最高位为捕获标志 为0时代表捕获进行中 为1时代表最近完成过一次捕获 次高位为捕获到高标志 后6位代表捕获到高后的溢出次数 可以理解为大尺
//自定义变量 TIM2CH1_CAPTURE_VAL 用来记录捕获结束时(下降沿)定时器的计数值 可以理解为小尺
void TIM2_IRQHandler(void)
{
if(TIM2CH1_CAPTURE_STA&0X80==0)//捕获进行中
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//因为发生了定时器计数溢出而进入ISR
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到上升沿
{
if(TIM2CH1_CAPTURE_STA&0X3F==0X3F) //自定义的计数变量已经无法对高电平持续时间进行计数
{
TIM2CH1_CAPTURE_VAL=0XFFFF;//提示计数无效
TIM2CH1_CAPTURE_STA|=0X80;//标记捕获结束
}
else TIM2CH1_CAPTURE_STA++;//发生溢出但是溢出次数在可计数范围内
}
}
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET) //因为捕获事件进入ISR
{
if(TIM2CH1_CAPTURE_STA&0x40) //上一次捕获到上升沿并发生下降沿捕获
{
TIM2CH1_CAPTURE_STA|=0X80;//标记为捕获完成,此时最高位为1了,不能再处理捕获,可以在别的函数中关闭中断使能或者转存清零标志再次进行捕获
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);//记录下此时的计数值
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);//重新开启上升沿捕获
}
else//无上一次记录
{
TIM2CH1_CAPTURE_VAL=0; //自定义存储清零
TIM_SetCounter(TIM2,0); //定时器计数器清零
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //开启下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update);
}
参考
https://blog.csdn.net/qq_43228406/article/details/108479882
https://blog.csdn.net/hhhbdbfb/article/details/127455445