STM32实现微秒级延时函数的3种方法(含独创内容)

 好像在使用超声波雷达测距的时候用到了这个函数

方式1:重载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)
  {
  }
}

把上述代码修改一下:

//这里已经去掉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)/1000;
  }

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

唯一不同的就是除了一个1000.

方式2:(已经验证的方法)

void delay_us(uint8_t SYSCLK, int i){
//比如SYSCLK=72,或者SYSCLK=8,i是需要延时的微秒数
  uint32_t fac_us=0;
  uint32_t temp;
  fac_us=SYSCLK/8;
  SysTick->LOAD=i*fac_us;
  SysTick->VAL=0;
  SysTick->CTRL=1;
  do{
    temp=SysTick->CTRL;
  }while(temp&1&&!(temp&(1<<16)));
  SysTick->CTRL=0;
  SysTick->VAL=0;
}

或者: 

uint32_t fac_us=0;
void delay_init(uint8_t SYSCLK){
  fac_us=SYSCLK/8;
}
void delay_us(int i){
  uint32_t temp;
  SysTick->LOAD=i*fac_us;
  SysTick->VAL=0;
  SysTick->CTRL=1;
  do{
    temp=SysTick->CTRL;
  }while(temp&1&&!(temp&(1<<16)));
  SysTick->CTRL=0;
  SysTick->VAL=0;
}
void delay_us(int i){
//比如SYSCLK=72,或者SYSCLK=8,i是需要延时的微秒数
  uint32_t fac_us=0;
  uint32_t temp;
  uint8_t SYSCLK;
  SYSCLK=HAL_RCC_GetHCLKFreq()/1000/1000;
  fac_us=SYSCLK/8;
  SysTick->LOAD=i*fac_us;
  SysTick->VAL=0;
  SysTick->CTRL=1;
  do{
    temp=SysTick->CTRL;
  }while(temp&1&&!(temp&(1<<16)));
  SysTick->CTRL=0;
  SysTick->VAL=0;
}

另外还可以通过定时器TIM来实现微妙延时

作者:geniusNMRobot顶级专家

物联沃分享整理
物联沃-IOTWORD物联网 » STM32实现微秒级延时函数的3种方法(含独创内容)

发表回复