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; //清空计数器
    }        

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

  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/longxi/p/12804819.html
Copyright © 2011-2022 走看看