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, =15
    LDR r1, =SysTickAlarm  ; SysTick异常服务例程为SetupExcpHanler
    BL SetupExcpHandler    ; 调用前面章节讲到的子程来建立向量
    LDR R0, =0xE000E010    ; SysTick寄存器组的基地址
    MOV R1, #0             ; 编程前先除能SysTick
    STR R1, [R0]
    STR R1, [R0,#0x8]      ; 清零CURRENT
    LDR R1, =(300-12)      ; 设置装载值。减去12是为了补偿中延迟
    STR R1, [R0,#0x4]      ; 写入RELOAD
    LDR R4, =SysTickFired  ; 在RAM中的一个变量,指示是计时到期
    MOV R5, #0             ; 初始为0
    STR R5, [R4]
    MOV R1, #0x7           ; 使用FCLK,使能SysTick,使能SysTick异常
    STR R1, [R0]           ; 启动计时
    LDR R4, =SysTickFired
WaitLoop
    LDR R5, [R4]           ; 循环查询软件标志

    CMP R5, #0
    BEQ WaitLoop
    ...                    ; SysTickFired在服务例程中被置位,主程序可以继续执行

2.4  重定位向量表

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

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

SetupExcpHandler
                            ; 入口条件: R0 = 异常号
                            ; 入口条件: R1 = 异常服务例程
    PUSH {R0, R2, LR}
    LDR R2, =NVIC_VECTTBL
    LDR 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 handler
    PUSH {LR}
    LDR R0, =0xE000E010     ; SYSTICK寄存器组的基地址
    MOV R1, #0
    STR R1, [R0]            ; 除能SysTick,因为只使用一次
    LDR R0, =0xE000ED04
    LDR R1, =0x02000000     ; 手工清除NVIC中的SysTick悬起位
    STR R1, [R0]
    ...                     ; 执行所需的处理工作
    LDR R2, = SysTickFired
    LDR R1, [R2]
    ORR R1, #1
    STR 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类型,意味着其可以被重写。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【编译原理】LL(1)预测分析法

一、实验目的 LL(1)的含义&#xff1a;第一个L表明自顶向下分析是从左向右扫描输入串&#xff0c;第2个L表明分析过程中将使用最左推导&#xff0c;1表明只需向右看一个符号便可决定如何推导&#xff0c;即选择哪个产生式进行推导。 LL(1) 预测分析方法是确定的自顶向下的语…

leetcode-189. 旋转数组 原地递归算法(非官方的三种方法)

Problem: 189. 轮转数组 思路 首先&#xff0c;很明显&#xff0c;题目要求的操作等同于将数组的后k%n个元素移动到前面来。 然后我们思考原地操作的方法&#xff1a; &#xff08;为了方便讲解&#xff0c;我们先假设k<n/2&#xff09; 1.我们将数组划分为 [A&#xff0c;B…

电能抄表是什么?

1.电能抄表的概念和功能 电能抄表&#xff0c;说白了&#xff0c;是一种用于数据记录载入电力工程使用量的机器。它主要职能精确测量做好记录客户在一定时间内的耗电量&#xff0c;为供电公司提供准确的收费根据。电能抄表的应用&#xff0c;不仅方便了电费的清算&#xff0c;…

智源与HuggingFace联合推出开放中文大语言模型榜单 - 旗鉴榜

近日&#xff0c;智源研究院与 Hugging Face 开发者社区合作&#xff0c;发布 Open Chinese LLM Leaderboard&#xff0c;旨在跟踪、排名和评估开放式中文大语言模型&#xff0c;通过开源社区共建、用户自主贡献的方式&#xff0c;持续推动和完善中文语言大模型的科学、客观排名…

SW 弯曲找方向

当旋转弯曲轴的时候,半径和角度 越和理论的接近,越接近(只要输入角度,然后旋转弯曲轴,看半径跟随的变化值)

结合时间复杂度浅谈二分法的好处(将持续更新,绝对值你一个收藏)

前言 笔者虽然刷的算法题不多,但是笔者也敢说,二分法真的是一种很优越的算法,使用上限极高的那种,正因如此,笔者才想浅谈一下二分法. 封面是我很喜欢的一个游戏角色,不知道有没有老gal玩家知道! 什么是二分法? 枚举查找即顺序查找&#xff0c;实现原理是逐个比较数组 a[0:…

【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化+完美使用

模版介绍 【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化完美使用 腾讯官方出品discuz论坛DIY的后台设置&#xff0c;功能齐全&#xff0c;论坛功能不亚于葫芦侠&#xff0c;自定义马甲&#xff0c;自定义认证&#xff0c;自定义广告&#xff0c;完全可以打造出自己想…

微信小程序预览图片和H5使用canvas实现图片+蒙层+文字

1、效果 2.H5实现 <!--* Author: limingfang* Date: 2024-05-20 10:26:51* LastEditors: limingfang* LastEditTime: 2024-05-21 16:31:11* Description: --> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&q…

sysbench压测mysql性能测试命令和报告

sysbench压测mysql性能测试命令和报告 一、安装sysbench工具二、创建测试数据库三、基于sysbench构造测试表和测试数据四、数据库性能测试1、数据库读写性能测试2、数据库读性能测试3、数据库删除性能测试4、数据库更新索引字段性能测5、数据库更新非索引字段性能测试6、数据库…

Redis内存回收-内存淘汰策略

LFU的访问次数之所以叫做逻辑访问次数&#xff0c;是因为并不是每次key被访问都计数&#xff0c;而是通过运算&#xff1a; 生成0~1之间的随机数R计算 (旧次数 * lfu_log_factor 1)&#xff0c;记录为P如果 R < P &#xff0c;则计数器 1&#xff0c;且最大不超过255访问…

ASP+ACCESS多功能论坛程序设计

摘 要 随着计算机的广泛应用&#xff0c;人们已经对网络不再感到陌生。在科技飞速发展的今天&#xff0c;电脑信息技术与各行各业进行了有效的结合。人们在网上可以进行网上购物&#xff0c;网上交友&#xff0c;电子商务&#xff0c;网络营效等等。面对强大的网络功能&#x…

@Async详解,为什么生产环境不推荐直接使用@Async?

一、Async 注解介绍&#xff1a; Async 注解用于声明一个方法是异步的。当在方法上加上这个注解时&#xff0c;Spring 将会在一个新的线程中执行该方法&#xff0c;而不会阻塞原始线程。这对于需要进行一些异步操作的场景非常有用&#xff0c;比如在后台执行一些耗时的任务而不…

Vue3实战笔记(45)—VUE3封装一些echarts常用的组件,附源码

文章目录 前言一、柱状图框选二、折线图堆叠总结 前言 日前使用hooks的方式封装组件&#xff0c;在我使用复杂的图标时候遇到了些问题&#xff0c;预想在onMounted中初始化echarts&#xff0c;在使用hooks的时候&#xff0c;组件没有渲染完&#xff0c;使用实例会出现各种各样…

ArcGIS中分割与按属性分割的区别

1、分割ArcGIS批量导出各个市的县级行政边界 视频教学&#xff1a; ArcGIS批量导出各个市的县级行政边界002 2、ArcGIS批量导出全国各省的边界 视频教学&#xff1a; ArcGIS导出全国各省的边界003 推荐学习&#xff1a; ArcGIS全系列实战视频教程——9个单一课程组合系列直播回…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《计及温控厌氧发酵和阶梯碳交易的农村综合能源低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

ps进程查看命令详解

1、PS 命令是什么 查看它的man手册可以看到&#xff0c;ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态&#xff0c;可以使用top命令。 2、ps命令支持三种使用的语法格式 UNIX 风格&#xff0c;选项可以组合在一起…

「云渲染课堂」3dmax地砖材质参数怎么让画面更加真实?

在3DMAX中&#xff0c;地砖材质的渲染需要细致的调整&#xff0c;因为不同材质的地砖在反射和折射参数上各不相同。为了使地砖材质更加逼真&#xff0c;以下简要说明了一些设置方法&#xff0c;希望对大家有所帮助&#xff01; 3dmax地砖材质参数如何设置 1、打开材质编辑器&a…

Git提交和配置命令

一、提交代码到仓库 在软件开发中&#xff0c;版本控制是一个至关重要的环节。而Git作为目前最流行的版本控制系统之一&#xff0c;为我们提供了便捷高效的代码管理和协作工具。在日常开发中&#xff0c;我们经常需要将本地代码提交到远程仓库&#xff0c;以便于团队协作和版本…

C++ | Leetcode C++题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool hasPathSum(TreeNode *root, int sum) {if (root nullptr) {return false;}if (root->left nullptr && root->right nullptr) {return sum root->val;}return hasPathSum(root->left…