STM32定时器捕获功能典型ISR

最近想了解这个功能,看了两位博主的文章,明白了这个功能,做下笔记

//这个ISR是为了捕获发生上升沿到下降沿的时间长度而设定的 最长捕获时长为(2^22-1)*定时器计数周期
//自定义变量 TIM2CH1_CAPTURE_STA 最高位为捕获标志 为0时代表捕获进行中 为1时代表最近完成过一次捕获 次高位为捕获到高标志 后6位代表捕获到高后的溢出次数 可以理解为大尺
//自定义变量 TIM2CH1_CAPTURE_VAL 用来记录捕获结束时(下降沿)定时器的计数值 可以理解为小尺

//这个ISR是为了捕获发生上升沿到下降沿的时间长度而设定的      最长捕获时长为(2^22-1)*定时器计数周期   
//自定义变量  TIM2CH1_CAPTURE_STA 最高位为捕获标志 为0时代表捕获进行中 为1时代表最近完成过一次捕获  次高位为捕获到高标志 后6位代表捕获到高后的溢出次数 可以理解为大尺
//自定义变量  TIM2CH1_CAPTURE_VAL 用来记录捕获结束时(下降沿)定时器的计数值 可以理解为小尺
void TIM2_IRQHandler(void)
{
	if(TIM2CH1_CAPTURE_STA&0X80==0)//捕获进行中
	{
	     if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//因为发生了定时器计数溢出而进入ISR
		 {
		    if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到上升沿 
			{
		      if(TIM2CH1_CAPTURE_STA&0X3F==0X3F) //自定义的计数变量已经无法对高电平持续时间进行计数
			  {
			      TIM2CH1_CAPTURE_VAL=0XFFFF;//提示计数无效
				  TIM2CH1_CAPTURE_STA|=0X80;//标记捕获结束				  				   
			  }
			  else	TIM2CH1_CAPTURE_STA++;//发生溢出但是溢出次数在可计数范围内

		     }
		 }

		 if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET) //因为捕获事件进入ISR
		 {
		      if(TIM2CH1_CAPTURE_STA&0x40) //上一次捕获到上升沿并发生下降沿捕获
			  {
			      TIM2CH1_CAPTURE_STA|=0X80;//标记为捕获完成,此时最高位为1了,不能再处理捕获,可以在别的函数中关闭中断使能或者转存清零标志再次进行捕获
				  TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);//记录下此时的计数值
				  TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);//重新开启上升沿捕获
			  }
			  else//无上一次记录
			  {
			      TIM2CH1_CAPTURE_VAL=0;  //自定义存储清零
				  TIM_SetCounter(TIM2,0); //定时器计数器清零
				  TIM2CH1_CAPTURE_STA=0;  //清空
				  TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到上升沿
				  TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //开启下降沿捕获
			  }
		 }
	}
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update);  
}

参考
https://blog.csdn.net/qq_43228406/article/details/108479882
https://blog.csdn.net/hhhbdbfb/article/details/127455445

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32上实现一个5ms的定时器中断,你可以使用STM32定时器外设来完成。 首先,选择一个可用的定时器(例如TIM2、TIM3等),并将其配置为定时器模式。你可以使用STM32的CubeMX工具来进行配置,或者手动编写代码。 接下来,根据你的系统时钟频率和所需的时间间隔计算出定时器的预分频和自动重加载值。 例如,如果你的系统时钟频率为72MHz,并且你想要一个5ms的定时器中断,那么你可以按照以下步骤进行配置: 1. 设置预分频值:根据定时器的时钟频率和所需的时间间隔计算出预分频值。 预分频值 = (定时器时钟频率 / 所需中断频率) - 1 在这种情况下,预分频值 = (72MHz / 200Hz) - 1 = 359999。 2. 设置自动重加载值:根据所需的时间间隔计算出自动重加载值。 自动重加载值 = (所需中断频率 / 定时器时钟频率) - 1 在这种情况下,自动重加载值 = (200Hz / 72MHz) - 1 = 3599。 3. 配置定时器中断优先级:在NVIC中设置定时器中断的优先级。 4. 启用定时器中断:在定时器的控制寄存器中,使能更新中断(UIE)位。 5. 启动定时器:在定时器的控制寄存器中,使能定时器(CEN)位。 这样,当定时器计数器达到自动重加载值时,定时器将会触发一个中断,并执行中断服务程序(ISR)。 在ISR中,你可以执行任何你需要的操作,例如更新某些变量、发送数据等。 请注意,以上步骤是一个简单的示例配置,具体的配置可能因使用的STM32系列和具体需求而有所不同。你可以参考所使用的芯片的参考手册和相关的示例代码来完成更准确的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值