【STM32】uwTick的作用及用法

前言

在准备蓝桥杯嵌入式的时候,注意到了它——uwTick,以前没有深入了解过它,今天明白了它的含义和用法后感到它真是太棒了!在此记录以下其用法。

源代码

先引出我们最熟悉的延迟函数:

HAL_Delay(uint32_t Delay)

我们找到其源码:

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

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

HAL_Delay()的源码里出现了一个调用函数:

HAL_GetTick()

我们找到其源码:

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

好了,现在找到我们今天学习的uwTick了,HAL_Delay()的延迟原理就是首先获取一次uwTick的值,赋给一个uint32_t类型的变量,然后在while循环里不停地获取新的uwTick值用来减去第一次的uwTick的值,从而实现延迟的效果。
uwTick——就是当单片机上电后一直进行累加计算的一个变量,数据类型为uint32_t,有兴趣的同学可以算一下单片机上电多长时间后其才会溢出归零。
那么多久uwTick才会加一呢?
我们回到HAL_Delay()的源码:

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

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

注意此处:

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

关键解释: /* Add a freq to guarantee minimum wait */——添加一个频率以保证最小等待时间
找到uwTickFreq的定义:

__IO uint32_t uwTick;
uint32_t uwTickPrio   = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

好了,这下找到了,频率为1KHz。也就是1ms计数一次…完结…

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值