什么是延时函数?它如何工作?
- 行业动态
- 2024-12-08
- 4740
延时函数是一种编程工具,用于在代码执行时创建时间间隔或暂停。
延时函数是编程中常用的一种功能,用于在程序执行过程中暂停一段时间,它广泛应用于各种场景,如控制LED闪烁频率、实现定时任务等,下面将详细介绍几种常见的延时函数及其实现方式。
一、循环延时
循环延时是最简单也是最早接触的延时方法,其基本原理是通过让单片机做一些无关紧要的工作来打发时间,通常使用for或while循环来实现,这种方法简单易行,但精度较低,且会消耗CPU资源,以下是一个简单的微秒级和毫秒级延时函数示例:
void delay_us(uint32_t delay_us) { volatile unsigned int num; for (num = 0; num < delay_us; num++) { volatile unsigned int t; for (t = 0; t < 11; t++); } } void delay_ms(uint16_t delay_ms) { volatile unsigned int num; for (num = 0; num < delay_ms; num++) { delay_us(1000); } }
二、定时器中断延时
定时器中断延时利用了定时器的高精度特性,通过配置定时器中断来实现精确延时,这种方式虽然精度高,但频繁的中断可能会影响系统性能,特别是在其他中断中调用此延时函数时,以下是基于STM32 SysTick定时器的实现示例:
// 初始化SysTick定时器为1ms中断一次 RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); // 延时函数 void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } // SysTick中断服务函数 void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } }
三、查询定时器延时
为了解决定时器频繁中断的问题,可以采用查询定时器的方式来实现延时,这种方式既能保证精度,又能避免频繁中断,以下是基于STM32 SysTick定时器的查询实现示例:
void delay_us(u32 nus) { u32 temp; SysTick->LOAD = 9 * nus; SysTick->VAL = 0X00; //清空计数器 SysTick->CTRL = 0X01; //使能,减到零无动作,采用外部时钟源 do { temp = SysTick->CTRL; //读取当前倒计数值 } while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达 SysTick->CTRL = 0x00; //关闭计数器 SysTick->VAL = 0X00; //清空计数器 } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD = 9000 * nms; SysTick->VAL = 0X00; //清空计数器 SysTick->CTRL = 0X01; //使能,减到零无动作,采用外部时钟源 do { temp = SysTick->CTRL; //读取当前倒计数值 } while((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达 SysTick->CTRL = 0x00; //关闭计数器 SysTick->VAL = 0X00; //清空计数器 }
四、操作系统提供的延时函数
在有操作系统的环境中,可以直接使用操作系统提供的延时函数,如Windows平台的Sleep函数和POSIX兼容系统的usleep、nanosleep函数,这些函数提供了更高层次的延时控制,使用方便且精度较高,以下是usleep函数的示例:
#include <unistd.h> // for usleep function #include <stdio.h> int main() { printf("Starting delay... "); usleep(1000000); //延时1000000微秒(1秒) printf("Delay ended "); return 0; }
延时函数在编程中扮演着重要角色,不同的延时方法适用于不同的应用场景,循环延时简单易行但精度较低;定时器中断延时精度高但可能影响系统性能;查询定时器延时结合了两者优点;操作系统提供的延时函数则更加方便和高效,在选择延时方法时,需要根据具体需求进行权衡。
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:https://www.xixizhuji.com/fuzhu/365304.html