精华内容
下载资源
问答
  • STM32延时函数的四种方法

    万次阅读 2020-06-12 10:01:15
    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。 1、普通延时 这种延时方式应该是大家在51单片机时候,接触最早的...

    目录

    1、普通延时

    2、定时器中断

    3、查询定时器

    4、汇编指令


    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。

    1、普通延时

    这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。

    //微秒级的延时
    void delay_us(uint32_t delay_us)
    {    
      volatile unsigned int num;
      volatile unsigned int t;
    
      
      for (num = 0; num < delay_us; num++)
      {
        t = 11;
        while (t != 0)
        {
          t--;
        }
      }
    }
    //毫秒级的延时
    void delay_ms(uint16_t delay_ms)
    {    
      volatile unsigned int num;
      for (num = 0; num < delay_ms; num++)
      {
        delay_us(1000);
      }
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/02-Template

    2、定时器中断

    定时器具有很高的精度,我们可以配置定时器中断,比如配置1ms中断一次,然后间接判断进入中断的次数达到精确延时的目的。这种方式精度可以得到保证,但是系统一直在中断,不利于在其他中断中调用此延时函数,有些高精度的应用场景不适合,比如其他外设正在输出,不允许任何中断打断的情况。

    STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍:

    初始化SysTick 定时器:

    /* 配置SysTick为1ms */
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);

    中断服务函数:

    void SysTick_Handler(void)
    {
      TimingDelay_Decrement();
    }
    void TimingDelay_Decrement(void)
    {
      if (TimingDelay != 0x00)
      { 
        TimingDelay--;
      }
    }

    延时函数:

    void Delay(__IO uint32_t nTime)
    {
      TimingDelay = nTime;
      while(TimingDelay != 0);
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/02-Template

    3、查询定时器

    为了解决定时器频繁中断的问题,我们可以使用定时器,但是不使能中断,使用查询的方式去延时,这样既能解决频繁中断问题,又能保证精度。

    STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍。

    STM32的CM3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

    SYSTICK的时钟固定为HCLK时钟的1/8,在这里我们选用内部时钟源120M,所以SYSTICK的时钟为(120/8)M,即SYSTICK定时器以(120/8)M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。

                                           ▼CTRL:控制和状态寄存器

                                           ▼LOAD:自动重装载除值寄存器

                                            ▼VAL:当前值寄存器

                                     ▼CALIB:校准值寄存器

    使用不到,不再介绍

    示例代码

    void delay_us(uint32_t nus)
    {
      uint32_t temp;
      SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus;
      SysTick->VAL=0X00;//清空计数器
      SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
      do
      {
        temp=SysTick->CTRL;//读取当前倒计数值
      }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
      SysTick->CTRL=0x00; //关闭计数器
      SysTick->VAL =0X00; //清空计数器
    }
    void delay_ms(uint16_t nms)
    {
      uint32_t temp;
      SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms;
      SysTick->VAL=0X00;//清空计数器
      SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
      do
      {
        temp=SysTick->CTRL;//读取当前倒计数值
      }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
      SysTick->CTRL=0x00; //关闭计数器
      SysTick->VAL =0X00; //清空计数器
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/04-Delay

    4、汇编指令

    如果系统硬件资源紧张,或者没有额外的定时器提供,又不想方法1的普通延时,可以使用汇编指令的方式进行延时,不会被编译优化且延时准确。

    STM32F207在IAR环境下

    /*!
     *  @brief 	软件延时 
     *  @param	ulCount:延时时钟数
     *  @return none
     *	@note 	ulCount每增加1,该函数增加3个时钟
     */
    void SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
              "    bne.n   SysCtlDelay\n"
              "    bx      lr");
    }

    这3个时钟指的是CPU时钟,也就是系统时钟。120MHZ,也就是说1s有120M的时钟,一个时钟也就是1/120 us,也就是周期是1/120 us。3个时钟,因为执行了3条指令。

    使用这种方式整理ms和us接口,在Keil和IAR环境下都测试通过。

    /*120Mhz时钟时,当ulCount为1时,函数耗时3个时钟,延时=3*1/120us=1/40us*/
    /*
    SystemCoreClock=120000000
    
    us级延时,延时n微秒
    SysCtlDelay(n*(SystemCoreClock/3000000));
    
    ms级延时,延时n毫秒
    SysCtlDelay(n*(SystemCoreClock/3000));
    
    m级延时,延时n秒
    SysCtlDelay(n*(SystemCoreClock/3));
    */
    
    #if defined   (__CC_ARM) /*!< ARM Compiler */
    __asm void
    SysCtlDelay(unsigned long ulCount)
    {
        subs    r0, #1;
        bne     SysCtlDelay;
        bx      lr;
    }
    #elif defined ( __ICCARM__ ) /*!< IAR Compiler */
    void
    SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
           "    bne.n   SysCtlDelay\n"
           "    bx      lr");
    }
    
    #elif defined (__GNUC__) /*!< GNU Compiler */
    void __attribute__((naked))
    SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
           "    bne     SysCtlDelay\n"
           "    bx      lr");
    }
    
    #elif defined  (__TASKING__) /*!< TASKING Compiler */                           
    /*无*/
    #endif /* __CC_ARM */

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/03-ASM

     

    备注:

    理论上:汇编方式的延时也是不准确的,有可能被其他中断打断,最好使用us和ms级别的延时,采用for循环延时的函数也是如此。采用定时器延时理论上也可能不准确的,定时器延时是准确的,但是可能在判断语句的时候,比如if语句,判断延时是否到了的时候,就在判断的时候,被中断打断执行其他代码,返回时已经过了一小段时间。不过汇编方式和定时器方式,只是理论上不准确,在实际项目中,这两种方式的精度已经足够高了。

     

    点击查看本文所在的专辑,STM32F207教程

     

    关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

    展开全文
  • Qt延时处理的四种方法

    万次阅读 多人点赞 2018-04-24 14:17:03
    有些时候,我们需要程序延时一会儿: 这里提供两种方法: 1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。Sleep不会释放对象锁,其他线程无法...

    有些时候,我们需要程序延时一会儿:

    这里提供四种方法:

    1、多线程程序使用QThread::sleep()或者QThread::msleep()QThread::usleep()QThread::wait()进行延时处理。Sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程;而Wait会释放对象锁,使得其他线程能够访问该对象。

    2、自定义延时函数:
    使用QEventLoop

    void Widget::Sleep(int msec)
    {
        QTime dieTime = QTime::currentTime().addMSecs(msec);
        while( QTime::currentTime() < dieTime )
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    }
    

    传入参数msec,使程序延时msec毫秒。这种方法不会阻塞当前线程,尤其适合Qt的单线程带UI程序,或者UI线程,因为线程阻塞时,很明显的现象就是UI卡死。当然,你也可以更改addMSecsaddSecs使程序延时msec秒。
    如果去掉QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 可以延时,但也会阻塞线程
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 使程序在while等待期间,去处理一下本线程的事件循环,处理事件循环最多100ms必须返回本语句,如果提前处理完毕,则立即返回这条语句。

    3、使用QElapsedTimer
    头文件:#include <QElapsedTimer>

    QElapsedTimer t;
    t.start();
    while(t.elapsed()<10000);
    

    上述代码使程序延时10S(10000MS),但是这种方法也会阻塞线程。

    4、 创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的
    这种方法不会阻塞线程

    void Delay_MSec(unsigned int msec)
    {
        QEventLoop loop;//定义一个新的事件循环
        QTimer::singleShot(msec, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
        loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
    }
    
    

    耗时代码的处理,参考:
    https://blog.csdn.net/qq_31073871/article/details/80472347

    展开全文
  • 什么是延时直播? 延时直播就是节目播出的时间,要比节目开始的时间有一定的延迟。延时的目的是为监播人员提供一定的监播时间,以防止不利于社会稳定和安全的画面及语言播出。国家广电总局规定,有群众参与的电视...

    什么是延时直播?

    延时直播就是节目播出的时间,要比节目开始的时间有一定的延迟。延时的目的是为监播人员提供一定的监播时间,以防止不利于社会稳定和安全的画面及语言播出。国家广电总局规定,有群众参与的电视节目必须延时播出20秒以上。延时直播绝非录播。录播是指播出前把整档节目按播出要求编辑录制,做成完整节目的播出带,按规定播出时间进行播放的方式。(摘自百度百科)

    一、配置延时直播

    在这里插入图片描述

    在这里插入图片描述

    一步一步配置RTMP推流

    二、播放对比

    • 播放正常的流
      播放正常流

    • 播放延时的流
      播放延时直播流

    • 播放对比
      左边是正常流,右边是延时流

    获取更多信息

    安防流媒体互联直播-QQ交流群:615081503

    国标GB28181无插件LiveGBS-QQ交流群:947137753

    WEB:https://www.liveqing.com

    展开全文
  • 惯性延时和传输延时

    2020-11-10 21:16:22
    固有延时也是惯性延时,是任何电子器件都存在的一种延时特性,主要物理机制是分布电容效应。 传输延时:与固有延时相比,其不同之处在于传输延时时表达的是输入与输出之间的一种绝对延时关系。传输延时并不考虑信号...

    固有延时也是惯性延时,是任何电子器件都存在的一种延时特性,主要物理机制是分布电容效应。 传输延时:与固有延时相比,其不同之处在于传输延时时表达的是输入与输出之间的一种绝对延时关系。传输延时并不考虑信号持续的时间,它仅表示信号传输推迟或延迟了一个时间段,这个时间段即为传输延时。

    展开全文
  • RC延时电路延时计算

    万次阅读 2018-07-31 17:44:01
    图一是最简单的RC延时电路,目的是延时点亮LED。R1给C1充电,等电容电压到达三极管基极导通电压大概0.7V时,三极管开通,LED点亮,二极管D1是让C1可以快速放电的作用。   延时时间 ,其中V1为电源电压,V0为...
  • 延时和相位延时

    万次阅读 2018-01-31 09:30:55
    翻译自wikipedia在信号处理中,群延时是信号通过设备各个分量正弦波幅度经历的延时,因此是各正弦波频率的函数。相位延时,与幅度的延时相对照是各分量正弦波相位经过设备的延时。当信号通过放大器,扬声器或者传输...
  • 最近要给一个在澳洲运营的赛马网站做在线直播,要求超低延时,并且支持手机和PC端直接播放,不安装任何播放插件。 由于这种业务的特殊性,直播延时必须在500ms以内才能接受,否则通过网络参与的游戏玩家会比现场...
  • 1、什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费 2、适用场景 (1)商城订单超时未支付,取消订单 (2)使用权限到期前十分钟提醒用户 (3)收益项目,...
  • 延时函数

    千次阅读 2020-03-08 21:53:40
    延时函数 什么是延时函数 所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。 为什么要延时 为了使CPU某些芯片的时序而采用的一些...
  • 延时队列

    千次阅读 2019-06-13 16:58:24
    延时队列,顾名思义是带有延时功能的消息队列,列举几个使用场景: 定时发公告 用户下单30分钟后未付款自动关闭订单 用户下单后延时短信提醒 延时关闭空闲客户端连接 ...... 延时队列实现方案: Java中的...
  • 网络延时

    2018-07-19 15:01:46
    概念 延时是从网络的一端到另一端的时间。  它是由以下几部分组成的:  传播延时:电磁波在信道中传播所需要的时间 ... 总延时=传输延时+发送延时+排队延时  往返延时:从发送端发送数据开始,到发送...
  • 软件延时

    千次阅读 2018-06-05 10:55:41
    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 今天主要介绍软件延时,关于硬件延时,之后...
  • stm32粗延时和精准延时函数

    千次阅读 2019-05-02 16:03:46
    1.stm32粗延时函数 粗延时的意思就是延时时间不太准确,一般用在对延时时间要求不严格的场合。这种延时方式是采用软件延时,但因为编译器会在编译的时候加上一些其他辅助指令,所以不能确定C程序的准确运行时间。...
  • 延时分析

    千次阅读 2017-01-20 10:13:43
    FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;绝对延时是指每隔指定的时间,执行一...
  • iOS延时和取消延时

    2016-07-19 10:21:20
    延时方法: [self performSelector:@selector(timeOutHandleAction) withObject:nil afterDelay:10]; 在10s内取消延时的方法: [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(t
  • vue设置延时

    万次阅读 2019-06-05 15:47:13
    参考资料:... 一定要创建一个timer,然后调用延时之前先清除timer的延时 clearTimeout(this.timer); //清除延迟执行 this.timer = setTimeout(()=>{ //设置延迟执行 console.log('ok'); }...
  • 使用ffplay播放视频源时,rtsp/rtmp等,会有一定的延时,这里我们可以通过设置ffplay播放参数将延时控制到最小。 ffplay.exe -i rtmp://xxxxxxx -fflags nobuffer 减少缓冲 也可以减少分析码流的时间 ffplay.exe...
  • 本文是异步编程的延时策略篇章,在Flutter中实现延时操作有两种方式,一种是通过Future,另一种是通过Timer。
  • 非阻塞延时: void GreenPass3::delaymsec(int msec) {  QTime dieTime = QTime::currentTime().addMSecs(msec);  while( QTime::currentTime()  QCoreApplication::processEvents(QEventLoop::AllEv
  • Flutter 延时执行

    万次阅读 2019-09-03 19:24:03
    // 延时1s执行返回 Future.delayed(Duration(seconds: 1), (){ Navigator.of(context).pop(); });
  • 数字电路延时

    千次阅读 2020-03-29 14:44:58
    应该深入理解为什么一个电路具有延时以及如何修改这个电路以改善延时。设计者还必须有一些简单的模型能用手工快速估算性能并能理解为什么某些电路比另一些好。EDA工具能够精确快速的估算复杂的延时模型,所以逻辑...
  • STM32延时函数的三种方法:普通延时、SysTick 定时器延时(1.中断方式;2.非中断方式)   单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 (1)...
  • rocketmq延时队列gitup 详细文档待续…
  • 这四种触点开关分别是延时闭合的动合触点、延时断开的动断触点、延时闭合动的断触点和延时断开的动合触点。
  • FreeRTOS任务延时函数

    千次阅读 2019-03-01 00:04:33
    系统提供了两个任务延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil() 相对延时是指:vTaskDelay()开始执行到退出执行的时间固定 /* 相对延时函数 */ void vTaskDelay(const TickType_t ...
  • 1 阻塞型延时 阻塞的原理就是:在延时期间,本线程的事件循环得不到执行。(1)QThread类的sleep() 最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n),这几个函数的不良后果就是,GUI会在延时的...
  • 延时电路分析

    千次阅读 2020-03-07 10:51:39
    延时电路经常会用到,RC电路是比较简单的电路。在电路设计中经常会用到将电阻和电容正极连接,电阻另一端接上电源,电容负极接地。 简单的延时电路 上面就是延时的电路图了,延时的时间为T=-ln((VCC-Vout)/VCC)RC,...
  • 延时函数介绍

    千次阅读 2021-02-05 16:47:03
    在操作系统中和单片机处理延时方式就完全不一样了,不可能是使用for循环浪费系统资源。而是有专门的接口函数。 基本介绍 Linux 中常用的函数有以下函数 sleep、usleep、ndelay、udelay、mdelay 等 Linux 系统编程下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,838
精华内容 19,935
关键字:

延时