STM32 延时函数高级用法分析

原创 2017年03月01日 20:44:42

一、使用场景

第一种情况,在使用普通 STM32 延迟函数,类似于 HAL_Delay(time),由于该函数是使用循环去判断及延时的,所以在执行该函数时整个程序会在此处等待定时器的中断服务函数修改参量使得循环判决条件不成立,从而继续程序的执行,同时也达到延迟时间的效果。由于使用的是系统的定时器进行延迟,所以时间相对准确。

第二种情况,当需要周期性的执行一个任务时,将这个函数放在某个定时器的中断服务函数里,设置好定时器的时间,完成时产生中断,从而进入中断服务函数执行该函数。此时,MCU 执行中断程序,只有更高优先级的中断才能打断当前执行的中断服务函数,进入更高优先级的中断服务函数去执行。需要等所有中断服务函数都执行完成,才会退回到主函数。

第三钟情况,而结合定时器以及相应的标志位,直接在主函数中达到周期任务的效果。原理如下:

  • 1、设置一个全局的标志位flag,初值为 0。
  • 2、在SysTick定时器的中断服务函数中,周期性地对改标志位置 1。
  • 3、主函数 while(1)中,只要使用if(flag){}去判断条件是否满足,满足则执行,不满足则跳过。

第三种情况和第二钟情况的主要区别在于,第三种情况的周期任务函数是在主函数中执行的,而第二种则是在中断服务函数里执行的。使用第二种方式去执行周期任务,程序上可能会更好理解一些;使用第三种方式,则在编写程序时更简便一点。

这三种情况的使用场景不一样,第一种是使用 CPU 空操作的方式来延迟固定时间,保证通信时序正确;第二种使用中断的方式适用于比较重要的周期任务,保证周期准确;第三种则适用于周期不那么重要,只要在 while(1)循环中,任务函数不断地进行 if(flag)的判断,满足就执行。

二、代码演示

  while (1)
  { 
    BSP_LED_On(LED1);
    #if 1 //演示1,普通延时函数 5s打印一次时间和follow on
        printf_time();
        HAL_Delay(1000); //延时1000ms
        printf("follow on \n ");
    #else //演示2,周期任务 1s打印一次时间,5s打印一次follow on
        printf_time();
        HAL_Delay(1000);
        Sys_Delay(5000);
        if(flag)
        {
            flag = 0;
            printf("follow on \n");
        }       
    #endif
  }

printf_time()函数就是将 MCU RTC 中的时间通过串口打印出来,而HAL_Delay()就是普通的延时函数,Sys_Delay()是用于设置第三种方式中所提的定时任务的周期,代码如下:

void Sys_Delay(uint32_t time)
{
  Cycle_Time = time;
}

而中断服务函数的代码如下:

void SysTick_Handler(void)
{
  HAL_IncTick();
  T1msCount++;
  if(T1msCount>Cycle_Time)
  {
    T1msCount = 0;
    flag = 1;           
  }
}

该中断每 1ms 产生一次,对计数值T1msCount进行加 1,当大于周期时间时,清零,并对标志位赋 1,此后主函数中if(flag)成立,对标志位清零,并执行其中的周期任务。

这里写图片描述
这里写图片描述
图一对于主函数中演示 1,代表延迟一秒,打印时间及“follow on”,
图二对应主函数在 #if 0 时的演示2,代表延迟一秒打印一次时间,打印”follow on”的周期为5秒。

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问个人主页 http://cyang.tech https://blog.csdn.net/u011303443/article/details/59132074

STM32延时函数的三种方法——最好掌握第三种

单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来...
  • luodonghuan1
  • luodonghuan1
  • 2015年06月20日 14:25
  • 19981

STM32中通过普通延时函数来精确延时

在STM32中处处会用到延时函数,一般而言,对于普通的控制延时,并不会要求特别精确,所以可以使用普通的延时函数,例如 void delay(u32 time) { while(time--); }...
  • yunzhifeiti
  • yunzhifeiti
  • 2017年03月05日 15:13
  • 6424

STM32 延时函数高级用法分析

一、使用场景第一种情况,在使用普通 STM32 延迟函数,类似于 HAL_Delay(time),由于该函数是使用循环去判断及延时的,所以在执行该函数时整个程序会在此处等待定时器的中断服务函数修改参量...
  • u011303443
  • u011303443
  • 2017年03月01日 20:44
  • 2402

STM32_TIM延时讲解

今天讲解STM32F103定时器延时功能,TIM的功能很强大,后续慢慢讲解。今天从简单开始讲解定时器,以下面软件工程实例来讲述。   软件工程下载地址(360云盘): https://yunpan.c...
  • ybhuangfugui
  • ybhuangfugui
  • 2016年05月04日 17:12
  • 4669

stm32中的延时函数

//粗延时函数,微秒 void delay_nus(u16 time) {        u16 i=0;      while(time--)    {       i=10;  //自己定义  ...
  • m0_37655357
  • m0_37655357
  • 2017年05月08日 11:44
  • 775

STM32学习笔记——利用通用定时器TIM2进行精确延时

利用通用定时器TIM2进行精确延时 1.       通用定时器概述及性能 1.1 概述 在作者所使用的stm32芯片上,共有TIM1 1个高级定时器以及TIM2、TIM3、TI...
  • SahPah
  • SahPah
  • 2014年08月13日 23:07
  • 13336

STM32 自定义延时函数

在stm32调试过程中加入一个延时,有两种方式:一种是纯计数方式,另一种是使用系统计数器的方式。 现使用系统计数器产生中断的方式实现,查阅STM32的编程手册可知,STM32有一个24bit的系统计时...
  • jiujiaobusiniao
  • jiujiaobusiniao
  • 2016年12月19日 16:55
  • 828

STM32 延时函数解析

一、函数原型STM32官方提供的函数库中,可以找到类似于 HAL_Delay() 这样的函数。这个函数的就是通过使用定时器,达到一个较为精确的时间延迟,提供给用户调用。这个函数一般包含在类似于 stm...
  • u011303443
  • u011303443
  • 2017年02月28日 15:29
  • 1104

【STM32小案例 07 】STM32完美可用的延时程序,自用延时程序库,直接调用

前面的案例中有很多的小伙伴都私信我关于delay_other.c和delay_other.h头文件的源码。 在这里就直接分享出来。 --------------------------------...
  • teavamc
  • teavamc
  • 2017年10月08日 15:27
  • 621

stm32CubeMX HAL库中延时的几种方式解析

stm32CubeMX HAL库中延时的几种方式解析 HAL_Dalay()是毫秒级延时,为了使用微秒级延时最近学习了一下,总结如下,推荐使用最后一种方式。 /* * 本文件包括...
  • hxkrrzq
  • hxkrrzq
  • 2016年10月13日 17:11
  • 12548
收藏助手
不良信息举报
您举报文章:STM32 延时函数高级用法分析
举报原因:
原因补充:

(最多只允许输入30个字)