SysTick实现监控开机时长
systick系统定时器,又叫滴答定时器。在我看来比TIM使用起来要简单。
在实现监控开机时长的例子中:配置定时器以相同的时间间隔进入中断,在中断不断累加计数变量,然后利用计数变量和时间间隔计算出相应的时长。
首先是对SysTick的配置,主要配置其进入中断的时长,一般来说SysTick使用的AHB时钟,计数计数器加一的时间为1/72000000s.在SysTick_Config()函数中参数为进入中断的计数。配置好后,计数器中的数值即为配置的数,每一个时钟周期计数器中的数减一,当计数器中的数为0时触发中断,进入中断服务函数。
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
SystemCoreclock的值为系统时钟的值72MHz。对于配置函数SysTick_Config(),配置成功返回0,配置失败返回1.
SysTick->CTRL表示SysTick的使能位。
在这里SysTick_Config()函数的参数为SystemCoreclock/1000,经过计算可以知道进入中断一次的时间为1ms。
t = (1/72000000) * (SystemCoreclock/1000)
设置变量在中断中统计进入中断的次数,从而得到时间。
void SysTick_Handler(void)
{
Delay_Times++;
count_1s++;
if(count_1s == 1000)
{
flag = 1;
count_1s = 0;
}
else
{
flag = 0;
}
}
变量Delay_Times用来统计进入中断的次数,变量count_1s和flag控制串口每隔1秒钟向上位机打印一次。
主函数:
int main(void)
{
SysTick_Init();
GPIO_Config();
USART_Config();
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//使能SysTick
flag = 0;
while(1)
{
if(flag)
{
secs = Delay_Times/1000;
mins = secs/60;
hours = mins/60;
secs = secs - mins*60;
mins = mins - hours*60;
printf("the time is:%d:%d:%d\r\n",hours,mins,secs);
}
else
{
}
}
}