原子战舰STM32——定时器捕获中断库函数程序中中断处理函数说明

针对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);   //清除更新中断标志位和捕获中断标志位
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值