单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于stm32f207介绍4种不同方式实现的延时函数。
普通延时
这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。
//微秒级的延时void delay_us(uint32_t delay_us){ volatile unsigned int num; volatile unsigned int t; for (num = 0; num < delay_us; num++) { t = 11; while (t != 0) { t--; } }}//毫秒级的延时void delay_ms(uint16_t delay_ms){ volatile unsigned int num; for (num = 0; num load = rcc_clocks.hclk_frequency/1000000/8*nus; systick- >val=0x00;//清空计数器 systick- >ctrl=0x01;//使能,减到零是无动作,采用外部时钟源 do { temp=systick- >ctrl;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1< ctrl=0x00; //关闭计数器 systick- >val =0x00; //清空计数器}void delay_ms(uint16_t nms){ uint32_t temp; systick- >load = rcc_clocks.hclk_frequency/1000/8*nms; systick- >val=0x00;//清空计数器 systick- >ctrl=0x01;//使能,减到零是无动作,采用外部时钟源 do { temp=systick- >ctrl;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1< ctrl=0x00; //关闭计数器 systick- >val =0x00; //清空计数器}汇编指令
如果系统硬件资源紧张,或者没有额外的定时器提供,又不想方法1的普通延时,可以使用汇编指令的方式进行延时,不会被编译优化且延时准确。
stm32f207在iar环境下
/*! * @brief 软件延时 * @param ulcount:延时时钟数 * @return none * @note ulcount每增加1,该函数增加3个时钟 */void sysctldelay(unsigned long ulcount){ __asm( subs r0, #1\\n bne.n sysctldelay\\n bx lr);}这3个时钟指的是cpu时钟,也就是系统时钟。120mhz,也就是说1s有120m的时钟,一个时钟也就是1/120us,也就是周期是1/120us。3个时钟,因为执行了3条指令。
使用这种方式整理ms和us接口,在keil和iar环境下都测试通过。
/*120mhz时钟时,当ulcount为1时,函数耗时3个时钟,延时=3*1/120us=1/40us*//*systemcoreclock=120000000us级延时,延时n微秒sysctldelay(n*(systemcoreclock/3000000));ms级延时,延时n毫秒sysctldelay(n*(systemcoreclock/3000));m级延时,延时n秒sysctldelay(n*(systemcoreclock/3));*/#if defined (__cc_arm) /*!< arm compiler */__asm voidsysctldelay(unsigned long ulcount){ subs r0, #1; bne sysctldelay; bx lr;}#elif defined ( __iccarm__ ) /*!< iar compiler */voidsysctldelay(unsigned long ulcount){ __asm( subs r0, #1\\n bne.n sysctldelay\\n bx lr);}#elif defined (__gnuc__) /*!< gnu compiler */void __attribute__((naked))sysctldelay(unsigned long ulcount){ __asm( subs r0, #1\\n bne sysctldelay\\n bx lr);}#elif defined (__tasking__) /*!< tasking compiler */ /*无*/#endif /* __cc_arm */
人体红外传感器电路
飞智Wee2T手机游戏手柄评测 确实提高了游戏效率
高光谱遥感和超低频电磁探测技术提高了油气勘探的工作效率
DIY奇才造巨型电容锂聚合物电池动力机器人
组建电波暗室应考虑哪些因素
基于STM32F207介绍4种不同方式实现的延时函数
Phorism with 12V
国芯思辰|灵敏度高达200mV/A的中科阿尔法电流传感器AH911应用于卷帘电机控制系统
“第三代半导体与微显示”2020第一届国星之光论坛举行
人工智能在机器学习应用代码示例解析
新思科技与IBM合作将AI计算性能提升1000倍
在企业中成功实施物联网的好处是什么
XL5300 TOF测距模组,可用于接近感应,人员经过检测,避障与防撞
定时开关怎么控制电机,该如何接线
埃夫特科创板IPO过会!埃夫特完成了产业垂直整合
AI芯片的战争已经打响 英伟达领头羊地位无法撼动
中国一家公司搞定了谷歌没搞定的AR眼镜
赛普拉斯宣布与海力士组建合资公司 致力于下一代NAND产品
基于HCSl2单片机和MC9S12DGl28B系列MCU实现智能车系统的设计
VR行业中炒作速度永远比发展速度快