针对TIM5的中断处理函数,做出如下解释。(TIM5的中断既包括定时器更新中断(定时器计数发生了溢出),也包括捕获中断)
u8 TIM5CH1_CAPTURE_STA = 0; //TIM5 输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //TIM5 输入捕获数值
//TIM5 输入捕获中断函数
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA & 0x80)==0) //还未捕获成功
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET) //发生了更新中断 定时器计数有溢出
{
// 更新中断和捕获中断在第一次中断发生时候一定是捕获中断,捕获中断中已经将bit6设置为了1
// 故(TIM5CH1_CAPTURE_STA & 0x40)一定等于1
// "发生了更新中断 定时器计数有溢出"的情况下一定有if(TIM5CH1_CAPTURE_STA & 0x40)为真,所以不需要对此进行else
if(TIM5CH1_CAPTURE_STA & 0x40) //bit6=1 已经捕获到了高电平
{
if((TIM5CH1_CAPTURE_STA % 0x3F)==0x3F) //计数次数达到最大,强制结束此次捕获
{
TIM5CH1_CAPTURE_STA |= 0x80; //bit7=1 标志完成一次捕获
TIM5CH1_CAPTURE_VAL = 0xFFFF;
}
else //计数次数没有达到最大
{
TIM5CH1_CAPTURE_STA++;
}
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1) != RESET) //发生了捕获中断 定时器计数没有溢出
{
if(TIM5CH1_CAPTURE_STA & 0X40) //bit6=1 已经捕获到了高电平 故此次捕获是捕获到了下降沿
{
TIM5CH1_CAPTURE_STA |= 0x80; //bit7=1 完成一次捕获
TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5); //获取计数值
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置成上升沿捕获
}
else //bit6=0 还未捕获到高电平 故此次捕获是捕获到了上升沿
{
TIM5CH1_CAPTURE_STA = 0; //清除捕获标志位
TIM5CH1_CAPTURE_VAL = 0; //清空捕获数值
TIM_SetCounter(TIM5,0); //清空TIM5计数寄存器数值
TIM5CH1_CAPTURE_STA |= 0x40; //bit6=1 已经捕获到了高电平
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); // 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update | TIM_IT_CC1); //清除更新中断标志位和捕获中断标志位
}