这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STM32配置Systick做精确延时

共8条 1/1 1 跳转至

STM32配置Systick做精确延时

高工
2013-09-30 17:09:30     打赏

利用系统滴答定时器来实现精确延时,需要以下五步:

1、设置滴答定时器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一,若系统时钟为72M,则滴答定时器时钟为9M。即定时一秒需要9M个时钟周期。

2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。如:若需要延时20微秒,则重装载值为20*9.若要延时20毫秒,则设置重装载值为20*9000.

3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从设定值开始倒数计时。

4、设置滴答定时器的控制寄存器,开始倒计数。

5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前值。


void delay_init(u8 SYSCLK)

{

   SysTick->CTRL&=0xfffffffb;//控制寄存器,选择外部时钟即系统时钟的八分之一(HCLK/8;72M/8=9M)

   fac_us=SYSCLK/8;    //定义全局变量,即延时一微秒所需的的时钟周期数(72/8=9,单位为微妙)

   fac_ms=(u16)fac_us*1000; //一毫秒所需的时钟周期数(9000)

}

void Delay_us(u32 nus)

{

  u32 temp;    

  SysTick->LOAD=nus*fac_us; //时间加载(即延时多少个时钟周期)  

  SysTick->VAL=0x00;        //清空计数器

  SysTick->CTRL=0x01 ;      //开始倒数

do

{

  temp=SysTick->CTRL;

}

  while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  

  SysTick->CTRL=0x00;       //关闭计数器

  SysTick->VAL =0X00;       //清空计数器

}

相关寄存器的介绍参看Cortex_M3权威指南第五章内容。




关键词: Systick          延时函数    

高工
2013-09-30 18:18:30     打赏
2楼
嘻嘻,好详细的说。建议楼主把延时函数延时的时间范围写出来就更好了。因为我觉得有必要标出滴答定时器是24位定时器

高工
2013-09-30 18:24:02     打赏
3楼
恩,言之有理,多谢补充

院士
2013-09-30 20:36:23     打赏
4楼
学习了,谢谢楼主。

院士
2013-09-30 21:32:31     打赏
5楼

使用这个函数还是专享给嵌入式实时操作系统吧!

现在越来越多的应用都需要操作系统上了。


高工
2013-09-30 22:20:02     打赏
6楼
YES,用系统来搞省时省力还省心

院士
2013-10-01 09:00:15     打赏
7楼
版主 谦虚了……

高工
2013-10-01 13:03:55     打赏
8楼

补个相关寄存器的图:


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]