输入捕获中断函数分析解读

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

输入捕获中断函数:


回想起刚学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
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiStar_李什么恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值