单片机学习笔记7--SysTick定时器(基于百问网STM32F103系列教程)

2023-05-16

第六章 SysTick定时器

SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器。24位,只能递减,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。

只要是ARM Cotex-M系列内核的MCU都包含这个定时器
使用内核的SysTick定时器来实现延时,可以不占用系统定时器,节约资源。在HAL库的毫秒级延时函数HAL_DRAYE(),就是用滴答定时器实现的。

SysTick定时器是一个24位递减定时器,即计数器最大值为2^24,每个时钟周期减1,当减到0时,会产生Systick异常,同时再自动重载定时初值,开始新一轮计数,一旦SysTick定时器工作起来他是不会自动停下来的,除非将SysTick定时器的控制和状态位清零。

SysTick的时钟源有两个,一个是系统内核的时钟,一个是外部的系统时钟。

6.1STM32的SysTick定时器

6.1.1时钟来源

滴答定时器和普

通的定时器的工作流程是一样的,只不过系统定时器没有挂载到APB1或APB2上,他的时钟来源有两个,一个是经过AHB时钟8分频而来的(9MHz)。一个是直接连接AHB时钟(72MHz),具体情况通过寄存器配置。

在这里插入图片描述

通过设置SysTick定时器的计数初值和时钟频率就可以获得想要的计时时间。

HAL库提供HAL_SYSTICK_Config()函数去设置这个初始值。

6.1.2 相关寄存器

对于SysTick的寄存器还是比较少的,只有4个,常用的有3个。

1、控制和状态寄存器(STK_CTRL)

在这里插入图片描述

CLKSOUECE是选择滴答定时器时钟源的,可以选择AHB(72MHz)或者AHB8分频(9MHz)。

TICKINT是设置当计数到0时,是否产生异常中断请求的。

ENABLE就是使能定时器的。

2、预装载值寄存器(STK_LOAD)

在这里插入图片描述

这个寄存器只有低24位能用,所以滴答定时器最大初值只能是2^24。当定时器计数到0时,就会把此寄存器里面的值重新装载进去,开始新一轮的计数。

3、当前值寄存器(STK_VAL)

在这里插入图片描述

这个寄存器是用来查看当前计数值的,定时器每计数一次,计数初值减1,这个当前寄存器中的计数值就加1,同样他的最大值也是2^24.

4、准校准值寄存器(STK_CALIB)

在这里插入图片描述

这个寄存器是用来校准的,一般用不到。

6.1.3计算计数初值

通过设置SysTick定时器的计数初值和时钟频率达到想要的计时时间。

假设滴答定时器时钟为72MHz,也就是计数1次要用1/72000000S,也就是1S计数72000000次,1ms计数72000次,1us计数72次。

将这这些初值值写入系统滴答定时器,定时器在每个时钟周期减1,减到0时,就刚好是对应事件,同时产生中断通知,再次加载计数初值如此反复。

HAL库提供HAL_SYSTICK_Config()函数去设置这个初始值,里面的参数是计数值。

6.2HAL库配置SysTick定时器

HAL库中对SysTick定时器配置的函数常用以下四种。

在这里插入图片描述

下面进入HAL_SYSTICK_Config函数看看HAL库中是如何配置SysTick定时器的。

他是通过调用ST官方提供的函数SysTick_Config来配置的。

在这里插入图片描述

SysTick_Config中,首先将需要的计数初值放在预加载寄存器中,然后把当前值寄存器清零,然后设置控制和状态寄存器的第2、1、0位,设置滴答定时器时钟源来源为AHB不分频,即72MHz,允许中断请求,使能定时器。这样滴答定时器的时钟频率确定了,计数初值确定了,滴答定时器的定时时间就确定了。
在这里插入图片描述

可以调用 HAL_SYSTICK_CLKSourceConfig这个函数修改滴答定时器的时钟源。
在这里插入图片描述

同之前的中断函数一样,滴答定时器也是在系统默认中断服务函数中调用HAL库的中断服务函数然后HAL中断函数在调用回调函数。

SysTick_Handler–>HAL_SYSTICK_IRQHandler–>HAL_SYSTICK_Callback–>使用者自己代码。

在这里插入图片描述

但是HAL库对滴答定时器的依赖性挺强,好多地方都用到了滴答定时器,所以尽量不要对滴答定时器进行设置和使用,STM32F103定时器有8个,一般来说足够用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机学习笔记7--SysTick定时器(基于百问网STM32F103系列教程) 的相关文章

  • 约瑟夫环详解

    package newjosephu public class myfinaljosephu 你可能会说crazy 我只想说ez xff01 public static void main String args circlelinkedl
  • ECS弹性云服务器常用端口、安全组

    弹性云服务器常用端口 弹性云服务器常用端口如 表1 所示 您可以通过配置安全组规则放通弹性云服务器对应的端口 xff0c 详情请参见 添加安全组规则 表1 弹性云服务器常用端口 协议 端口 说明 FTP 21 FTP服务上传和下载文件 SS
  • 01背包问题(滚动数组实现的逻辑)

    package tttest public class mybetterbag public static void main String args int weight 61 1 3 4 int bagsize 61 4 int val
  • java递归实现辗转相除法

    public static int getres int a int b if b 61 0 return getres b a b return a
  • java 线索二叉树的构建

    public class test public static void main String args Node root 61 new Node 1 Node node2 61 new Node 2 Node node3 61 new
  • ubuntu下查看文件(夹)大小的命令

    记录下自己常用的查看文件夹和文件大小的命令 查看当前所处的文件夹的整个大小 xff08 不包括具体内容 xff0c 只看当前文件夹大小 xff09 span class token function du span sh 查看当前文件夹中各
  • git stash时出现xxx:needs merge问题

    项目需要git merge其他分支 xff0c 但由于本地也修改过 xff0c 所以希望先git stash后再merge xff0c 这时出现以下问题 xff1a xxx xxx xxx cpp xff1a needs merge 通过g
  • FFMPEG 之视频播放

    先看界面效果 xff0c 虽然有点low xff0c 但是效果实现了 一 实现原理 1 使用ffmpeg解码视频 2 然后使用libyuv播放解码的视频 二 实现 1 先看目录结构 2 ffmpeg编译以及引用 xff0c 在之前的篇章已经
  • 一步一步学CMake 之 VSCode+CMakeLists 调试 C++ 工程

    目录 1 插件推荐 2 文件准备 3 开始调试 一步一步学 CMake 系列文章 1 插件推荐 CMake CMake tools 2 文件准备 新建文件夹 xff1a TEST 新建文件 xff1a CMakeLists txt 内容如下
  • 51单片机使用8位重装定时器实现PWM输出同时实现DAC转换

    51单片机使用八位重装定时器实现PWM输出同时实现DAC转换 最近想要做一个数控电源 xff0c 打算使用51单片机实现电压和电流的闭环 xff0c 但是手头上的51单片机为STC89C51系列的单片机 xff0c 没有ADC采样功能 xf
  • 【MYSQL】分组之后获取每组最新的数据

    记录一次有点麻烦的sql 可以直接复制拿去测试 xff0c 一开始我也百度来着 xff0c 发现要么没法满足我的需求 xff0c 要么就连看下去的欲望都没有 建表测试demo xff1a span class token keyword C
  • C++ 指针中:指针数组 指向指针数组的指针 指向指针的指针

    指针数组 xff1a 存储指针的数组 pa n an array of pointers 注意这里 优先级高于 xff0c 因此pa是一个包含三个指针的数组 指向指针数组的指针 pd n pointers to an array of po
  • Flutter要被放弃了?别瞎传了!

    前言 Flutter 作为Google出品的一个新兴的跨平台移动客户端UI开发框架 xff0c 正在被越来越多的开发者和组织使用 xff0c 包括阿里的咸鱼 腾讯的微信等 今天 xff0c 我主要讲解Flutter中文本组件方面的Widge
  • (学习笔记)手把手教你学51单片机:定时器与数码管

    一 逻辑电路与逻辑运算 逻辑运算符 xff1a xff08 1 xff09 按变量整体值进行运算 xff1a 逻辑与 amp amp 逻辑或 xff08 xff09 逻辑非 xff08 xff01 xff09 xff08 2 xff09 按
  • (学习笔记)手把手教你学51单片机:中断与数码管动态显示

    一 c语言的数组 1 1数组的基本概念 数组是具有相同数据类型的有序数据的组合 xff0c 一般来讲数组定义后满足以下三个条件 xff1a xff08 1 xff09 具有相同的数据类型 xff08 2 xff09 具有相同的名字 xff0
  • KST-51:从999999开始的倒计时程序,只显示有效位

    此程序为手把手教你学51单片机的例程 例程中实现只显示有效位 xff08 高位0不显示 xff09 xff0c 实现了数码管稳定显示不抖动 for结合break 实现只显示有效位 switch结合i 实现数码管动态刷新 include lt
  • KST51单片机:通过中断实现矩阵按键的次数检测与消抖

    以Key4为例 xff0c 使用定时中断2ms进行消抖 xff0c 对连续8次 xff08 16ms xff09 的按键状态进行判断 如果全部为1则弹起 xff0c 将按键当前状态 xff08 Keysta xff09 为1 xff1b 全
  • 关于单片机蓝桥杯

    经大佬提醒 xff0c 已修改 芯片 xff1a IAP15F2K61S2 考核内容 xff1a LED 数码管 独立按键 矩阵按键 定时器 555 超声波 xff08 有基础 xff09 iic EEPROM ADC ds18b20 xf
  • NX nomachine 远程桌面配置

    其实它是Linux下一款类VNC的远控软件 xff0c 但据说安全性方面比VNC更好 xff0c 通过SSH协议加密进行传输的 而且传输是采用数据压缩技术 xff0c 传输更快 1 安装rpm包 安装顺序 xff1a root 64 loc
  • git 命令

    1 打patch xff08 git format patch xff09 git format patch HEAD 生成最近的1次commit的patch git format patch HEAD 生成最近的2次commit的patc

随机推荐