SysTick 简介
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
函数 Delay_us() 中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时间到。变量TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间 TimingDelay 递减一次。
TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时的时间等于100000*10us=1s。
//main.c使用HAL_Delay
/* 系统时钟初始化成72MHz */
SystemClock_Config();
SysTick_Init();
HAL_Delay(1000); // 1000 * 1ms = 1000ms
void SysTick_Init(void)
{
if (HAL_SYSTICK_Config(SystemCoreClock / 1000)) //SystemCoreClock=72M
{ while (1);}
}
//main.c使用Delay_us
/* 系统时钟初始化成72MHz */
SystemClock_Config();
SysTick_Init();
Delay_us(100000); // 10000 * 10us = 1000ms
//SysTick.c
#define Delay_ms(x) Delay_us(100*x)
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
if (HAL_SYSTICK_Config(SystemCoreClock / 1000))
{ while (1);}
}
void Delay_us(__IO u32 nTime)
{ TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{ if (TimingDelay != 0x00)
{ TimingDelay--; }
}
//中断
void SysTick_Handler(void)
{ HAL_IncTick(); }//调用TimingDelay_Decrement