STM32延时函数

延时函数

      • 滴答定时器实现
      • 定时器

滴答定时器实现

虽然SysTick已经被配置为1ms中断一次的模式,但每个1ms之间SysTick的当前值寄存器是一直在计数的(每计一个数的时间是1/SytemCoreClock)我们便可以利用该机制实现微秒延时函数。
可直接添加至delay.c使用

//注释描述下一条语句
void delay_us(uint32_t us)
{
    __IO uint32_t currentTicks = SysTick->VAL;
  
  /* 每毫秒的滴答数 */
  const uint32_t tickPerMs = SysTick->LOAD + 1;
  
  /* 需计数的滴答数; /1000,就是把1ms分成1000份,因此us延时要在1ms内,超过1ms的延时就是用HAL库的HAL_Delay()延时*/   
  const uint32_t nbTicks = (us * tickPerMs) / 1000;
  
  /* 经过的滴答数 */
  uint32_t elapsedTicks = 0;
  __IO uint32_t oldTicks = currentTicks;
  do {
    currentTicks = SysTick->VAL;
    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks : oldTicks - currentTicks;
    oldTicks = currentTicks;
  } while (nbTicks > elapsedTicks); //经过的滴答数大于等于需计数的滴答数就完成延时了
}
————————————————
版权声明:本文为CSDN博主「Apex-yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaoyuanwuhui/article/details/104667635

定时器

不可直接使用, 需配置定时器

void Delay(__IO uint32_t nTime)
{     
    /* 清零计数器 */  
    TIM2->CNT   = 0;  
    /* 使能计数器 */
    TIM_Cmd(TIM2, ENABLE);     

    for( ; nTime > 0 ; nTime--)
    {
     /* 等待一个延时单位的结束 */
     while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);
     TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    }
    /* 释放计数器 */
    TIM_Cmd(TIM2, DISABLE);
}

你可能感兴趣的:(单片机)