容易移植的定时中断服务函数

常规定时中断服务函数

// 满洲里国峰电子科技  www.guofengdianzi.com
// 微信:GuoFengDianZi

/*******关于STM32定时器应用的注意事项,请参考《STM32定时器注意事项》********/
char Cnt=0;//用于长时间的定时
void  BASIC_TIM_IRQHandler (void)	//50ms定时中断
{
  if ( TIM_GetITStatus(BASIC_TIM, TIM_IT_Update) != RESET )	//检查定时器中断是否发生
  {		
	  Cnt++;
	  if(Cnt>=10)	//10次中断后,为500ms
	  {
	  	SignalProcess();	//每500ms处理一次数据
	  	Cnt=0;	//清零,为下一次计数做准备
  	  }
  }
  TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update); //清除中断标志位  		 		 	
}
/*******关于STM32定时器应用的注意事项,请参考《STM32定时器注意事项》********/

这样的代码是完全没有问题的,可移植性也比较好,但是需要在本文件中新增一个变量Cnt,在移植的时候需要注意一下。

微小的改进

使用静态变量,将Cnt封在函数内部,利用了静态函数运行结束后其值保持不变的特点。这样做的好处是,不用在中断文件stm32f10x_it.c中定义新的变量了,移植起来稍微方便些。

// 满洲里国峰电子科技  www.guofengdianzi.com
// 微信:GuoFengDianZi
void SignalProcess(char RepeatTimes)
{
	static unsigned int Cnt;//静态变量只初始化一次,默认值为0,函数运行结束后其值保持不变。
	Cnt++;
	if(Cnt>=RepeatTimes)
	{
		BeginSigProcess();
		Cnt++;
	}
}

void  BASIC_TIM_IRQHandler (void)	//50ms定时中断
{
  if ( TIM_GetITStatus(BASIC_TIM, TIM_IT_Update) != RESET )	//检查定时器中断是否发生
  {		
	  	SignalProcess(10);	//每500ms处理一次数据
  }
  TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update); //清除中断标志位  		 		 	
}
/*******关于STM32定时器应用的注意事项,请参考《STM32定时器注意事项》********/

作者:伏熊(专业:射频芯片设计、雷达系统。爱好:嵌入式。欢迎大家项目合作交流。)
微信:GuoFengDianZi

发布了34 篇原创文章 · 获赞 7 · 访问量 9232

猜你喜欢

转载自blog.csdn.net/mzldxf/article/details/102806364