stm32_延时方式

0 前言

STM32延时函数的四种方法
在嵌入式开发中,设计通讯的时候,经常需要延时函数,但往往不清楚该选择哪种延时方法。

1 延时简介

延时函数的两种常用名称是sleep和delay。一般在上位机多见sleep,单片机常用delay。那么sleep和delay的意义有何区别?
sleep意为睡眠,即线程挂起,由定时器重新唤醒线程。sleep作用期间,该线程不占用CPU资源。
delay意为延迟,即线程等待,由线程自身进行循环查询,在设定时间之后退出循环。delay作用期间,该线程占用CPU资源。

2 常见延时分类

单片机编程中经常使用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。

2.1 普通延时 delay

此种延时经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。
该延时方法的设计与单片机的频率相关,同时会阻塞CPU。


//毫秒级的延时
void delay_ms(uint16_t delay_ms)
{    
  volatile unsigned int num;
  for (num = 0; num < delay_ms; num++)
  {
    delay_us(1000);
  }
}
//微秒级的延时
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--;
    }
  }
}

2.2 定时器中断延时 delay

此种方法通过配置定时器中断,在指定时间内进入一次中断,然后间接判断进入中断的次数以达到精确延时的目的。
该方法可以保证较高的精度,但系统一直在中断,不利于在其它中断中调用此延时函数,不适合应用于某些高精度的应用场景。

2.3 定时器查询延时 delay

此种方法使用定时器(如SysTick 定时器),但是不使能中断,使用查询的方式去延时,这样既能解决频繁中断问题,又能保证精度。 同样会堵塞CPU

2.4 汇编指令延时 delay

此种方法应用在系统硬件资源紧张,或者没有额外的定时器提供,又不想方法1的普通延时,可以使用汇编指令的方式进行延时,不会被编译优化且延时准确。

2.5 RTOS的任务延时

该种延时方法采用freeRTOS下的Tick中断驱动 和列表管理实现任务时序管理。延时时间取决于RTOS的tick周期。相对于任务而言,它是一个非阻塞延时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值