[其他ST产品] STM32中通过普通延时函数来精确延时

[复制链接]
2521|46
 楼主| 而服务器人 发表于 2022-7-28 23:08 | 显示全部楼层 |阅读模式

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

    1. void delay(u32 time)
    2. {
    3.   while(time--);
    4. }
      



 楼主| 而服务器人 发表于 2022-7-28 23:18 | 显示全部楼层
但是在某些情况下,例如读取传感器数据,就 需要精确的延时,对于这种,这时候可以考虑使用软件定时器或者系统定时器进行精确定时延时。在这篇博文中不在详细对这两种进行描述。
本文主要是针对某些情况下,使用系统滴答定时器或者软件定时器对工程造成阻塞影响或者定时器用作其他用途,不够使用的情况下的另一种解决方法。

因此本文主要是解决通过普通延时函数实现精确的定时。
 楼主| 而服务器人 发表于 2022-7-28 23:23 | 显示全部楼层
博主测试的开发板芯片是STM32f103c8t6,外部晶振是8M,系统使用经过倍频至72M,编译器选择的Keil5,使用的是库函数开发。通过普通延时函数来实现读取温湿度传感器DHT11的数据,由于使用的freeRTOS操作系统,同时各个软件定时器用作其他用途。
 楼主| 而服务器人 发表于 2022-7-28 23:36 | 显示全部楼层
刚开始,通过使用__NOP()函数,因为使用了8M晶振9倍频,72MHz,所以一个nop约等于1/72us,所以使用72个nop函数为一个us,然后根据需要的定时时间进行计算。
 楼主| 而服务器人 发表于 2022-7-28 23:36 | 显示全部楼层
  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. }
 楼主| 而服务器人 发表于 2022-7-28 23:37 | 显示全部楼层
  1. void delay_ms(u32 nTimer)
  2. {
  3.         u32 i=1000*nTimer;
  4.         delay_us(i);
  5. }
 楼主| 而服务器人 发表于 2022-7-28 23:38 | 显示全部楼层
之后通过测试读取传感器数据,得到了数据,证明该延时函数相对比较准确,但是由于博主身边并没有逻辑分析仪或示波器,所以不能对其延时时间进行精确测试。
 楼主| 而服务器人 发表于 2022-7-28 23:39 | 显示全部楼层
第二种延时方法是在电子发烧友论坛看到版主通过逻辑分析仪对另一种普通延时进行的精确测试。同样可以实现读取数据。具体延时函数如下所示:
 楼主| 而服务器人 发表于 2022-7-28 23:40 | 显示全部楼层
  1. void delay_us(u32 time)
  2. {
  3.   u32 i=8*time;
  4.   while(i--);
  5. }
 楼主| 而服务器人 发表于 2022-7-28 23:40 | 显示全部楼层
 楼主| 而服务器人 发表于 2022-7-28 23:45 | 显示全部楼层
  1. void delay_ms(u32 time)
  2. {
  3.   u32 i=8000*time;
  4.   while(i--);
  5. }
 楼主| 而服务器人 发表于 2022-7-28 23:48 | 显示全部楼层
稳稳の幸福 发表于 2022-7-29 11:20 | 显示全部楼层
长见识了
Uriah 发表于 2022-10-4 08:30 | 显示全部楼层

编程器定位插字节
lzbf 发表于 2022-10-18 10:49 | 显示全部楼层
stm32中Delay()函数延时的时间是怎么计算的
gygp 发表于 2022-10-18 11:02 | 显示全部楼层
怎么弄微秒us的延时函数         
abotomson 发表于 2022-10-18 11:29 | 显示全部楼层
通用定时器1s延迟如何实现      
jackcat 发表于 2022-10-18 12:10 | 显示全部楼层
如何设置10ns的延时        
uiint 发表于 2022-10-18 13:52 | 显示全部楼层
STM32使用SysTick实现的延时函数结果居然不对?
mikewalpole 发表于 2022-10-18 14:47 | 显示全部楼层
想用软件for语言实现延时20ms
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

471

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部