金牌会员
 
- 积分
- 1824
- 金钱
- 1824
- 注册时间
- 2013-4-13
- 在线时间
- 63 小时
|
TIMER输入捕获中断服务函数源码:
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8 TIM5CH1_CAPTURE_STA=0;//输入捕获状态,先清零
u16 TIM5CH1_CAPTURE_VAL;//输入捕获值
//定时器5中断服务程序
void TIM5_IRQHandler(void)
{
u16 tsr;
tsr=TIM5->SR;
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获,也就是说如果TIM5CH1_CAPTURE_STA==0;
{
if(tsr&0X01)//溢出,这时如果TIM5->SR的bit0==1;表达式相当于“TIM5->SR&0x01”
{//"位0 UIF"更新中断标志位,
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了,如果bit6==1,则TIM5CH1_CAPTURE_STA
{//的值至少是“ox0010 0000”,
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了,这是一种特殊情况
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次,这将导致第一个if表达式为假
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if(tsr&0x02)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40)//捕获到一个下降沿,即如果bit6==1,
{
TIM5CH1_CAPTURE_STA|=0X80;//,将bit7置位,标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.
TIM5->CCER&=~(1<<1);//CC1P=0 设置为上升沿捕获
} else //还未开始,第一次捕获上升沿,本中断服务函数应该从这里开始分析,该内容类似初始化
{
TIM5CH1_CAPTURE_STA=0;//清空
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿
TIM5->CNT=0;//计数器清空
TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
}
}
}//第1个if的封口
TIM5->SR=0;//清除中断标志位
}
|
|