输入捕获中断函数:
回想起刚学stm32的时候,看到正点原子哥的输入捕获中断函数代码,让我心生畏惧啊,但是还是硬着头皮去读,勉勉强强的看懂了。今天再次回顾一下这个经典的代码,真的是受益匪浅,赞叹原子哥的思路清晰,大家看下文的时候,可以把程序代码复制到另外一个窗口,交替切换着看,这样阅读体验更佳!
现在用自己的粗浅理解,来给大家解读一下这个经典的输入捕获中断代码:
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记捕获成功
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0

本文详细解析了STM32中输入捕获中断函数的实现原理,通过实例解释了如何处理计数器溢出问题,确保准确捕获高电平脉宽。通过自定义的TIM2CH1_CAPTURE_STA和TIM2CH1_CAPTURE_VAL寄存器,解决了CNT溢出导致的捕获错误。文章深入探讨了中断处理流程,包括上升沿和下降沿的捕获,以及如何判断高电平持续过长的情况。
最低0.47元/天 解锁文章
1293





