【STM32学习笔记】SysTick-系统定时器的学习及延时函数的编写

【STM32学习笔记】目录

SysTick 简介

SysTick-系统定时器是属于CM3 内核中的一个外设,内嵌在NVIC 中。系统定时器是一个24bit 的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK 等于72M。当重装载数值寄存器的值递减到0 的时候,系统定时器就产生一次中断,以此循环往复。

SysTick 寄存器介绍

SysTick-系统定时器有4 个寄存器。

1、CTRL SysTick 控制及状态寄存器

该寄存器中有四个位有效,分别是:

第16位: COUNTFLAG,Systick 计数结束标志,如果在上次读取本寄存器后, SysTick 已经计到
了 0,则该位置 1。如果读取该位,该位将自动清零。用在查询方式上,确定计时结束,并开始新的计数。

第2位: 时钟源选择位,=0 时 AHB/8,=1 时 处理器时钟AHB

第1位: =1时,SysTick 倒数计数到 0 时产生 SysTick 异常请求;=0时,数到 0 时无动作,即中断使能位。(也可以通过读取 COUNTFLAG 标志位来确定计数器是否递减到0。)

第0位: SysTick 定时器的使能位

2、LOAD SysTick 重装载数值寄存器

Systick是一个递减的定时器,当定时器递减至0时,重装载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重装载寄存器是个24位的寄存器,最大计数 0xFFFFFF。

3、VAL SysTick 当前数值寄存器

当前数值寄存器也是个24位的寄存器,读取时返回当前倒计数的值。写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志。

4、CALIB SysTick 校准数值寄存器

系统定时器的校准数值寄存器在定时实验中不需要用到。在这里放一下官方文档中的解释。

位段 名称 类型 复位值 描述
31 NOREF R 0 NOREF flag. Reads as zero. Indicates that a separate reference clock is provided. The frequency of this clock is HCLK/8
30 SKEW R 1 Reads as one. Calibration value for the 1 ms inexact timing is not known because TENMS is not known. This can affect the suitability of SysTick as a software real time clock
23:0 TENMS R 0 Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum f
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于STM32系统滴答定时器systick)应用的问题。 系统滴答定时器systick)是STM32中一个非常重要的计时器,它是一个24位的递减计数器,每当计数器减为0时,会触发一个中断。它通常用于操作系统的时间片轮转、延时函数的实现等。 在STM32中,我们可以通过如下代码使能系统滴答定时器: ```c // 使能系统滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; ``` 然后,我们可以通过如下代码设置系统滴答定时器的时钟源和计数器值: ```c // 设置系统滴答定时器的时钟源和计数器值 SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 使用处理器时钟作为时钟源 SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置计数器值为1ms ``` 在这段代码中,我们将系统滴答定时器的时钟源设置为处理器时钟,每次计数器减1代表1个处理器时钟周期的时间。然后我们将计数器的初值设置为`SystemCoreClock / 1000 - 1`,这里的`1000`代表我们希望系统滴答定时器每1ms中断一次。 最后,我们需要在中断服务函数中处理系统滴答定时器中断: ```c void SysTick_Handler(void) { // 处理系统滴答定时器中断 } ``` 在中断服务函数中,我们可以编写自己的代码来处理系统滴答定时器中断。例如,可以实现一个简单的延时函数: ```c void delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数器减为0 } } ``` 这个函数可以让程序在执行到它的时候暂停一段时间,等待系统滴答定时器中断触发一定次数后再继续执行。 希望这些代码可以帮助您更好地理解STM32系统滴答定时器的应用。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值