STM32 HAL库 获取系统us时间

适用于使用嘀嗒定时器作为系统时钟的系统,stm32cubemx配置默认都是嘀嗒定时器
ms时间可以直接使用HAL_GetTick函数获取,us时间HAL库默认没有提供,我们可以自己写

全部代码:

__STATIC_INLINE uint32_t GXT_SYSTICK_IsActiveCounterFlag(void)
{
  return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
}
static uint32_t getCurrentMicros(void)
{
  /* Ensure COUNTFLAG is reset by reading SysTick control and status register */
  GXT_SYSTICK_IsActiveCounterFlag();
  uint32_t m = HAL_GetTick();
  const uint32_t tms = SysTick->LOAD + 1;
  __IO uint32_t u = tms - SysTick->VAL;
  if (GXT_SYSTICK_IsActiveCounterFlag()) {
    m = HAL_GetTick();
    u = tms - SysTick->VAL;
  }
  return (m * 1000 + (u * 1000) / tms);
}
//获取系统时间,单位us
uint32_t micros(void)
{
  return getCurrentMicros();
}

节选自Arduino的stm32库,小小改一下就可以直接用在HAL库上

使用时直接调用micros函数就可以了


代码讲解:

  • GXT_SYSTICK_IsActiveCounterFlag可以直接不看
  • 关键就在下面这段
//获取当前ms
uint32_t m = HAL_GetTick();
//获取嘀嗒定时器重装载值
const uint32_t tms = SysTick->LOAD + 1;
//获取当前滴答定时器计数值
__IO uint32_t u = tms - SysTick->VAL;
//返还对应的值
return (m * 1000 + (u * 1000) / tms);

关于嘀嗒定时器,不了解可以查看相关文章。
快速查看值的变化可以看我的这篇博客底下得两张图片帮助理解
链接

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐