STM32 延时函数解析

原创 2017年02月28日 15:29:23

一、函数原型

STM32官方提供的函数库中,可以找到类似于 HAL_Delay() 这样的函数。这个函数的就是通过使用定时器,达到一个较为精确的时间延迟,提供给用户调用。

这个函数一般包含在类似于 stm32f4xx_hal.c 这样的函数中。函数原型如下:

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0U;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

输入参数为需要延时的时间,单位为毫秒(ms)。其中调用的 HAL_GetTick() 函数为获取计数值 uwTick,该计数值在中段服务函数中进行加一操作。

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

在中断服务函数如下:

void SysTick_Handler(void)
{
  uwTick++;
}

该中断服务函数为系统定时器SysTick的中断响应。而该定时器的初始化函数 HAL_InitTick() 是在 stm32f4xx_hal.c文件里定义,并在 HAL_Init() 函数中被调用。

查看其初始化函数 HAl_InitTick() ,内容如下:

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /*Configure the SysTick to have interrupt in 1ms time basis*/
  HAL_SYSTICK_Config(SystemCoreClock/1000U);

  /*Configure the SysTick IRQ priority */
  HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U);

  /* Return function status */
  return HAL_OK;
}

这个函数首先是为该定时器设置中断产生的周期,例如当前情况下为1ms,也就是没一毫秒都要产生一次中断。其次是为该定时器设置中断优先级。

二、函数说明

用户在使用延时时,直接调用函数 HAl_Delay(time),填入需要延时的时长,单位为毫秒,例如填入5000,则代表延迟5秒,这段时间MCU会产生5000次中断,进5000次中断服务函数对计数值进行加一操作。

延时函数的核心语句为 while循环,如下:

 while((HAL_GetTick() - tickstart) < Delay)
  {
  }

这个函数在条件满足时会一直循环,但是由于循环体为空,所以实际上循环是不产生任何操作的,直到循环不满足,也就是计数值在不断加一操作后的值减去开始延迟时值已经大于延时值时。此时条件不满足,循环结束,程序继续向下执行。

关于上面这个while循环,还可以用采用for循环写的版本,如下:

for(  ;(HAL_GetTick() - tickstart) < Delay;  );

即仅使用for循环的一个条件,这段代码等同于如下代码:

for(;;)
 {
    if((HAL_GetTick() - tickstart) > Delay)     
        break;
 }

三、更多说明

  • 1、关于 SysTick 定时器,数据手册的说明如下:
    这里写图片描述
  • 2、关于forwhile循环的效率说明,可以看这篇文章
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问个人主页 http://cyang.tech https://blog.csdn.net/u011303443/article/details/58592033

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

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

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

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

STM32_TIM延时讲解

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

STM32 延时函数高级用法分析

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

STM32 自定义延时函数

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

stm32中的延时函数

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

STM32 在RVMDK下简单延时计算

为了改写ARF2496K无线2.4G驱动,需要移植到STM32主控上来,所以就想先简单的控制 I/O 时序,去完成这个实验。 第一步先完成寄存器的读写,第二步便完成正常收发,而且暂时不用考虑移植到U...
  • liuyu60305002
  • liuyu60305002
  • 2011年10月14日 16:43
  • 2548

【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

STM32F103延时函数

  • 2016年02月17日 17:09
  • 626B
  • 下载
收藏助手
不良信息举报
您举报文章:STM32 延时函数解析
举报原因:
原因补充:

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