您的位置:首页 > 其它

STM32 SysTick定时器做延时函数

2016-10-12 08:15 330 查看
在STM32中延时函数用的非常广泛,具体延时函数怎么使用,下面我们来进行想详解,本文主要介绍采用SysTick计时器来实验系统延时:

原理介绍:

SysTick计时器是一个24位的倒计数定时器,主要用来做操作系统的定时器,每来一个时钟周期计数减1,当计数到0时,他就会自动从LOAD寄存器中自动重装设置的初值,操作时只要不把CTRL寄存器中的ENABLE位清0,它就永远不会停止,即使在睡眠状态他也还是在继续奋斗。

配置代码如下:

static u8 fac_us=0;//us延时倍乘数

static u16 fac_ms=0;//ms延时倍乘数

//初始化延迟函数

//SYSTICK的时钟固定为HCLK时钟的1/8

//SYSCLK:系统时钟

void delay_init(u8 SYSCLK)

{

SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8

fac_us=SYSCLK/8;

fac_ms=(u16)fac_us*1000;

}

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器,所以,最大延时为:

//nms<=0xffffff*8*1000/SYSCLK

//SYSCLK单位为Hz,nms单位为ms

//对72M条件下,nms<=1864

void delay_ms(u16 nms)

{

u32 temp;

SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

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

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

do

{

temp=SysTick->CTRL;

}

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

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

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

}

//延时nus

//nus为要延时的us数.

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

}

(1)、SysTick->CTRL&=0xfffffffb;选择外部时钟源(PLLCLK)作为系统时钟来源,AHB不分频,之后AHB进行8分频后送到内核,作为STCLK时钟,时钟频率为72/8=9Mhz。







(2)、fac_us=SYSCLK/8; 延时一个us秒需要装入定时器的值,SysTick频率为9mhz,1us时间内,定时器会减9,所以定时1us,装入值为9。

(3)、fac_ms=(u16)fac_us*1000;延时ms秒,直接在us秒基础上乘以1000。

(4)、SysTick->LOAD=(u32)nms*fac_ms;设置延时x nms装入得初值。

(5)、SysTick->VAL =0x00; 清零,进行自动重装

(6)、SysTick->VAL =0X00; 开启定时器

(7)、 do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));不断查询,定时到了硬件置位。

(8)、 SysTick->CTRL=0x00; 时间到了关闭定时器

(9)、 SysTick->VAL =0X00;清空计数器

(10)、延时us函数也是一样的。

(10)、注意LOAD寄存器是24bit寄存器,最大填入数值为2^24,超过了会溢出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: