滴答定时器的计数模式_SysTick(系统滴答定时器)

STM32的SysTick定时器是一个24位的倒计数定时器,常用于精确延时和实时系统的心跳时钟。它在系统核心时钟下工作,即使在睡眠模式下也能保持运行。初始化SysTick定时器后,通过配置其控制寄存器并设置适当的中断周期,可以实现中断驱动的延时功能。在中断服务函数中递减计数器,直到计数为0时中断停止,达到延时效果。
摘要由CSDN通过智能技术生成

一.SysTick概述

Systick定时器是一个24 位的倒计数定时器,计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

Systick定时器一般用来做精确的延时,或者在实时系统中充当心跳时钟,这样就大大节省了定时器资源,不必浪费一个单独的定时器。

Systick定时器旳时钟来源可以是内核时钟FCLK或AHB总线时钟HCLK。

Systick定时器可以产生Systick中断,中断号为15。

使用步骤:

1.初始化

void SysTick_Init(void)

{

if(SysTick_Config(SystemCoreClock/100000))

{

while(1)

;

}

SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

}

函数描述:调用函数SysTick_Config(),相当于打开了系统滴答时钟和滴答中断,传入的参数的含义是产生一个滴答中断所经过的系统时钟周期数,函数返回值为0表示系统滴答时钟设置成功,返回值为1表示系统滴答时钟设置失败(以上函数中,若设置失败则进入死循环)。紧接着直接操作寄存器关闭系统滴答时钟,后面用到的时候再打开。

2.调用

下面以一个简单的延时函数为例解析一下系统滴答时钟的应用。

首先定义一个全局变量:

static __IO u32 TimingDelay;

延时函数如下:

void delay_us(__IO u32 nTime)

{

TimingDelay=nTime;

SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;

while(TimingDelay!=0)

;

}

中断函数如下:

void TimingDelay_Decrement(void)

{

if(TimingDelay!=0x00)

{

TimingDelay--;

}

}

其中中断函数需要在文件stm32f10x_it.c的开头进行声明[extern void TimingDelay_Decrement(void);],并在文件stm32f10x_it.c的void SysTick_Handler(void)函数里面进行调用。

函数描述:每次调用延时函数,传入参数的值传给一个全局变量TimingDelay,并且延时函数将立即开启系统滴答时钟,在TimingDelay不等于0的情况下陷入死循环。与此同时,系统滴答时钟是由内核控制的,每产生一次滴答中断,内核便会自动执行中断函数,令TimingDelay减1,直至TimingDelay减为0,不再执行中断程序,也即刻跳出延时函数的死循环,回到原来调用延时函数的代码的下一行继续执行其它代码,从而实现了延时的功能。

二.寄存器概述

STK_CTRL

STK_VAL

STK_LOAD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值