【STM32学习】SysTick定时器(嘀嗒定时器)

news/2025/2/7 3:56:00/

SysTick定时器

  • 一、参考资料
  • 二、时钟源选择与定时时间计算
    • 1、时钟源选择
    • 2、定时时间计算
  • 三、SysTick_Handler中断服务函数

一、参考资料

嘀嗒定时器:时钟源、寄存器

二、时钟源选择与定时时间计算

结合正点原子的代码进行说明:

1、时钟源选择

在这里插入图片描述

从上图可以发现:Cortex系统时钟(嘀嗒定时器)是经过SYSCLK8分频之后得到的;
SYSCLK最高为72MHz,来源为HSI、PLL、HSE;
原子的代码,默认使用的是来自于PLL,且为最高72MHz;

在system_stm32f10x.c中可以看到:三种时钟源的选择方法。

在这里插入图片描述
在这里插入图片描述

在stm32f10x.h中可以看到:HSE默认大小为8MHz,如果要修改晶振大小需要注意。

在这里插入图片描述

2、定时时间计算

以原子默认时钟源配置为例,SYSCLK为72MHz。
众所周知,原子的delay.c的延迟函数使用的为systick定时器,并且在要先调用delay_init函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以看到SysTick_CLKSourceConfig函数无非就是配置其CTRL寄存器,来控制使用哪个时钟源,这里我不在贴寄存器的配置了,可以去看上边的参考链接。

原子选择的是PLL,倍频到72MHz,然后再进行8分频(无论选择哪个时钟源都要进行8分频),72MHz/8=9MHz,也就是说systick此时的频率是9MHz;

再继续看,延迟函数:

在这里插入图片描述

这个函数如果nus=1,则装入的值为fac_us,也就表示这个函数能延迟1us。为什么呢?
根据systick的工作原理可以知道,当装入寄存器的值一直减少,当变为0的时候,表示延迟结束。
也就说能够延迟的时间为:装载值*减少一个数所需要的时间

装载值可以发现:当nus=1时,fac_us=SystemCoreClock/8000000。SystemCoreClock为72M,则fac_us=9。即装载值为9。
减少一个数所需要的时间:即为systick的频率,也就是9MHz,转换为时间为1/9MHz。
延迟时间:9*1/9MHz=1us (Hz对应s,KHz对应ms,MHz对应us)

为什么要除以8M?就是为了使得当一个fac_us时,装入的数,刚好为1us。
举个例子:假设SYSCLK选择为8MHz,则systick频率为1MHz;fac_us为8M/8M=1,则延迟时间为1*1/1MHz=1us。

延迟原理不在赘述,无非就是do while死循环,一直读取CTRL寄存器,判断标志位是否置为1。

三、SysTick_Handler中断服务函数

systick为定时器,那么其中断服务函数在哪里?在stm32f10x_it.c中

那么再问一句,该中断服务函数是每减少装载值的一个数就触发一次,还是装载值减少到0才会触发呢?

我进行了软件模拟仿真,证明是装载值减少为0才会触发该中断服务函数,也就是说等延迟结束的时候会触发


http://www.ppmy.cn/news/11586.html

相关文章

什么是SPI?SPI的优点有哪些?

1、什么是SPI? SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线。 2、SPI优点 支持全双工通信通信简单数据传输速率块 3、缺…

格式化时间转化为时间戳

const std::string date("2022-12-12 00:00:00"); std::regex reg("(\\d)-(\\d)-(\\d)(\\s)(\\d):(\\d):(\\d)"); std::smatch match; std::regex_search(date,match,reg); std::string tm_y(match[1]);// 年 std::string tm_m(match[2]);//月 std::s…

结构体重点知识大盘点

0、结构体基础知识 1、结构体是一些值的集合,这些值被称为成员,它们的类型是可以不同的。(与数组相似,但数组元素的类型都是相同的)。用来描述由基本数据类型组成的复杂类型。 2、结构体也有全局的和局部的。 3、st…

快速了解Docker

目录 什么是Docker 项目部署的问题 Docker解决依赖兼容问题 Docker解决操作系统环境差异 再梳理 Docker和虚拟机的差别 Docker架构 镜像和容器 DockerHub Docker架构 再梳理 什么是Docker 项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会…

访问学者在美国访学衣食住行的小妙招

美国访学过程中,衣食住行是我们必须考虑的因素,现在51访学网小编就这四个方面来讲一讲美国访学衣食住行的小妙招。 一、美国留学生活之“住” 租房信息可以在各校的Chinese Mailing list 或者其他类似的电子新闻组上(UC的可以在&#xff09…

【链表】leetcode面试题 02.07. 链表相交(C/C++/Java/Js)

leetcode面试题 02.07. 链表相交1 题目2 思路2.1 思路一2.2 思路二(强推--5行代码)3 代码3.1 C版本3.1.1思路一:3.1.2 思路二3.2 C版本3.2.1 思路一3.2.2 思路二3.3 Java版本3.3.1 思路一3.3.2 思路二3.4 JavaScript版本4 总结1 题目 给你两个单链表的头…

拾遗增补(六)——线程组内处理异常

创建名称为7.6项目。   创建MyThread.java类代码如下: public class MyThread extends Thread{private String num;public MyThread(ThreadGroup group, String name, String num) {super(group, name);this.num num;}Overridepublic void run() {int numInt I…

在IntelliJ IDEA中使用.ignore插件忽略Git不必要提交的文件

第一步: 点击File->Settings,在左侧菜单找到Plugins,点击搜索栏搜索.ignore,点击Install 第二步: 重启idea -->在项目上右键->New ->.ignore file ->.gitignore file(Git) 第三部: 在项目中…