wenbo2005.online

学习记录 / STM32

STM32 实现 us 级延时

STM322025-05-12

1,定时器

定时器预分配系数为:系统时钟-1

定时器比较值:默认即可,如果最大值为65535,则最大us级延时为65535us==65ms

一定是向上计数!!

void delay_us(uint16_t nus)
{
    //减5是为了补偿函数调用和指令执行的时间开销
    uint16_t differ = 0xffff-nus-5;
        //设置定时器2的计数初始值
        __HAL_TIM_SetCounter(&htim2,differ);
        //开启定时器
        HAL_TIM_Base_Start(&htim2);

        while(differ<0xffff-5)
                differ = __HAL_TIM_GetCounter(&htim2);
        //关闭定时器
        HAL_TIM_Base_Stop(&htim2);
}

2,空循环

系统主频为168MHz每个__NOP()指令大约需要4个时钟周期执行

void for_delay_us(uint32_t nus)
{
     volatile uint32_t Delay = nus * 168/4;//
     do
     {
          __NOP();
     }
     while (Delay --);
}

3,使用SysTick

void delay_us(uint32_t udelay)
{
  uint32_t startval,tickn,delays,wait;

  startval = SysTick->VAL;
  tickn = HAL_GetTick();
  //sysc = 72000;  //SystemCoreClock / (1000U / uwTickFreq);
  delays =udelay * 72; //sysc / 1000 * udelay;
  if(delays > startval)
    {
      while(HAL_GetTick() == tickn)
        {

        }
      wait = 72000 + startval - delays;
      while(wait < SysTick->VAL)
        {

        }
    }
  else
    {
      wait = startval - delays;
      while(wait < SysTick->VAL && HAL_GetTick() == tickn)
        {

        }
    }
}