单片机延时函数实现
2017-06-13 17:08
183 查看
在编写单片机程序时,我们经常要用到延时函数,记得我们在学51单片机时,第一个延时是通过软件延时来实现的,代码如下:
软件延时的优点是方便,然而却不能提供很精确的延时,而且占用CPU资源,下面的以STM32L1为例,采用定时器方式实现,可以提供很精确的延时。代码如下:
调用延时函数时,我们每次对定时器的溢出时间进行设置,我们以更新标志置位作为延时结束。注意上面函数的参数不能为1,如果为1会使函数跑死。当然这个延时函数也是阻塞式的。
void delay(volatile uint32_t cnt){ volatile uint32_t i = 0; volatile uint32_t j = 0; for(i = 0;i<cnt;i++) for(j = 0;j<1000;j++); }
软件延时的优点是方便,然而却不能提供很精确的延时,而且占用CPU资源,下面的以STM32L1为例,采用定时器方式实现,可以提供很精确的延时。代码如下:
/* CPU主频:32MHz Timer2_clk = 32MHz */ void Delay_Init(void) { /* TIM2 clock enable */ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE ); } void Delay_ms(uint16_t ms) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = ms - 1; TIM_TimeBaseStructure.TIM_Prescaler = 32000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*每当初始化计数器会使计数器更新,TIM_FLAG_Update被置位*/ TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure ); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_Cmd( TIM2, ENABLE ); while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == RESET); TIM_Cmd( TIM2, DISABLE ); } void Delay_us(uint16_t us) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = us - 1; TIM_TimeBaseStructure.TIM_Prescaler = 32 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure ); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_Cmd( TIM2, ENABLE ); while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == RESET); TIM_Cmd( TIM2, DISABLE ); }
调用延时函数时,我们每次对定时器的溢出时间进行设置,我们以更新标志置位作为延时结束。注意上面函数的参数不能为1,如果为1会使函数跑死。当然这个延时函数也是阻塞式的。
相关文章推荐
- UBOOT中的时间处理及延时函数的实现方法
- 单片机中C语言延时函数
- C或C++调用Windows系统函数 实现延时 或 获取当前时间的处理
- 51单片机非精确延时函数
- 51单片机非精确延时函数
- 利用KERNEL32 API函数实现的通用延时函数DELAY
- STM32 SysTick定时器常见问题及延时函数的实现
- 实时操作系统中实现自己的udelay延时函数
- 51单片机延时函数
- js关于setTimeout实现延时执行函数并进行传参
- 用C51编写单片机延时函数(转贴)
- 内核空间几种长延时函数实现策略的优劣讨论
- 令人头大的单片机延时----这里转一篇关于延时函数的文章看看
- 用SysTick值抓取法,实现DelayUS()的微妙延时函数
- 用C51编写单片机延时函数
- UBOOT中的时间处理及延时函数的实现方法
- delphi实现延时的方法,很多人首先就想到用timer控件,这里我们不用timer控delphi直接用settimer函数实现延时的方法
- 用汇编为单片机 延时1毫秒程序,使用子程序实现
- printf 函数的原理以及在单片机上重定向至LCD12832的实现
- EGL--延时函数实现文件 DELAY.INC