一种基于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;
}

一样的分享一些资料,供参考学习希望有用

(定时器)
http://www.makeru.com.cn/live/1392_1199.html?s=45051
(时钟系统)
http://www.makeru.com.cn/live/1392_1082.html?s=45051
STM32中断系统
http://www.makeru.com.cn/live/3523_1745.html?s=45051

猜你喜欢

转载自www.cnblogs.com/QianD/p/11289724.html