在程序开发过程中,不使用定时器的情况下,如何获取精确延时呢?

最佳答案

  • dreamadmirer 发表于2018-12-06

    可以试试_nop()_,不过只适用于短时间的延时。

    回答点赞:   Sier_手插口袋 举报 评论 1

其他答案

  • 请输入用户名 发表于 2018-12-05

    系统滴答器,可达到10us级别延时。

    回答点赞:   great_CC ━╋う酔意流年☆═━ヾ Sier_手插口袋 wolf11111 举报 评论 4

  • yhj416606438 发表于 2018-12-06

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

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

    回答点赞:   Sier_手插口袋 wolf11111 举报 评论 2

  • xdsnet 发表于 2018-12-06

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

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

    回答点赞:   Sier_手插口袋 wolf11111 举报 评论 2

  • wolf11111 发表于 2018-12-06

    只能使用汇编,每条指令执行的时间是固定的。c语言很难确定固定时间。

    回答点赞:   Sier_手插口袋 举报 评论 1

  • lsh019 发表于 2018-12-06

    只能看单片机运算速度,单片机执行一个空语句要多少时间,for语句去写,算好后还是很准的。不准的话用示波器在微调下

    回答点赞:   Sier_手插口袋 举报 评论 1

  • liuxiaofei126 发表于 2018-12-06

    用系统滴答定时器就可以,非常精确的

    回答点赞:   Sier_手插口袋 举报 评论 1

  • Sier_手插口袋 发表于 2018-12-06

    滴答,还有就是也可以计算,这跟晶振有关吧,用示波器算出来

    举报 评论 0

  • 赤心木zqw 发表于 2018-12-06

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

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

    举报 评论 0

  • Spirit 发表于 2018-12-06

    用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);
    }

    举报 评论 0

  • lichangle 发表于 2018-12-06

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


    举报 评论 0

  • great_CC 发表于 2018-12-06

    如果是STM32系列,系统滴答器很好用的,比较精确,也能达到10us级别的延时。

    举报 评论 0

  • 这是经国 发表于 2018-12-06

    只能是使用for的循环了,但是要防止中断对定时的影响,要是关中断的

    举报 评论 0

  • chen0000009 发表于 2018-12-07

    连用了定时器的延时都做不到100%准(时钟源不一定准),更别说软件定时的,软件定时还会受中断的影响

    举报 评论 0

  • fe61fccd79eb2537 发表于 2018-12-07

    外接计数芯片

    举报 评论 0

  • WQS1314 发表于 2018-12-07

    看单片机的运行速度,算出执行一条指令的时间,然后编写延时程序,就跟51单片机那样编写延时程序

    举报 评论 0

  • Jing_Wang 发表于 2019-01-15

    建议用硬件定时器,这样计时比较精准,但是会频繁进入中断

    举报 评论 0

  • Florrie 发表于 2019-01-17

    可以直接外接一个计数芯片,实时获取时间数据

    举报 评论 0

我来回答

试用推荐

PCB尺子

产品总数:200个  申请人数:125

距离结束时间:

推荐达人 更多>

  • 向悫 向ta提问

    川楠

    一切能用程序解决的问题都不是问题

    在行: 单片机综合应用 硬件设计

  • 靳飞 向ta提问

    汉云

    在路上的Linuxer

    在行: DSP技术 STM32讨论区

  • 徐珂靖 向ta提问

    xukejing

    规格严格,功夫到家

    在行: 开发板综合 Linux 系统

  • 袁建明 向ta提问

    河北博联科技有限公司 研发部经理

    日知其所亡

    在行: 嵌入式 Linux 系统

  • 张峰 向ta提问

    光学总工

    用心工作,用心生活

    在行: 嵌入式 Linux 系统

完成答题
赶快去开启您的宝箱吧