STM32中通过普通延时函数来精确延时

在STM32中处处会用到延时函数,一般而言,对于普通的控制延时,并不会要求特别精确,所以可以使用普通的延时函数,例如

  1. void delay(u32 time)
  2. {
  3. while(time--);
  4. }
但是在某些情况下,例如读取传感器数据,就 需要精确的延时,对于这种,这时候可以考虑使用软件定时器或者系统定时器进行精确定时延时。在这篇博文中不在详细对这两种进行描述。

本文主要是针对某些情况下,使用系统滴答定时器或者软件定时器对工程造成阻塞影响或者定时器用作其他用途,不够使用的情况下的另一种解决方法。

因此本文主要是解决通过普通延时函数实现精确的定时。
博主测试的开发板芯片是STM32f103c8t6,外部晶振是8M,系统使用经过倍频至72M,编译器选择的Keil5,使用的是库函数开发。通过普通延时函数来实现读取温湿度传感器DHT11的数据,由于使用的freeRTOS操作系统,同时各个软件定时器用作其他用途。。。理由不再赘述。

刚开始,通过使用__NOP()函数,因为使用了8M晶振9倍频,72MHz,所以一个nop约等于1/72us,所以使用72个nop函数为一个us,然后根据需要的定时时间进行计算。

  1. void delay_us(u32 nTimer)
  2. {
  3. u32 i=0;
  4. for(i=0;i<nTimer;i++){
  5. __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
  6. __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
  7. __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
  8. __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
  9. __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
  10. }
  11. }
  1. void delay_ms(u32 nTimer)
  2. {
  3. u32 i=1000*nTimer;
  4. delay_us(i);
  5. }

之后通过测试读取传感器数据,得到了数据,证明该延时函数相对比较准确,但是由于博主身边并没有逻辑分析仪或示波器,所以不能对其延时时间进行精确测试。

第二种延时方法是在电子发烧友论坛看到版主通过逻辑分析仪对另一种普通延时进行的精确测试。同样可以实现读取数据。具体延时函数如下所示:

  1. void delay_us(u32 time)
  2. {
  3. u32 i=8*time;
  4. while(i--);
  5. }

本图高清图片点击打开链接

  1. void delay_ms(u32 time)
  2. {
  3. u32 i=8000*time;
  4. while(i--);
  5. }

本图高清图片 点击打开链接

更过信息见电子发烧友(bbs.elecfans.com/forum.php?mod=viewthread&tid=428925)




posted @ 2023-07-21 08:33  SymPny  阅读(118)  评论(0编辑  收藏  举报