一种基于STM32利用始终定时实现延迟的方法

发布时间:
来源: 电子工程世界

  传统上我们常用delay函数进行延迟,然而这种方式有一个很大的弊端那就是需要占用相当长的时钟周期,此时原本该用于计算各类复杂算法的计算内核都要随着系统一起停下来,很不经济也容易造成问题处理不及时的后果。


  事实上,我们只需要利用时钟中断的方式,利用一个全局变量作为标志为即可具体程序如下:




u8 time3_tmp = 0;//时钟标志

u8 fun_flag;//服务函数标志

void  Timer3_Config(void)//配置

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStruture;             ////////重定义结构体

TIM_DeInit(TIM3);                                         /////////恢复初始化

TIM_TimeBaseStruture.TIM_Period=(60-1);                   //////TIM_ARR值30毫秒中断一次

TIM_TimeBaseStruture.TIM_Prescaler=(36000-1);             //////////时钟分频

TIM_TimeBaseStruture.TIM_ClockDivision=TIM_CKD_DIV1;       /////////采样分频,1就是不分频

TIM_TimeBaseStruture.TIM_CounterMode=TIM_CounterMode_Up;   //////向上计数

TIM_TimeBaseStruture.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruture);              ///////设置TIM2值 

TIM_CleaRFlag(TIM3,TIM_FLAG_Update);                        ///////清溢出标志

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                   //////使能溢出中断

}  


void  TIM3_IRQHandler (void)

{

        

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);         


IF(time3_tmp==1)

{

           fun_flag=0;

          time3_tmp=0;

          GPIO_ResetBits(GPIOB,GPIO_Pin_1);

}

if(fun_flag==1)                                                        //////USART3错误延时

    {

                time3_tmp=1;

          }

TIM_Cmd(TIM3,DISABLE);  ///////关闭定时器3 

}


void fun(void)

{

/*触发某种事件改变fun_flag*/

fun_flag =~fun_flag;

}


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。