• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

不使用定时器的情况下,如何获取精确延时呢?

我是假管 2018-12-05 浏览量:1253
在程序开发过程中,不使用定时器的情况下,如何获取精确延时呢?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 可以试试_nop()_,不过只适用于短时间的延时。
    • 发布于 2018-12-06
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:17

  • 用阻塞函数实现,比如while for都可以实现控制io变化,然后用示波器测量波形的宽度就是延时时间

    或者用stc的延时计算软件也可以实现

    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 2
    • 0

  • 不用定时器,精确的可能不好控制。

    再有,你所谓的精确到什么级别,允许的误差是多少?

    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 2
    • 0

  • 只能使用汇编,每条指令执行的时间是固定的。c语言很难确定固定时间。
    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 1
    • 0

  • 只能看单片机运算速度,单片机执行一个空语句要多少时间,for语句去写,算好后还是很准的。不准的话用示波器在微调下
    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 1
    • 0

  • 滴答,还有就是也可以计算,这跟晶振有关吧,用示波器算出来
    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 用汇编语言精确每个语句的时间,可以做到精确的延时,这需要查汇编语句的机器周期及汇编基础。

    系统滴答定时器也可以实现,不过说白了这个也是定时器,只不过不算在外设中罢了。

    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 用systick实现ms级的延时没问题,但uS级的就比较麻烦。毕竟不建议随便改tick的分频

    那么,如果是Corecm3内核的话,推荐这个:

    uint32_t DWT_Delay_Init(void) {
        /* Disable TRC */
        CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
        /* Enable TRC */
        CoreDebug->DEMCR |=  CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

        /* Disable clock cycle counter */
        DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
        /* Enable  clock cycle counter */
        DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

        /* Reset the clock cycle counter value */
        DWT->CYCCNT = 0;

        /* 3 NO OPERATION instructions */
        __ASM volatile ("NOP");
        __ASM volatile ("NOP");
        __ASM volatile ("NOP");

        /* Check if clock cycle counter has started */

        if(DWT->CYCCNT){
            return 0; /*clock cycle counter started*/
        } else {
            return 1; /*clock cycle counter not started*/
        }
    }


    __STATIC_INLINE void DWT_Delay_us(volatile uint32_t microseconds)
    {
      uint32_t clk_cycle_start = DWT->CYCCNT;
      /* Go to number of cycles for system */
      microseconds *= (HAL_RCC_GetHCLKFreq() / 1000000); //改变这个值,可以调整时间粒子
      /* Delay till end */
      while ((DWT->CYCCNT - clk_cycle_start) < microseconds);
    }

    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 精确延时必须使用定时器 因为不管是阻塞模式还是其他 都有可能会被中断打断 


    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果是STM32系列,系统滴答器很好用的,比较精确,也能达到10us级别的延时。
    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 只能是使用for的循环了,但是要防止中断对定时的影响,要是关中断的
    • 发布于2018-12-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 连用了定时器的延时都做不到100%准(时钟源不一定准),更别说软件定时的,软件定时还会受中断的影响
    • 发布于2018-12-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 看单片机的运行速度,算出执行一条指令的时间,然后编写延时程序,就跟51单片机那样编写延时程序
    • 发布于2018-12-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 建议用硬件定时器,这样计时比较精准,但是会频繁进入中断
    • 发布于2019-01-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以直接外接一个计数芯片,实时获取时间数据
    • 发布于2019-01-17
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

不使用定时器的情况下,如何获取精确延时呢?