zoukankan      html  css  js  c++  java
  • 常用延时(睡眠)函数

    琐碎代码1——延时函数

    ARM:

    delay:
        ldr r3, =100000
        ldr r4, =0x0
    delay_loop:    
        sub r3, r3, #1                //r3 = r3 -1
        cmp r3, r4                    // cmp会影响Z标志位,如果r4等于r3则Z=1,下一句中eq就会成立
        bne delay_loop
        mov pc, lr                    // 函数调用返回

    C/C++:

    void delay(unsigned int t)
    {
        unsigned int step = 0;
        for(step = 0; step < t ; step ++)
        {
        volatile int tick = 10000;
        while(tick) tick--;
      }
    }

    Qt:

    void CANThread::sleep(unsigned int msec)
    {
       QTime dieTime = QTime::currentTime().addMSecs(static_cast<int>(msec));
       while( QTime::currentTime() < dieTime )
           QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    }

    stm32中断型:

    volatile uint32_t time_delay; // 延时时间,注意定义为全局变量
    //延时n_ms
    void delay_ms(volatile uint32_t  nms)
    {
        //SYSTICK分频--1ms的系统时钟中断
        if (SysTick_Config(SystemFrequency/1000))
        {
            while (1);
        }
        time_delay=nms;//读取定时时间
        while(time_delay);
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
    //延时nus
    void delay_us(volatile unsigned long nus)
    {
     //SYSTICK分频--1us的系统时钟中断
        if (SysTick_Config(SystemFrequency/1000000))
        {
       
            while (1);
        }
        time_delay=nus;//读取定时时间
        while(time_delay);
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
     
        //在中断中将time_delay递减。实现延时
     
    void SysTick_Handler(void)
    {
        if(time_delay)
            time_delay--;
    }

      使用时注意传参的范围(uint32_t)。

    stm32非中断(使用cortex System timer)

      

    void delay_us(uint32_t nus)
    {
        uint32_t temp;
        SysTick->LOAD = 9*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 = 9000*nms;  //此处结合自己系统的时钟
        SysTick->VAL=0X00;//清空计数器
        SysTick->CTRL=0X01;//使能,
        do
        {
            temp=SysTick->CTRL;//读取当前倒计数值
        }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }        

      注意:延时有最大事件限制,具体使用根据实际系统

  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/longxi/p/12804819.html
Copyright © 2011-2022 走看看