Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。还可以节约MCU资源,不用浪费一个定时器,工作原理和定时器相似。
滴答定时器的应用
滴答定时器广泛应用于嵌入式系统和操作系统中,可以用来实现延时函数、实时时钟、定时器、任务调度等。下面=介绍一下滴答定时器的一些应用:
- 延时函数:通过滴答定时器来实现软件延时,可以在不使用硬件延时器的情况下进行精确延时,比如在控制LED灯闪烁的时候可以使用滴答定时器来产生定时器中断来控制LED灯的亮灭时间。
- 实时时钟:在嵌入式系统中,可以使用滴答定时器来实现实时时钟的功能,通过定时器中断来更新系统时钟。
- 定时器:在嵌入式系统中,可以使用滴答定时器来实现硬件计时器的功能,比如控制飞机遥控器的发送信号的时间间隔。
- 任务调度:在操作系统中,滴答定时器可以用来实现任务调度,通过定时器中断来调度任务的执行。
要在32位单片机上使用滴答定时器进行延时,可以按照以下步骤进行:
1.配置滴答定时器(SysTick)的时钟源和计数器周期。在Cortex-M0架构中,SysTick定时器是内置的,并且使用外部时钟源,通常使用CPU时钟或外部晶振时钟。可以使用以下代码配置SysTick定时器的计数器周期为1毫秒:
复制//初始化待代码
void systick_config(void)
{
SysTick_Config(SystemCoreClock/1000);
}
这里SystemCoreClock
是系统时钟频率,这里假设为1MHz,将SysTick的计数器周期设置为1毫秒(1000Hz)。
//对应的中断函数,可设置计数变量,单位是1ms void SysTick_Handler(void) {
uint32_t tick =0
;
tick
++;}
2.在需要进行延时的地方,调用delay_ms()
函数进行延时。该函数的实现如下: 复制void delay_ms(uint32_t ms) { uint32_t start_tick = SysTick->VAL; uint32_t delay_ticks = ms * (SystemCoreClock/1000); while (delay_ticks > 0) { uint32_t current_tick = SysTick->VAL; if (current_tick > start_tick) { delay_ticks -= (current_tick - start_tick); } else { delay_ticks -= (current_tick + (0xFFFFFFFF - start_tick) + 1); } start_tick = current_tick; } }
该函数使用当前SysTick计数器的值和计算出的延时所需的SysTick计数器值之间的差来计算延时时间。在循环中,如果当前SysTick计数器的值大于初始值,则直接减去它们的差;如果当前SysTick计数器的值小于初始值,则减去它们的差再加上SysTick计数器的最大值。
这样就可以使用SysTick定时器在32位单片机上进行精确的延时了。