STM32中通过普通延时函数来精确延时
2017-03-05 15:13
190 查看
在STM32中处处会用到延时函数,一般而言,对于普通的控制延时,并不会要求特别精确,所以可以使用普通的延时函数,例如
本文主要是针对某些情况下,使用系统滴答定时器或者软件定时器对工程造成阻塞影响或者定时器用作其他用途,不够使用的情况下的另一种解决方法。
因此本文主要是解决通过普通延时函数实现精确的定时。
博主测试的开发板芯片是STM32f103c8t6,外部晶振是8M,系统使用经过倍频至72M,编译器选择的Keil5,使用的是库函数开发。通过普通延时函数来实现读取温湿度传感器DHT11的数据,由于使用的freeRTOS操作系统,同时各个软件定时器用作其他用途。。。理由不再赘述。
刚开始,通过使用__NOP()函数,因为使用了8M晶振9倍频,72MHz,所以一个nop约等于1/72us,所以使用72个nop函数为一个us,然后根据需要的定时时间进行计算。
void delay_us(u32 nTimer)
{
u32 i=0;
for(i=0;i<nTimer;i++){
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
之后通过测试读取传感器数据,得到了数据,证明该延时函数相对比较准确,但是由于博主身边并没有逻辑分析仪或示波器,所以不能对其延时时间进行精确测试。
第二种延时方法是在电子发烧友论坛看到版主通过逻辑分析仪对另一种普通延时进行的精确测试。同样可以实现读取数据。具体延时函数如下所示:
本图高清图片点击打开链接
本图高清图片点击打开链接
更过信息见电子发烧友(bbs.elecfans.com/forum.php?mod=viewthread&tid=428925)
void delay(u32 time) { while(time--); }但是在某些情况下,例如读取传感器数据,就需要精确的延时,对于这种,这时候可以考虑使用软件定时器或者系统定时器进行精确定时延时。在这篇博文中不在详细对这两种进行描述。
本文主要是针对某些情况下,使用系统滴答定时器或者软件定时器对工程造成阻塞影响或者定时器用作其他用途,不够使用的情况下的另一种解决方法。
因此本文主要是解决通过普通延时函数实现精确的定时。
博主测试的开发板芯片是STM32f103c8t6,外部晶振是8M,系统使用经过倍频至72M,编译器选择的Keil5,使用的是库函数开发。通过普通延时函数来实现读取温湿度传感器DHT11的数据,由于使用的freeRTOS操作系统,同时各个软件定时器用作其他用途。。。理由不再赘述。
刚开始,通过使用__NOP()函数,因为使用了8M晶振9倍频,72MHz,所以一个nop约等于1/72us,所以使用72个nop函数为一个us,然后根据需要的定时时间进行计算。
void delay_us(u32 nTimer)
{
u32 i=0;
for(i=0;i<nTimer;i++){
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
void delay_ms(u32 nTimer) { u32 i=1000*nTimer; delay_us(i); }
之后通过测试读取传感器数据,得到了数据,证明该延时函数相对比较准确,但是由于博主身边并没有逻辑分析仪或示波器,所以不能对其延时时间进行精确测试。
第二种延时方法是在电子发烧友论坛看到版主通过逻辑分析仪对另一种普通延时进行的精确测试。同样可以实现读取数据。具体延时函数如下所示:
void delay_us(u32 time) { u32 i=8*time; while(i--); }
本图高清图片点击打开链接
void delay_ms(u32 time) { u32 i=8000*time; while(i--); }
本图高清图片点击打开链接
更过信息见电子发烧友(bbs.elecfans.com/forum.php?mod=viewthread&tid=428925)
相关文章推荐
- 23、STM32 上系统精确延时与获取 micro 时间函数的实现(FreeRTOS 中也能移植)
- 利用STM32的SysTick设计精确延时函数
- SQLserver不是可以识别的内置函数名称"的错误,通过set statistics time on能得到SQL语句的执行时间精确到毫秒.
- STM32用定时器精确延时的方法
- stm32使用systick精确延时
- STM32的精确延时
- STC51系列ms级较精确的长延时函数
- DOS下面关于精确延时1ms的函数(理论上可以非常精确延时到10微妙级别)
- 51单片机非精确延时函数
- Android 如何通过代码模拟按钮点击 延时函数
- STM32学习笔记——利用通用定时器TIM2进行精确延时
- UCOS 的延时函数OSTimeDlyHMSM()实现精确延时
- 怎样编写精确的延时函数
- STM32精确延时(非中断,非ST库函数)
- 通过软件忙等进行精确延时的实现
- STM32精确延时
- IAR FOR STM8精确延时函数
- STM32菜鸟之初始化函数以及延时函数
- STM32延时函数的三种方法——最好掌握第三种
- 51单片机非精确延时函数