Cortex-M3的SysTick 定时器

目录

概述

1 SysTick 定时器

1.1 SysTick 定时器功能介绍

1.2 SysTick 定时器功能实现

1.3 SysTick在系统中的作用

2 SysTick应用的实例

2.1 建立异常服务例程

2.2 使能异常

2.3 闹钟功能

2.4  重定位向量表

2.5 消灭二次触发

3 SysTick在FreeRTOS中的应用

3.1 STM32Cube配置SysTick

3.2 STM32HAL中sysTick接口


概述

本文主要介绍Cortex-M3的SysTick 定时器的相关知识,还介绍了一个使用汇编语言编写的Cortex-M3的SysTick的应用实例。还介绍基于Cortex-M3内核的经典MCU STM32F103中SysTick在实际项目应用的方法。

1 SysTick 定时器

1.1 SysTick 定时器功能介绍

SysTick 是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要SysTick 控制及状态寄存器中的使能位被置位, 就永不停息。下图是SysTick的相关寄存器:

CM3 允许为 SysTick 提供两个时钟源以供选择:

1)是内核的“自由运行时钟” FCLK。“自由” 表现在它不来自系统时钟 HCLK, 因此在系统时钟停止时 FCLK 也继续运行。

2)一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过 FCLK 来采样的,因此其周期必须至少是 FCLK 的两倍(采样定理)。

很多情况下芯片厂商都会忽略此外部参考时钟,因此通常不可用。通过检查校准寄存器的位[31](NOREF), 可以判定是否有可用的外部时钟源,而芯片厂商则必须把该引线连接至正确的电平。

1.2 SysTick 定时器功能实现

当 SysTick 定时器从 1 计到 0 时,它将把 COUNTFLAG 位置位;

下述方法可以清零之:
1)读取 SysTick 控制及状态寄存器(STCSR)
2)往 SysTick 当前值寄存器(STCVR)中写任何数据

1.3 SysTick在系统中的作用

1)SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。 OS 都需要这种“滴答” 来推动任务和时间的管理。

2)如欲使能 SysTick 异常, 则把 STCSR.TICKINT 置位。 另外, 如果向量表被重定位到 SRAM 中,还需要为 SysTick 异常建立向量,提供其服务例程的入口地址。

2 SysTick应用的实例

2.1 建立异常服务例程

建立SysTick异常服务例程

MOV R0, #0xF                ; 异常号: 15
LDR R1, =systick_handler    ; 加载服务例程的入口地址
LDR R2, =0xE000ED08         ; 加载向量表偏移量寄存器的地址
LDR R2, [R2]                ; 读取向量表的首地址
STR R1, [R2, R0, LSL #2]    ; 写入向量

2.2 使能异常

LDR R0, =0xE000E010       ; 加载STCSR的地址
MOV R1, #0
STR R1, [R0]              ; 先停止SysTick,以防意外产生异常请求
LDR R1, =0x3FF            ; 让SysTick每1024周期计完一次。因为是从1023数到; 0,总共数了1024个周期,所以加载值为0x3FF
STR R1, [R0,#4]           ; 写入重装载的值
STR R1, [R0,#8]           ; 往STCVR中写任意的数,以确保清除COUNTFLAG标志
MOV R1, #0x7              ; 选择FCLK作为时钟源,并使能SysTick及其异常请求
STR R1, [R0]              ; 写入数值,开启定时器

除此之外, SysTick 定时器还提供了走完 10ms 所需要的格数(TENMS 位段),作为时间校准的参考信息。在 CM3 处理器的顶层有一个 24 位的输入,芯片厂商可以写入一个 10ms 的加载值,写程序时就可以读取 STCR 寄存器中的 TENMS 位段来获取此信息。不一定每个芯片都实现了此功能,因此在使用时还需查阅芯片的数据手册。

2.3 闹钟功能

SysTick 定时器还可以用作闹钟,作为启动一个特定任务的时间依据。例如,如果需要在 300 周期后执行一段代码,就可以在 SysTick 异常服务例程中设置执行那段代码的软件标志。使用 SysTick 时,清零 CURRENT 再编程 RELOAD 寄存器,以使它在 300 周期后产生异常,如下述代码所演示:

    LDR r0, =15LDR r1, =SysTickAlarm  ; SysTick异常服务例程为SetupExcpHanlerBL SetupExcpHandler    ; 调用前面章节讲到的子程来建立向量LDR R0, =0xE000E010    ; SysTick寄存器组的基地址MOV R1, #0             ; 编程前先除能SysTickSTR R1, [R0]STR R1, [R0,#0x8]      ; 清零CURRENTLDR R1, =(300-12)      ; 设置装载值。减去12是为了补偿中延迟STR R1, [R0,#0x4]      ; 写入RELOADLDR R4, =SysTickFired  ; 在RAM中的一个变量,指示是计时到期MOV R5, #0             ; 初始为0STR R5, [R4]MOV R1, #0x7           ; 使用FCLK,使能SysTick,使能SysTick异常STR R1, [R0]           ; 启动计时LDR R4, =SysTickFired
WaitLoopLDR R5, [R4]           ; 循环查询软件标志CMP R5, #0BEQ WaitLoop...                    ; SysTickFired在服务例程中被置位,主程序可以继续执行

2.4  重定位向量表

因为计数器是从 0 开始计数的,所以它会立即把 300‐12 加载入 CURRENT。 12 是中断响应的最短延时,因此减去它用以补偿。但是如果有更高优先级的异常抢占或者阻塞了它,则中断延迟还是会有的。

SetupExcpHandler 来建立向量表,但注意:必须重定位向量表到RAM 中才行。

SetupExcpHandler; 入口条件: R0 = 异常号; 入口条件: R1 = 异常服务例程PUSH {R0, R2, LR}LDR R2, =NVIC_VECTTBLLDR R2, [R2]                ; 读取向量表的地址STR.W R1, [R2, R0, LSL #2]  ; 表中[R2+R0<<2]的位置就是为该向量的POP {R0, R2, PC}            ; 快速返回

2.5 消灭二次触发

2.4节 重定位向量表时,减去12 只适用于一次性(one shot)的闹钟操作,必须在 SysTick 服务例程中按停这个 SysTick。进一步地,如果其它异常把它延迟得太久,就有可能会使 SysTick异常被悬起两次。因此,对于单次处理时,还需要其它一些步骤来消灭二次触发:

SysTickAlarm                ; SYSTICK exception handlerPUSH {LR}LDR R0, =0xE000E010     ; SYSTICK寄存器组的基地址MOV R1, #0STR R1, [R0]            ; 除能SysTick,因为只使用一次LDR R0, =0xE000ED04LDR R1, =0x02000000     ; 手工清除NVIC中的SysTick悬起位STR R1, [R0]...                     ; 执行所需的处理工作LDR R2, = SysTickFiredLDR R1, [R2]ORR R1, #1STR R1, [R2]            ; 设置软件标志,与主程序同步,以执行任务POP {PC}                ; 异常返回

在服务例程的末尾处,通过设置 SysTickFired 标志,通知主程序定时已经到期,可以结束循环等待了。
 

3 SysTick在FreeRTOS中的应用

3.1 STM32Cube配置SysTick

笔者以STM32103RTB芯片作为平台配置SysTick和FreeRTOS

1) 配置FreeRTOS的系统时钟为SysTick

2)使能FreeRTOS

3.2 STM32HAL中sysTick接口

在STM32HAL库中定义在core_cm3.h中,这部分代码在实际项目应用中,不建议修改,用户可以重新stm32f1xx_hal.c中和sysTick相关的应用接口。在这个文件中,和sysTick相关的应用接口被定义为__weak类型,意味着其可以被重写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在docker中运行SLAM十四讲程序

《十四讲》的示例程序依赖比较多&#xff0c;而且系统有点旧。可以在容器中运行。 拉取镜像 docker pull ddhogan/slambook:v0.1这个docker对应的github&#xff1a;HomeLH/slambook2-docker 拉下来之后&#xff0c;假如是Windows系统&#xff0c;需要使用XLaunch用于提供X11…

面试大杂烩之kafka

面试这个领域最近环境不行&#xff0c;所以卷起来流量挺大 关于K8s 其实看我之前的博客&#xff0c;k8s刚有点苗头的时候我就研究过&#xff0c;然后工作的时候间接接触 也自己玩过 但是用的不多就忘记了&#xff0c;正苦于不知道写什么&#xff0c;水一篇 用来面试应该是够了…

C++ | Leetcode C++题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDepth(TreeNode *root) {if (root nullptr) {return 0;}queue<pair<TreeNode *, int> > que;que.emplace(root, 1);while (!que.empty()) {TreeNode *node que.front().first;int depth que…

huggingface 笔记:PretrainModel

1 from_pretrained 从预训练模型配置中实例化一个 PyTorch 预训练模型默认情况下&#xff0c;模型使用 model.eval() 设置为评估模式&#xff08;Dropout 模块被禁用&#xff09; 要训练模型&#xff0c;应该首先使用 model.train() 将其设置回训练模式 1.1 主要参数 pretra…

java 子类继承父类

为什么需要继承 我现在要有两个类一个 一个是小学生&#xff0c;一个是大学生 代码 小学生 package b; public class encapsulatio{public String name;public int age;public double score;public void setscore (double score) {this.scorescore;}public void testing() {S…

(三)MySQL 索引

欢迎访问 什么是索引&#xff1f; 提高查询效率的一种数据结构&#xff0c;索引是数据的目录 索引的分类 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存储」分类&#xff1a;聚簇索引、二级索引。按「字段特性」分类&#xff1a;主键索引…

Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

详细实现操作步骤 具体实现内容&#xff1a;我们运用 Spring6 和 MyBatis 实现一个转账操作(该转账操作&#xff0c;进行一个事务上的控制&#xff0c;运用 MyBatis 执行 SQL 语句)。 第一步&#xff1a;准备数据库表 使用t_act表&#xff08;账户表&#xff09; 连接数据库的…

三个有意思的链表面试题的完成

上一篇博客我们已经完成了链表的所有内容&#xff0c;那么这一篇博客我们来看一下三个特别有意思的链表题目。 **第一个题目如下&#xff1a;**相信不少朋友看到这题目就已经晕了&#xff0c;那就简单说明下这个题目&#xff0c;题目就是创建一个链表&#xff0c;其中每个节点…

Android14 - 绘制系统 - 概览

从Android 12开始&#xff0c;Android的绘制系统有结构性变化&#xff0c; 在绘制的生产消费者模式中&#xff0c;新增BLASTBufferQueue&#xff0c;客户端进程自行进行queue的生产和消费&#xff0c;随后通过Transation提交到SurfaceFlinger&#xff0c;如此可以使得各进程将缓…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景&#xff1a;编辑弹框省份字段下拉框必填&#xff0c;触发方式change&#xff0c;有值第一次打开不会触发校验提示&#xff0c;关闭弹框再次打开触发必填校验提示&#xff0c;但是该字段有值 问题的原因是&#xff1a;在关闭弹层事件中&#xff0c;我做了resetfileds&…

SpringBoot + MybatisPlus

SpringBoot MybatisPlus 整合记录 1. 硬件软件基本信息2. 相关链接3. 通过idea快速生成一个Springboot项目4. 启动报错问题解决问题一&#xff1a;Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”问题二&#xff1a;启动的时候提示需要一个Bean&#xff0…

电磁仿真--CST网格介绍

1. 简介 网格会影响仿真的准确性和速度&#xff0c;花时间理解网格化过程是很重要的。 CST 中可用的数值方法包括FIT、TLM、FEM、MoM&#xff0c;使用不同类型的网格&#xff1a; FIT和TLM&#xff1a;六面体 FEM&#xff1a;四面体、平面 MoM&#xff1a;表面 CFD&#…

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的网络攻击手段&#xff0c;它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程&#xff0c;包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…

【408真题】2009-16

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

推荐一个快速开发接私活神器

文章目录 前言一、项目介绍二、项目地址三、功能介绍四、页面显示登录页面菜单管理图表展示定时任务管理用户管理代码生成 五、视频讲解总结 前言 大家好&#xff01;我是智航云科技&#xff0c;今天为大家分享一个快速开发接私活神器。 一、项目介绍 人人开源是一个提供多种…

Golang | Leetcode Golang题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; func hasPathSum(root *TreeNode, sum int) bool {if root nil {return false}if root.Left nil && root.Right nil {return sum root.Val}return hasPathSum(root.Left, sum - root.Val) || hasPathSum(root.Right, sum - roo…

C++常见知识点总结

常见字符 * 注释&#xff1a;/* 这是一个注释*/乘法&#xff1a;a * b取值运算符&#xff1a;*指针变量&#xff0c;int a 4&#xff0c;*a &#xff1f;&#xff1f;&#xff1f;&#xff1f;指针变量&#xff1a;数据类型 *变量名&#xff0c; int *no &bh&#xff0…

SAP揭秘者-怎么执行生产订单ATP检查及其注意点

文章摘要&#xff1a; 上篇文章给大家介绍生产订单ATP检查的相关后台配置&#xff0c;大家可以按照配置步骤去进行配置&#xff0c;配置完之后&#xff0c;我们接下来就是要执行ATP检查。本篇文章具体给大家介绍怎么来执行生产 订单ATP检查及其注意点。 执行生产订单ATP检查的…

Qt for android 获取USB设备列表(二)JNI方式 获取

简介 基于上篇 [Qt for android 获取USB设备列表&#xff08;一&#xff09;Java方式 获取]&#xff0c; 这篇就纯粹多了&#xff0c; 直接将上篇代码转换成JNI方式即可。即所有的设备连接与上篇一致。 (https://listentome.blog.csdn.net/article/details/139205850) 关键代码…

Android卡顿丢帧低内存与adb shell内存状态

Android卡顿丢帧低内存与adb shell内存状态 卡顿丢帧除了CPU/GPU层面&#xff0c;另外&#xff0c;也需要特别注意整机低内存情况。kswapd0 是一个内核工作线程&#xff0c;内存不足时会被唤醒&#xff0c;做内存回收工作。 当内存频繁在低水位的时候&#xff0c;kswapd0 会被频…