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周期。相对于任务而言,它是一个非阻塞延时。