stm32f10x时钟系统(二)

文章主题:SysTick滴答定时器

概述

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。

Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
Systick中断的优先级也可以设置。

4个SysTick寄存器

SysTick有四个配置寄存器,但是一般常用的就前面三个。如下:
- CTRL SysTick 控制和状态寄存器
- LOAD SysTick 自动重装载除值寄存器
- VAL SysTick 当前值寄存器
- CALIB SysTick 校准值寄存器

1. SysTick 控制和状态寄存器 - CTRL

这里写图片描述
第 0 位:SysTick使能位;
第 1 位:SysTick中断请求位,如果为 1,则计数到 0 时进入中断服务函数,反之无动作。
第 2 位:选择时钟来源(外部时钟是HCLK(AHB总线时钟)的1/8,内核时钟是HCLK时钟)
库函数版配置函数:SysTick_CLKSourceConfig(); 位置如下:
这里写图片描述
第 16 位:如果上次读取本寄存器后,SysTick已经计数到了0,则该位为1,如果读取该位,该位自动清零。

2,SysTick 重装载数值寄存器- LOAD

这里写图片描述
当SysTick计数到 0 后就会从LOAD寄存器中读取新值。

3,SysTick 当前值寄存器- VAL

这里写图片描述

固件库中的Systick相关函数:

SysTick_CLKSourceConfig()    //Systick时钟源选择  misc.c文件中
    // 时钟源是HCLK或者HCLK的1/8
SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断
    //core_cm3.h/core_cm4.h文件中
    // ticks表示两个中断之间有多少个时钟周期,

比如:SysTick_Config(SystemCoreClock / 1000)
这行代码表示两个中断之间有 SystemCoreClock / 1000 个时钟周期,如果时钟源使用的是 72MHz(即1s是72MHz个时钟周期),说明两个中断之间有72KHz个时钟周期,即 1ms延迟。

Systick中断服务函数

void SysTick_Handler(void);

实例

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{ 
   TimingDelay = nTime;
   while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
    if (TimingDelay != 0x00) 
     { 
       TimingDelay--;
     }
}
 int main(void)
 {  …
    if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms
     {
     while (1);
     }
    while(1)
     { Delay(200);//2ms
     … 
     }
}

参考资料

正点原子stm32视频,
STM32——系统滴答定时器

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/79771458