第一章:https://blog.csdn.net/m0_73671341/article/details/134773615?spm=1001.2014.3001.5501
第二章:https://blog.csdn.net/m0_73671341/article/details/134938332?spm=1001.2014.3001.5501
从第一章的定时器捕获我们可以知道,即使把定时器捕获时长设置到最大也只有65.536ms,而第二章就说明了,高电平小于65.536ms的时候,如何捕获高电平时间。那么如果高电平时间溢出中断时间65.536ms怎么办?
- 原先的TIM2(高电平输出)
TIM_TimeBaseStructure.TIM_Period = 19999;TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_SetCompare2(TIM2,10000);//占空比为50%,即10ms高电平
现在把TIM2改成
TIM_TimeBaseStructure.TIM_Period = 19999;TIM_TimeBaseStructure.TIM_Prescaler = 719;
此时TIM2分频系数放大十倍,则频率降低十倍,周期放大十倍。
TIM_SetCompare2(TIM2,10000);//占空比为50%,即100ms高电平
很明显已经超过最大值65.536ms了。
这时候如果执行代码,输出高电平时间,会输出34.464ms,很明显65.536+34.464=100ms,65.536是一次周期的时间,所以我们可以得出一个结论:高电平时间=n次周期+最后捕获的时间。
所以我们在TIM3配置中,使能TIM_IT_Update(中断标志位),在TIM3中断函数中,清除TIM_IT_Update。
代码逻辑:如果定时器在捕获,TIM_IT_Update为Set,并且此时处于高电平。peroid_times++,然后清楚TIM_IT_Update,重复此过程,每次溢出都会让peroid_times++。
void TIM3_IRQHandler(void)
{static unsigned char high_flag = 0;if(high_complete_flag == 0){if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//溢出{if(high_flag == 1){peroid_times++;}}if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET){if(high_flag == 0)//上升沿{high_flag = 1;high_value = 0;TIM_SetCounter(TIM3,0);TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);}else//下降沿{high_value = TIM_GetCounter(TIM3);TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_High);high_flag = 0;high_complete_flag = 1;}}}TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1|TIM_IT_Update);
}
int main(void)
{TIM2_PWM_Configuration();TIM3_InputCaputure_Configuration();//PA1:发出《————》PA6:接收Uart1_Configuration();TIM_SetCompare2(TIM2,10000);//占空比为50%,即100ms高电平while(1){if(high_complete_flag == 1){printf("%d us",peroid_times * 65536+high_value);high_complete_flag = 0;}Delay_s(10);}
}