首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HAL_GetTick()是返回滴答还是毫秒?(以及如何测量微秒)

HAL_GetTick()是返回滴答还是毫秒?(以及如何测量微秒)
EN

Stack Overflow用户
提问于 2017-03-12 12:00:57
回答 5查看 93.3K关注 0票数 22

我刚开始使用HAL函数。函数的描述 of HAL_GetTick()说,它“提供了一个以毫秒为单位的刻度值”。

我不明白这个函数是返回滴答还是毫秒。当然,要将滴答转换为毫秒,我需要知道一毫秒内有多少滴答滴答,这是特定于CPU的。

那么,HAL_GetTick()到底返回了什么呢?

编辑:

我真正的问题是知道如何用微秒来测量时间。所以我想从HAL_GetTick()上得到滴答,然后把它们转换成微秒。这是在评论中提到的,至少在其中一个答案中,所以我在这里也提到了这一点,我编辑了标题。

EN

回答 5

Stack Overflow用户

发布于 2017-03-12 12:20:24

两者都是。大多数情况下,增加HAL滴答计数器的函数被连接到SysTick中断,该中断被配置为每1ms勾选一次。因此,HAL_GetTick()将返回SysTick中断配置后的毫秒数(基本上是自程序启动以来)。这也可以说是“SysTick中断‘滴答’的次数”。

票数 3
EN

Stack Overflow用户

发布于 2019-08-29 13:30:30

虽然这个问题已经得到了回答,但我认为看看HAL如何使用HAL_GetTick()来计算毫秒是有帮助的。这可以从HAL的函数HAL_Delay(uint32_t Delay)中看出。

HAL_Delay(uint32_t Delay)stm32l0xx_hal.c中的实现

代码语言:javascript
复制
/**
  * @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 period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait++;
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}
票数 2
EN

Stack Overflow用户

发布于 2020-09-08 00:15:25

我也遇到了同样的问题,但是在PlatformIO中找到了一个库函数,它返回微秒。

代码语言:javascript
复制
uint32_t getCurrentMicros(void)
{
  /* Ensure COUNTFLAG is reset by reading SysTick control and status register */
  LL_SYSTICK_IsActiveCounterFlag();
  uint32_t m = HAL_GetTick();
  const uint32_t tms = SysTick->LOAD + 1;
  __IO uint32_t u = tms - SysTick->VAL;
  if (LL_SYSTICK_IsActiveCounterFlag()) {
    m = HAL_GetTick();
    u = tms - SysTick->VAL;
  }
  return (m * 1000 + (u * 1000) / tms);
}

它位于~/.platformio/packages/framework-arduinoststm32/libraries/SrcWrapper/src/stm32/clock.c

但是它看起来好像STM32CubeIde没有它,所以我只是从PlatformIO复制它。此外,我还必须复制LL_SYSTICK_IsActiveCounterFlag()函数:

代码语言:javascript
复制
static inline uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
{
  return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42747128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档