专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
单片机延时函数实现
2019-04-15 17:37
发布
生成海报
站内文章
/
PIC单片机
11678
0
1285
在编写单片机程序时,我们经常要用到延时函数,记得我们在学51单片机时,第一个延时是通过软件延时来实现的,代码如下:
void delay(volatile uint32_t cnt){ volatile uint32_t i = 0; volatile uint32_t j = 0; for(i = 0;i
软件延时的优点是方便,然而却不能提供很精确的延时,而且占用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会使函数跑死。当然这个延时函数也是阻塞式的。
Ta的文章
更多
>>
AD元器件向导的封装类型
0 个评论
单片机延时函数实现
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮