HAL库与Cubemx系列|Systick-系统滴答定时器详解
Systick是什么?
关于Systick,在Context-M3权威指南中如此描述:
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
SysTick定时器能产生中断, CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。
SysTick 是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除, 就永不停息,图 13.1 中小结了 SysTick的相关寄存器。



这是定义在core_cm3.h中的结构体:

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。 OS 都需要这种“滴答” 来推动任务和时间的管理。 如欲使能 SysTick 异常, 则把 STCSR.TICKINT 置位。 另外, 如果向量表被重定位到 SRAM 中,还需要为 SysTick 异常建立向量,提供其服务例程的入口地址。
Systick如何使用?
前面说了那么多,Systick到底是什么,小伙伴们是不是已经明白了呢?其实,简单一句话,就是“心跳”,CPU以心跳为依据分配要做的事情,嘀哒...嘀哒...嘀哒...
cubemx配置Systick
来来来,实践是检验真理的唯一标准,没有实践的理论就是耍流氓~~
Systick是系统的“心跳”,为系统提供着时基来源,cubemx中是已经为我们勾选了的,默认的时基是来源于Systick

当然了,条条大路通罗马,Systick可以作为时基,但却不是唯一的,不信你看,实际上有这么多的定时器都可以用来作为时基来源的,移植过操作系统的小伙伴一定不陌生,本次,我们只介绍关于Systick的功能~

- 时钟配置
关于时钟配置的详细讲解,请参看:CubeMX的正确打开方式 一文
- 串口配置
关于串口配置的详细解释,请参看:CubeMX的正确打开方式 一文
- Systick中断
可以看到,Systick的中断是默认已经开启了的,直接使用即可

Systick代码详细解析
结合生成的工程,来看看Systick的时钟配置以及工作流程,systick首先在HAL_Init()函数中被提到,被cue来干嘛呢,接下来跟进去看看

从英文解释中(别说看不懂哈),Systick被配置为系统时基,并且被配置为了1ms,做技术,要有刨根问底的精神,奥利给,继续跟进去看看

这段英文解释很重要,外设中断进程调用HAL_Delay的时候,要特别注意中断的优先级问题,如果systick的中断优先级低于外设中断优先级,会导致一直在外设中断中阻塞,如果外设中调用了HAL_Delay(),一定要保证Systick的中断优先级高于外设中断优先级,但是,小飞哥是极其不建议在中断中调用HAL_Delay()函数的

明明是在说Systick的事情,怎么牵扯到HAL_Delay()函数了呢,那就再来看看,HAL_Delay()是如何实现的呢?打开HAL_Delay(),可以看到,实际上是通过uWTick这个全局变量不断增加,比较来实现的延时,那么uWTick是在哪里增加的呢?

好家伙,转了十万八千里,最终还是在Systick中断中进行增加的,默认配置的是Systick 1ms中断,这下知道了我们调用的HAL_Delay(),为什么是1ms了吧,绕了那么一大圈,是不是有点想打人呢~

默认配置的是1ms中断周期,那我们HAL_Delay()的最小单位是1ms,如果想获得1us的中断周期,该如何调整呢?且往下看,这是我们自定义的systick周期配置函数,一步一步来看

先来看systick的时钟来源,时钟来源为HCLK或者是HCLK的8分频,小飞哥实验选择的是HCLK,72MHZ,确定了systick的时钟源,接下来配置systick的中断周期
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


再来看这个函数,分析之前,我们先来看看systick的中断周期时间是怎么计算的,T=ReloadValue10001/72000000ms
这是默认的配置1ms,主频是72MHZ,uwTickFreq默认是1KHZ,根据上面的分析计算,算下来T = (72MHZ/1000)1/72MHZ=1000/72MHZ(1/72MHZ)=1/1000s=1ms,你看懂了吗?
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)


根据上面的分析,我们想要1us、10ms、100ms....的中断周期怎么办,那就根据上面的计算公式算吧,那这么修改后,HAL_Delay不就可以实现us延时了嘛,实现当然是能实现,但中断是不是过于频繁了呢,1us一个中断诶,那怎么实现呢,请查看,关于HAL库us延时的3种实现方式
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); //1ms

到此,关于systick的工作流程就算是介绍差不多了,还有最后一步,Systick中断回调函数需要添加到中断回调句柄中

可以看到systick中断回调函数依然是_weak修饰符,意思就是我们自己一个一样名字的函数,不会报错

我们自己重新定义回调函数,处理中断事务,好的编程习惯,中断置标志,所有的逻辑处理放在中断外处理,建议这样做


while中不断查询标志

测试结果
间隔100ms,打印systick test,测试OK,over

关于Embeded-party
欢迎加入群聊Embeded-party,这里有一群可爱的人儿,很多有意思的设计,等着你的加入哦


资料获取
公众号后台回复,systick,即可获得源码哦~
HAL库与Cubemx系列|Systick-系统滴答定时器详解的更多相关文章
- STM32 - SYSTICK(系统滴答定时器)
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...
- 系统滴答定时器(SysTick)中断配置
系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...
- STM32 的系统滴答定时器( Systick) 彻底研究解读
作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...
- Cortex-M0系统滴答定时器Systick详解
上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...
- STM32之系统滴答定时器
一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...
- liunx驱动----系统滴答时钟的使用
2019-3-12系统滴答定时器中断使用 定义一个timer 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...
- STM32 系统滴答计时器
;//us与系统滴答的被乘数 ;//ms与系统滴答的被乘数 ;//系统运行秒数 /** * @description:系统滴答计时系统初始化 * @param 无 * @retval 无 */ voi ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- Java 8系列之Stream的基本语法详解
本文转至:https://blog.csdn.net/io_field/article/details/54971761 Stream系列: Java 8系列之Stream的基本语法详解 Java 8 ...
随机推荐
- 简化mapstruct代码: mapstruct-spring-plus
mapstruct MapStruct 是一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现.MapStruct官网地址: h ...
- Portswigger web security academy:Cross-site request forgery (CSRF)
Portswigger web security academy:Cross-site request forgery (CSRF) 目录 Portswigger web security acade ...
- 『动善时』JMeter基础 — 7、jmeter.properties文件常用配置
目录 1.默认语言设置 2.配置默认编码格式 3.GUI图标放大比例设置 4.功能区工具栏图标大小设置 5.视图区目录树图标大小设置 6.内容区编辑字体设置 7.添加JMeter元素快捷键设置 8.捕 ...
- SSM整合大体步骤
SSM整合步骤: 1. 导入jar spring: springMVC: mybatis: 第三方支持:log4j,pageHelper,AspectJ,jackson,jstl 2. 搭建sprin ...
- JVM垃圾回收器总结
常见七种垃圾回收器以及使用的垃圾回收算法总结:
- Day015 异常处理机制
异常处理机制 抛出异常 捕获异常 异常处理的五个关键字 try:监控一个代码块,有异常就能通过catch捕获 catch(想要捕获的异常类型):捕获想要捕获的异常,catch代码块的代码只有在捕获到异 ...
- 腾讯云原生混合云-第三方集群弹EKS应对突发流量的利器
作者 何鹏飞,腾讯云专家产品经理,曾作为容器私有云.TKEStack的产品经理兼架构师,参与腾讯云内部业务.外部客户容器化改造方案设计,目前负责云原生混合云产品方案设计工作. 胡晓亮,腾讯云专家工程师 ...
- Arduino杀手在此!!ESP 8266 NodeMCU小白手把手入门(二)(解惑篇)
上一次更新主要是简单介绍了NodeMCU的基本知识并且进行了一次简单的实操演示,最近有一些读者向我提出了一些小问题,所以决定出一期解惑篇,主要针对的是基础知识不是太牢固,或是喜欢刨根问底的小可爱们.里 ...
- nohup 命令 2>&1 |tee lmbench.log & 只适用没有需要敲y或x的
nohup make results 2>&1 |tee lmbench.log & nohup 命令 2>&1 |tee lmbench.log & 只适 ...
- linux进阶之网络技术管理
本节内容 1. 网络七层模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 2. TCP/UDP (1)TCP面向连接,可靠传输,消耗系统资源比较多,传输速度较慢,但是数据传 ...