STM32中的计时与延时

前言

在裸机开发中,延时作为一种规定循环周期的方式经常被使用,其中尤以HAL库官方提供的HAL_Delay为甚。刚入门的小白可能会觉得既然有官方提供的延时函数,而且精度也还挺好,为什么不用呢?实际上HAL_Delay中有不少坑,而这些也只是HAL库中无数坑的其中一些。想从坑里跳出来还是得加强外设原理的学习和理解,切不可只依赖HAL库。

除了延时之外,我们在开发中有时也会想要确定某段程序的耗时,这就需要计时,并且经常是us为单位的计时。

本文将介绍2种延时的方法与1种计时的方法,其中介绍延时的HAL_Delay时会讲解这个函数的坑在哪里,以供参考。

2种延时方法


直接定义一个变量,然后while循环让其自增或自减到指定值这种方式虽然也可以达到延时的效果,但可控性较差,这里不再赘述。

下文介绍的2种延时方法从原理上来说都是依靠定时器中的计数器。开启定时器后,计数器会按照输入定时器的频率不断自增或自减,知道了定时器的频率也就知道了计数器+1或-1代表了多长时间。

定时器结构图
STM32中的计时与延时_第1张图片

HAL_Delay

HAL_Delay解析

HAL_Delay使用STM32内部的系统时钟SysTick中的计数器。并使用Systick计时中断来进行精确计时。

/**
  * @brief This function provides minimum delay (in milliseconds) based
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay  specifies the delay time length, in milliseconds.
  * @retval None
  */
__weak void HAL_Delay(uint32_t Delay)
{
   
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if 

你可能感兴趣的:(STM32,stm32,单片机)