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链表解题模板
    c++中的new、operator new、placement new
    树的前序、中序、后续、层次遍历的递归和非递归解法
    c++Volatile关键词
    南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
    c++右值引用以及使用
    c++选择重载函数
    从4行代码看右值引用
    被遗忘的C结构体打包技术
    南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
  • 原文地址:https://www.cnblogs.com/longxi/p/12804819.html
Copyright © 2011-2022 走看看