新闻中心

EEPW首页>嵌入式系统>设计应用> 基于stm32的精确延时利用系统滴答systick

基于stm32的精确延时利用系统滴答systick

作者: 时间:2016-11-27 来源:网络 收藏
利用系统滴答定时器来实现精确延时,需要以下五步:

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

本文引用地址://m.amcfsurvey.com/article/201611/322267.htm

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;//清空计数器

}

或者

void Delay_us(u32 Nus)

{

SysTick->LOAD=Nus*9;//时间加载72M主频

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

while(!(SysTick->CTRL&(1<<16))); //等待时间到达

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

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

}



评论


技术专区

关闭