九、SysTick系统定时器

一、操作步骤

(一)SYSTick定时器介绍

SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。

(二)SYSTick定时器寄存器

1、CTRL寄存器
CTRL是SysTick定时器的控制及状态寄存器。其相应位功能如下:

2、LODA寄存器

LOAD是SYSTick定时器的重装载数值寄存器。其相应位功能如下:

3、VAL寄存器
VAL是SysTick定时器的当前数值寄存器。其相应位功能如下:

4、CALIB寄存器(用得少)
CALIB是SysTick定时器的校准数值寄存器。其相应位功能如下:

(三)SYSTick定时器配置步骤

SysTick定时器的操作可以分为4步:

1、设置SysTick定时器的时钟源,系统时钟(72M)还是外部时钟(9M=系统时钟8分频),配置CTRL寄存器的CLKSOURCE数值

2、设置SysTick定时器的重装初始值(如果要使用中断的话,就将中断使能打开),LODA寄存器和CTRL寄存器的TICKINT数值

3、清零SysTick定时器当前计数器的值,VAL寄存器

4、打开SysTick定时器,CTRL寄存器的ENABLE数值

二、延时函数

为了实现定时器的功能,自己需要编写几个函数

首先定义两个全局变量

static u8 fac_us=0;//一微秒需要的计时次数
static u16 fac_ms=0;//一毫秒需要的计时次数

(一)定时器系统初始化函数SYSTick_Init()

//SYSCLK为系统时钟,默认为72
void SysTick_Init(u8 SYSCLK)
{
	//设置SYSTick定时器的时钟源为系统时钟的八分频即9MHz
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
	
	//每计数一次所需时间为1/SYSTICK
	//1us需要的次数为SYSCLK/8=9次
	fac_us=SYSCLK/8;
	//1us*1000=1ms
	fac_ms=(u16)fac_us*1000;
}

若出现Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (referred from systick.o).错误,查看2.error:Error: L6218E: Undefined symbol SysTick_CLKSourceConfig_并不傻的袍子-CSDN博客

(二)延时1us函数delay_us()

//微秒定时器函数
//由于LOAD寄存器限制,一次最多延时1864000u s
void delay_us(u32 nus)
{
	u32 temp;
	//LODA寄存器为24位,注意最大值
	SysTick->LOAD=nus*fac_us;//时间加载,重装载初值
	SysTick->VAL=0x00;//清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
	//等待时间到达
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
	SysTick->VAL=0X00;//清空计数器
}

(三)延时1ms函数delay_ms()

//毫秒定时器函数
//由于LOAD寄存器限制,一次最多延时1864ms
void delay_ms(u32 nms)
{
	u32 temp;
	//LODA寄存器为24位,最大值不能超过16777215(10进制)
	SysTick->LOAD=(u32)nms*fac_ms;//时间加载,重装载初值
	SysTick->VAL=0x00;//清空计数器
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//定时器使能置1,开始倒数
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));//判断CTRL寄存器的ENABLE和COUNTFLAG的值
	//等待时间到达
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭计数器,置0
	SysTick->VAL=0X00;//清空计数器
}

猜你喜欢

转载自blog.csdn.net/qq_40836442/article/details/110231860