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

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

并不傻的狍子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值