Systick嘀嗒定时器

基本概念

定时器在STM32系列微控制器中是一种非常常见且重要的外设,其主要功能是实现精确的时间控制,也就是我们常说的“定时”功能。

而在基于ARM Cortex-M3或Cortex-M4内核的处理器中,也内置了一个相对简单的定时器模块,这个定时器被称为系统嘀嗒定时器(SysTick)。从功能上看,SysTick定时器虽然结构较为精简,但它却是Cortex-M3/M4内核的重要组成部分之一,属于内核级别的外设,并且直接嵌入到嵌套向量中断控制器(NVIC)中。

处理器内部定时器结构示意图

由于SysTick定时器是Cortex-M3/M4内核的标准配置,因此几乎所有的基于Cortex-M3/M4内核的微控制器都包含了这一模块。这种高度的一致性使得SysTick定时器在不同硬件平台之间的移植变得极为便捷,开发者无需针对不同的芯片进行复杂的适配工作,从而大大提高了开发效率和代码的可复用性。

由于Systick定时器属于CM4内核,所以大家在STM32F4中文参考手册中是找不到关于Systick定时器的相关信息,大家可以在CM3权威指南或者Cortex M3/M4权威指南中找到。

基本应用

(1) 裸机开发:编写专门的延时函数,实现微秒、毫秒级别的延时,如作为闹钟或者延时。

(2) 操作系统:可以为RTOS实时操作系统的任务调度提供时钟节拍,RTOS架构是并行的。

时钟分析

如果想要使用Systick定时器来实现定时功能,那么首先需要明确Systick定时器的时钟频率,这一点至关重要。而Systick定时器通常是挂载在总线之下的,不同类型的总线其运行频率是不一样的。

这些总线的频率是由系统时钟提供的,然而提供时钟信号的来源却存在差异,可能来自不同的时钟源。由于时钟源的不同会导致总线频率的变化,从而影响到Systick定时器的时钟频率,因此在使用Systick定时器之前,必须对各种时钟源之间的区别进行深入的了解和分析,这样才能确保定时功能的准确性和可靠性。

一般情况下一款MCU有多种时钟源(用于提供时钟信号),时钟源一般可以分为两类:内部时钟源 + 外部时钟源,每一种时钟源的频率都是各不相同的。

MCU时钟源分类说明图

高速外部时钟

HSE时钟相关说明与硬件配置图
### 高速内部时钟
HSI时钟相关示意图

低速外部时钟

LSE时钟相关示意图

低速内部时钟

LSI时钟相关示意图

PLL锁相环

PLL是一种基于锁相环(PLL,Phase-Locked Loop)技术的电路系统,它通过倍频的方式将输入信号的频率提升到更高的频率范围,同时保持输出信号与输入信号之间的相位同步。

PLL配置说明图

这种技术广泛应用于通信、无线电、时钟生成以及信号处理等领域,其核心功能是通过对参考信号进行频率倍增来满足系统对高频信号的需求,同时利用锁相环的特性确保输出信号具有较高的稳定性和精确性。

在实际应用中,PLL倍频锁相环的设计需要综合考虑倍频系数、相位噪声、锁定时间以及频率稳定性等关键参数,以实现高性能的信号生成和处理能力。

时钟配置

时钟树与PLL参数配置图

通过阅读ST公司提供的函数库的帮助手册,可以知道ST公司默认使用的高速外部时钟的频率是25MHZ,并且PLL_M = 25,PLL_N = 336,PLL_P = 2, 芯片主频 = HSE / M * N / P = 168M

开发板默认使用的HSE时钟源的频率是8MHZ,为了能够计算出168MHZ的芯片主频,所以需要修改PLL_M的值,所以需要修改system_stm32f4xx.c文件,并且还需要修改stm32f4xx.h头文件中HSE_VALUE宏定义的值。

基于STM32F4XXX配置

修改system_stm32f4xx.c源文件的316行,必须把宏定义PLL_M的值从25修改为8

system\_stm32f4xx.c文件修改位置图

修改stm32f4xx.h头文件中HSE_VALUE宏定义的值,修改文件的123行,把25修改为8

stm32f4xx.h文件修改位置图

这两个位置修改完成后,PLL倍频锁相环的参数才是正确的,所以计算出来的频率就是正确的。

时钟选择

通过内核文档可以知道Systick定时器有2个时钟源,一个是内部时钟(FCLK,指的是MCU的自由运行时钟,就是168MHZ),一个是外部时钟(STCLK,目前STM32F407ZET6这颗MCU是把AHB总线的时钟频率进行8分频,就是168MHZ /8 = 21MHZ)

Systick时钟源选择示意图

168MHZ

如果选择168MHZ作为Systick定时器的时钟源,也就是说1s会计数168000000次,所以计数1次的周期是1/168us,由于定时是通过计数实现,就意味着计数168次的时间是1us。

而Systick定时器的寄存器有效位数是24bit,就意味着寄存器能够存储的计数值的最大值是2^24 - 1,意味着单次最大的定时时间 = 99.864ms。

21MHZ

如果选择21MHZ作为Systick定时器的时钟源,也就是说1s会计数21000000次,所以计数1次的周期是1/21us,由于定时是通过计数实现,就意味着计数21次的时间是1us。

而Systick定时器的寄存器有效位数是24bit,就意味着寄存器能够存储的计数值的最大值是2^24 - 1,意味着单次最大的定时时间 = 798.9ms。

接口设计

Systick相关接口说明图1
Systick相关接口说明图2
posted @ 2026-01-14 08:50  Jaklin  阅读(16)  评论(0)    收藏  举报