SysTick 浅谈
摘要:本章主要介绍SysTick系统定时器的基本原理,然后实现了毫秒定时器
1. SysTick Timer (STK)系统定时器,是CM3 内核的外设,内嵌在 NVIC 中。系统定时器 是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置 系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产 生一次中断,以此循环往复。 因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个 系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统, 用于产生时基,维持操作系统的心跳。
2. SysTick 寄存器
SysTick—系统定时器有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候, 只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
SysTick 寄存器汇总
寄存器名称 | 寄存器描述 |
CTRL | SysTick 控制及状态寄存器 |
LOAD | SysTick 重装载数值寄存器 |
VAL | SysTick 当前数值寄存器 |
CALIB | SysTick 校准数值寄存器 |
下面列举了每个寄存器的详细描述:
3. SysTick 定时实验
实验目的:使用SysTick产生1s的时间基准,LED每隔1s闪烁一次
编程要点:
1.使用固件库编程,设置重载寄存器的值
uint32_t TimingDelay = 0;
void SysTick_Init(void)
{
if (SysTick_Config(SystemCoreClock / 100000)) {
while (1);
}
}
void Delay_us(__IO uint32_t nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00) {
TimingDelay--;
}
}
2. 实现中断服务函数 SysTick_Handler
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
3. 在main函数中实现LED延时亮灭
LED_GPIO_Config();
SysTick_Init();
while (1) {
LED1_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED1_OFF;
LED2_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED2_OFF;
LED3_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED3_OFF;
}