一、SysTick 简介
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳
SysTick 寄存器汇总
SysTick 控制及状态寄存器
SysTick 重装载数值寄存器
SysTick 当前数值寄存器
总结:
1、Systick 实现定时或者延时,可以采取“查询方式”或者“中断方式”,
2、使能Systick 由SysTick->CTRL 控制。
3、开启 Systick :SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
关闭 Systick :SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
注意 无论是哪种 都需要提前配置SysTick_Config()
// core_cm3.c
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
// * SystemFrequency / 1000 1ms中断一次
// * SystemFrequency / 100000 10us中断一次
// * SystemFrequency / 1000000 1us中断一次
// 默认SystemFrequency = 72MHz,因此 ticks = 72,1us 一次
ticks = 72000,1ms 一次
二、简单应用
一、查询方式,实现延时
//查询方式
void Dealy_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72); //1us
for(i=0; i<us; i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭Systick
}
void Dealy_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000); //1us
for(i=0; i<ms; i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//关闭Systick
}
二、中断方式实现延时
void Dealy_IT_us(uint32_t us)
{
SysTick_Config(72); //1us
nTime = us;
//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //打开
while(nTime);
}
void Dealy_IT_ms(uint32_t ms)
{
SysTick_Config(72000); //1us
nTime = ms;
//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //打开
while(nTime);
}
中断服务函数编写
void SysTick_Handler(void)
{
TimeDecrease();
}
其中
static uint32_t nTime = 0;
void TimeDecrease(void)
{
nTime--;
}
欢迎交流,有问题可以留言