常用延时(睡眠)函数
Posted longxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用延时(睡眠)函数相关的知识,希望对你有一定的参考价值。
琐碎代码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; int tick = 10000; for(step = 0; step < t ; step ++) { 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; //清空计数器 }
注意:延时有最大事件限制,具体使用根据实际系统
以上是关于常用延时(睡眠)函数的主要内容,如果未能解决你的问题,请参考以下文章