stm32的学习——SysTick定时器的使用

SysTick定时器是Cortex-M系列处理器中的一个24位倒计时定时器,常用于延时。它可以选用不同的时钟源,如8分频后的21MHz或未经分频的168MHz,影响着最大延时时间。内核提供SysTick_CLKSourceConfig()函数来配置时钟源,而SysTick_Config()函数用于设置中断周期。定时器的应用包括中断方式和非中断方式,中断方式涉及编写中断服务函数,非中断方式则直接操作寄存器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Systick定时器

1、SysTick定时器简介

SysTick定时器也称为滴答定时器,SysTick定时器是内核中的一个外设,内嵌在NVIC(嵌套向量中断控制器)里面,在cortex M3、M4中都存在,很方便用户移植。

虽然我用的是cortex M4的内核,但是他的内核文档在这方面和Cortex M3的相似。

所以我这里参考了M3的内核中文文档。M3和M4内核文档——密码:0423。

注意:因为Systick定时器是内核外设,所以在STM32F4中文参考手册是找不到的,可以参考Cortex M3权威指南(第8章) + M3/M4内核权威指南(9.5章节)。

 Systick定时器是一个24bit的倒计时(向下计数)定时器,功能就是实现简单的延时。

24位向下计数定时器。

2、SysTick时钟源

SysTick定时器有两个时钟源可以选择,具体可以参考下图中的中文手册的时钟树。(stm32f4xx中文手册)密码同上。

 我们主要看粉色虚线框中的内容,从左往右看,首先是AHBPRESC/1,...,512这一个输出的AHB频率为168MHz,向上分为两个方向,一个是到Cortex 系统定时器,一个是FCLK Cortex自由运行时钟,这两个时钟源都可以作为SysTick定时器的时钟源。这两个的频率分别是8分频:21MHz和没有分频的168MHz。

也可以参考stm32CubeMX中的图片:

 让我们思考一下为什么要分频呢?为什么有不同频率的时钟源?

因为选择不同频率的时钟源会影响延时的长短。

如果选择168MHz的时钟源作为SysTick的时钟源,168MHz:1s震荡168 000 000次,也就是1us(1s == 1 000 000 us)震荡168次,而我们的SysTick定时器是一个24位的向下计数定时器。所以最多计数2^24-1(从零开始计数,所以要减一),所以可以算出最大延时时间:99.864ms

计算过程:2^24/168 = 99864.380952380952380952380952381us = 99.864ms

如果选择21MHz作为时钟源,则1s震荡21 000 000次,所以1us 震荡 21次,最大延时时间:

2^24/21 = 798,915.04761904761904761904761905 us = 798.915 ms

关于Systick定时器的寄存器说明以及函数接口都存储在内核文件misc.c以及misc.h,同时在core_cm4.h页定了关于Systick定时器的内容。

内核中提供了一个函数接口可以去修改Systick的时钟源  函数为 SysTick_CLKSourceConfig()

我们来讲一下 SysTick_CLKSourceConfig()这个函数:

函数原型

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

函数参数

参数一:SysTick_CLKSource   选择时钟源  一般选SysTick_CLKSource_HCLK_Div8   21MHZ

@brief配置SysTick时钟源。

@param SysTick_CLKsource: SysTick时钟源。该参数可以是以下值之一:

        @arg SysTick_CLKSource_HCLK_Div8:选择AHB时钟除以8作为SysTick时钟源

        @arg SysTick_CLKSource_HCLK:选择AHB时钟作为SysTick时钟源。

@retval 无

3、SysTick定时器的应用

内核提供两种方案来使用systick定时器,分别是 中断方式 + 非中断方式

①中断方式:

 第一步:设置Systick的中断周期(SysTick_Config函数)

 让我们分析一下这个SysTick_Config函数:

函数原型:__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

函数参数分析:

 ticks是两个中断中的滴答数,我们回头看内核文档:

滴答数 = 时钟源 / 时间,假如中断周期为1us,时钟源为168MHz,则ticks = 168 000 000 / 1 000 000 = 168

第二步:编写延时函数

 

第三步:在Systick中断服务函数中修改中断次数

 

 ②非中断方式:

直接操作Systick定时器的4个寄存器,使用流程如下

 

 

 

### STM32 SysTick 定时器配置教程 SysTick 是一个简单的 24 位向下计数定时器,通常用于生成周期性的时间基准或延迟功能。以下是关于如何在 STM32 中初始化和配置 SysTick 的详细说明。 #### 1. 基本原理 SysTick 定时器的核心在于其寄存器的配置以及中断机制的应用。通过设置重装载值(Reload Value),可以使 SysTick 计数到零后触发一次中断事件[^2]。该过程可以通过软件控制来实现精确的时间管理。 #### 2. 寄存器描述 SysTick 主要涉及以下几个重要寄存器: - **STK_CTRL**: 控制寄存器,用来启动/停止计时器并启用中断。 - **STK_LOAD**: 重载值寄存器,定义每次计数值减至零后的重新加载值。 - **STK_VAL**: 当前值寄存器,显示当前剩余计数值。 - **STK_CALIB**: 校准值寄存器,在某些应用场合下可能被使用。 这些寄存器的具体作用可以在官方文档中找到更详细的解释[^3]。 #### 3. 初始化流程 为了使能 SysTick 并完成基础配置,需执行如下操作: ##### (1)设定重装载值 根据目标频率计算合适的重装载值 `reload`,这决定了每轮循环所需时间长度。例如,如果希望获得 1 ms 的中断间隔,并假设系统核心时钟速度为 `SystemCoreClock` Hz,则应设 reload 值为 `(SystemCoreClock / 1000)`[^4]。 ##### (2)编写回调函数处理逻辑 当发生溢出时会调用 `SysTick_Handler()` 函数;因此需要在此处加入实际业务代码片段或者更新全局变量状态以便后续读取利用。 ##### (3)激活硬件资源 最后一步就是开启整个模块工作模式——即写入适当参数给 STK_CTRL 来允许计数开始及响应相应异常请求[^5]。 下面给出一段完整的 C 实现例子供参考学习之用: ```c #include "stm32f1xx.h" // 全局延时变量声明 static volatile uint32_t TimingDelay; /** * @brief 设置延时毫秒数 */ void Delay(uint32_t nTime) { TimingDelay = nTime; // 循环等待直到延时期满 while (TimingDelay != 0); } /** * @brief SysTick 中断服务程序 */ void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } int main(void) { // 配置 GPIO 及其他外设... /* 如果返回错误则陷入死循环 */ if (SysTick_Config(SystemCoreClock / 1000)) { while (1); // 错误处理:进入无限循环 } while(1){ Delay(200); // 调用自定义延时函数, 近似等于2ms } } ``` 上述源码展示了怎样基于标准库 API (`SysTick_Config`) 方法快速搭建起一套简易版的软实时调度框架雏形出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值