一、什么是SysTick定时器
SysTick定时器,又名系统滴答定时器。使用内核的SysTick定时器来实现延时,可以不占用其他定时器,节省资源
SysTick定时器是一个24位递减计数器,每个时钟周期减1,当减到0时,会自动重载定时初值,开始新一轮计数。通过设置这个定时初值,就可以实现得到指定时间。如下图所示,y为定时器初值,然后随着时间增加,值逐渐减小,直至为0,再重新加载初值,如此往复,x1、x2、x3这些时间段,就是我们需要的延时时间。
二、SysTick的组成
SysTick包含四个寄存器,都是24位寄存器
[0]:ENABLE 使能位 0=关闭systick功能,1=开启systick功能
[1]:TICKINT 中断使能位 0=关闭systick中断,1=开启systick中断
[2]:CLKSOURCE 时钟源选择位 0=使用HCLK/8时钟源 1=使用HCLK时钟源
[16]:COUNTFLAG 计数比较标志,如果计数器达到0,则读入为1;当读取或清楚当前计数器值时,将自动清除为0;
三、SysTick定时的操作步骤
SysTick定时器的操作步骤有四步
1.设置systick定时器的时钟源
SysTick->CTRL &= ~(1 << 2); //bit[2] = 0,选择外部时钟源9MHZ
2.设置systick定时器的重载初始值
SysTick->LOAD = 延时时间;
3.清零systick定时器当前计数器的值
SysTick->VAL = 0x00;
4.打开systick定时器
SysTick->CTRL|=1;//bit[0]=1
四、SysTick的初始化
//Systick.h
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "stm32f10x.h"
#include "system.h"
#define SYSTICK (72)//指定SYSTICK定制其的频率为72MHz
extern void SysTick_Init(void);//初始化systick定时器
extern void delay_us(u32 nus);//延时多少毫秒
extern void delay_ms(u32 nms);//延时多少微秒
#endif
//Systick.c
#include "systick.h"
static u32 fac_us = 0;
static u32 fac_ms = 0;
void SysTick_Init(void){
//1.指定时钟源 - 9MHz
SysTick->CTRL &=~(1<<2);
//2.指定1us计数9次
fac_us = SYSTICK / 8;
//3.指定1ms计数9000次
fac_ms = fac_us * 1000;
}
//微秒延时
void delay_us(u32 nus){
u32 temp;
SysTick->LOAD = nus * fac_us;
SysTick->VAL = 0x00;
SysTick->CTRL |= (1<<0);
do{
temp=SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1<<16)));
//关闭systick定时器
SysTick->CTRL &= ~(1<<0);
//清空计数器
SysTick->VAL = 0x00;
}
//毫秒延时
void delay_ms(u32 nms){
u32 temp;
SysTick->LOAD = nms * fac_ms;
SysTick->VAL = 0x00;
SysTick->CTRL |= (1<<0);
do{
temp=SysTick->CTRL;
}while((temp & 0x01) && !(temp & (1<<16)));
SysTick->CTRL &= ~(1<<0);
SysTick->VAL = 0x00;
}