打印
[其他ST产品]

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

[复制链接]
636|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

  • void delay(u32 time)
    {
      while(time--);
    }
      



使用特权

评论回复
沙发
而服务器人|  楼主 | 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,然后根据需要的定时时间进行计算。

使用特权

评论回复
5
而服务器人|  楼主 | 2022-7-28 23:36 | 只看该作者
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();
        }
}

使用特权

评论回复
6
而服务器人|  楼主 | 2022-7-28 23:37 | 只看该作者
void delay_ms(u32 nTimer)
{
        u32 i=1000*nTimer;
        delay_us(i);
}

使用特权

评论回复
7
而服务器人|  楼主 | 2022-7-28 23:38 | 只看该作者
之后通过测试读取传感器数据,得到了数据,证明该延时函数相对比较准确,但是由于博主身边并没有逻辑分析仪或示波器,所以不能对其延时时间进行精确测试。

使用特权

评论回复
8
而服务器人|  楼主 | 2022-7-28 23:39 | 只看该作者
第二种延时方法是在电子发烧友论坛看到版主通过逻辑分析仪对另一种普通延时进行的精确测试。同样可以实现读取数据。具体延时函数如下所示:

使用特权

评论回复
9
而服务器人|  楼主 | 2022-7-28 23:40 | 只看该作者
void delay_us(u32 time)
{
  u32 i=8*time;
  while(i--);
}

使用特权

评论回复
10
而服务器人|  楼主 | 2022-7-28 23:40 | 只看该作者

使用特权

评论回复
11
而服务器人|  楼主 | 2022-7-28 23:45 | 只看该作者
void delay_ms(u32 time)
{
  u32 i=8000*time;
  while(i--);
}

使用特权

评论回复
12
而服务器人|  楼主 | 2022-7-28 23:48 | 只看该作者

使用特权

评论回复
13
稳稳の幸福| | 2022-7-29 11:20 | 只看该作者
长见识了

使用特权

评论回复
14
Uriah| | 2022-10-4 08:30 | 只看该作者

编程器定位插字节

使用特权

评论回复
15
lzbf| | 2022-10-18 10:49 | 只看该作者
stm32中Delay()函数延时的时间是怎么计算的

使用特权

评论回复
16
gygp| | 2022-10-18 11:02 | 只看该作者
怎么弄微秒us的延时函数         

使用特权

评论回复
17
abotomson| | 2022-10-18 11:29 | 只看该作者
通用定时器1s延迟如何实现      

使用特权

评论回复
18
jackcat| | 2022-10-18 12:10 | 只看该作者
如何设置10ns的延时        

使用特权

评论回复
19
uiint| | 2022-10-18 13:52 | 只看该作者
STM32使用SysTick实现的延时函数结果居然不对?

使用特权

评论回复
20
mikewalpole| | 2022-10-18 14:47 | 只看该作者
想用软件for语言实现延时20ms

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

204

帖子

0

粉丝