琐碎代码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; //清空计数器 }
注意:延时有最大事件限制,具体使用根据实际系统
今天的文章常用延时(睡眠)函数分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/56260.html