SysTick 定时器详细学习笔记并兼容FreeRTOS

2023-05-16

文章目录

  • 一:基础知识
  • 二:SysTick 的时钟频率
  • 三:SysTick 的配置
  • 四:SysTick 实现精准延时并兼容 FreeRTOS
  • 五:参考


一:基础知识

  1. SysTick 是什么?

    SysTick:系统定时器,是一个 24bit 的向下递减的计数器(计数器每计数一次的时间为 1/SYSCLK,SYSCLK 为系统的是时钟频率(72M、168M等))。属于 CM3 内核中的一个外设,并且内嵌在 NVIC 中。

  2. SysTick 的特点

    • SysTick 常常用作 延时 或 用于产生时基,维持操作系统的“心跳”。即该硬件定时器用来产生某些使用了时基的系统(FreeRTOS、UCOS 等)需要的“滴答”中断。
    • SysTick 是属于 CM3 内核的外设,所有基于 CM3 内核的单片机都具有这个系统定时器。使得操作系统和其它系统软件在 CM3 器件间可以很容易的移植。
    • 该定时器的时钟源可以是内部时钟(FCLK, CM3 上的自由运行时钟),或者是外部时钟( CM3 处理器上的 STCLK 信号)。 具体需要检视芯片的器件手册来决定选择什么作为时钟源。
    • 节省 MCU 外设资源(不浪费 MCU 内部集成的 TIMER),睡眠模式下也可以工作。

​ SysTick 定时器可以选择不同的时钟源,可以产生中断,并且 SysTick 定时器是一个倒计数的计数器,每隔一个时钟周期计数值减一,计数至 0 后重新从计数初值处开始倒计数。因此,SysTick 也可用作精准延时。 ​ SysTick 定时器在《STM32F10x- 参考手册》里一个屁都没放,只有在《ARM Cortex-M3 技术参考手册》和《ARM Cortex-M3 权威指南》才找到相关寄存器的介绍。

二:SysTick 的时钟频率

  • 在《STM32F10x- 参考手册》中查看有关 SysTick 时钟频率的时钟树。如下图
    在这里插入图片描述

从图中可以看出 SysTick 有两种模式:一种是 8 分频模式(AHB/8),一种是 FCLK 模式(AHB)。AHB 最大频率可为 SYSCLK (在 f1系列为 72M,f4 系列为 168M )。详细参看《STM32F10x 参考手册》。

三:SysTick 的配置

  • 《ARM Cortex-M3 权威指南》中 SysTick 包含四个寄存器,都是 24 位的寄存器,分别是:
    在这里插入图片描述
  • 从上图可以得知,Systick 寄存器 分别为:
    1. CTRL:控制和状态寄存器。主要用作 配置 SysTick 的时钟源、开启 SysTick 定时器中断以及开启 SysTick 定时器。
    2. LOAD:重装载数值寄存器。主要作用就是配置 SysTick 的重装载值(一般是配置为 1ms 或者1us 需要递减计数的数值。比如在频率为 72M 下,1us 就需要计数 72 下,1ms 需要递减 72000 下。)并且需要注意的是,SysTick 定时器是一个 24 位递减计数器,所以重装载数值寄存器 LOAD 仅仅用到低 24 位(bit0 ~ bit23),从而使得可以设置的最大值为 16777215。
    3. VAL:当前数值寄存器。主要作用就是用 延时函数中。(在后面的 us 延时函数中有用到)。
    4. CALIB:校准数值寄存器。我没怎么用过,就不怎么清楚。

​ 综上所述,SysTick 是一个 24 位的倒计数定时器,当技术到 0 时,会产生 “滴答” 并 将从 RELOAD 寄存器中自动重装载定时初值。只要 SysTick 控制及状态寄存器中的使能位没有清 0,SysTick 定时器就会一直运行。

  • 在 core_cm3.h 中声明了可使用的 SysTick 的结构体,声明如下:

    typedef struct
    {
      __IO uint32_t CTRL;                    /*控制和状态寄存器 */
      __IO uint32_t LOAD;                    /*重装载数值寄存器*/
      __IO uint32_t VAL;                     /*当前数值寄存器*/
      __I  uint32_t CALIB;                   /*校准数值寄存器*/
    } SysTick_Type;
    
  • 其次,在 core_cm3.h 中,将 (SysTick_Type *) 进行宏定义为 SysTick。方便后面直接访问结构体内相关成员。

SysTick 初始化编程步骤

  1. 配置 SysTick 时钟源

    固件库函数:SysTick_CLKSourceConfig( );

    头文件:misc.h

    参数: SysTick_CLKSource_HCLK_Div8 --> AHB 的8分频

    ​ SysTick_CLKSource_HCLK --> AHB

  2. 配置 SysTick 的重装载值

  3. 开 SysTick 中断 以及 开启 SysTick 定时器

四:SysTick 实现精准延时并兼容 FreeRTOS

SysTick 定时器初始化脑图

在这里插入图片描述

SysTick 进行初始化代码

void delay_init(u8 SYSCLK)
{
	u32 reload;
 	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 
	fac_us=SYSCLK;							//不论是否使用 OS,fac_us 都需要使用,即 记录 1us 所需要的节拍数
	reload=SYSCLK;							//每 1us 的计数次数   
	reload*=1000000/configTICK_RATE_HZ;		//根据 FreeRTOS 中的 configTICK_RATE_HZ设定溢出时间,FreeRTOS 需要每 1ms 的定时器中断,因此设置的重装载数值为 SYSCLK*1000。 
	fac_ms=1000/configTICK_RATE_HZ;			//代表 OS 可以延时的最少单位,在 os 下,代表每个节拍的ms 数	   
	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启 SYSTICK 中断
	SysTick->LOAD=reload; 					//因为加 入FreeRTOS,所以设置为每 1ms 中断一次	
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启 SYSTICK     
}	
  • 注释:假设系统频率为 72M HZ,那么 SysTick 定时器每 1s 的计数数值为 72000000。同理,SysTick 定时器节拍数为 72000,那么就是 1ms;为 72,就是 1us。

微妙延时函数的实现

void delay_us(u32 nus) 						// nus:要延时的 us 数
{		
	u32 ticks;								// 记录需要延时微妙时间的 节拍数
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值,重装载的数值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 = 需要延时 us 数 * 1us 所需要的节拍数 
	told=SysTick->VAL;        				//通过 VAL 寄存器记录刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
}
  • 延时函数的实现过程如下:
    在这里插入图片描述

毫秒延时函数的实现

// 延时 nms,会引起任务调度
void delay_ms(u32 nms)				//nms:要延时的ms数
{	
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
	{		
		if(nms>=fac_ms)						//延时的时间大于OS的最少时间周期,即大于1ms
		{ 
   			vTaskDelay(nms/fac_ms);	 		//FreeRTOS延时
		}
		nms%=fac_ms;						//OS已经无法提供这么小的延时了,采用普通方式延时    
	}
	delay_us((u32)(nms*1000));				//普通方式延时,毫秒延时 = 微妙延时 * 1000
}

//延时nms,不会引起任务调度
void delay_xms(u32 nms)				//nms:要延时的ms数
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}

五:参考

【1】STM32: SysTick系统定时器–滴答定时器

【2】Systick定时器

【3】Stm32-SysTick详解

【4】单片机(四)Systick系统定时器

【5】SysTick定时器

【6】STM32F103 Systick配置

【7】《STM32F10x- 参考手册》

【8】《ARM Cortex-M3 技术参考手册》

【9】《ARM Cortex-M3 权威指南》

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

SysTick 定时器详细学习笔记并兼容FreeRTOS 的相关文章

  • C++ Exception

    Exception type Derived types scattered throughout different library headers bad alloc Exception thrown on failure alloca
  • 什么是最优化问题(Optimization Problem)?

    最优化问题是人们在科学研究和生产实践中经常遇到的问题 1 人类所从事的一切生产或者社会活动均是有目的的 其行为总是在特点的价值观念或者审美取向的支配下进行的 xff0c 因此经常面临一个可行的甚至是最优化的方案的决策问题 这就是最优化问题
  • 单例模式(java代码实现)

    应用单例模式时 xff0c 类只能有一个对象实例 xff0c 这么做的目的是避免不一致状态 饿汉式单例 xff1a xff08 立即加载 xff09 饿汉式单例 public class Singleton1 指向自己实例的私有静态引用 x
  • C++函数后面加“:”的含义

    转载 xff1a C 43 43 函数后面加 xff1a 的含义 hhd1988的专栏 CSDN博客 1 c 43 43 成员函数后面跟 xff1a 表示的是赋值 xff0c 这是c 43 43 的特性 如下 xff1a A int aa
  • 因子图(factor graph)

    因子图 xff08 factor graph xff09 Factor Graph 是概率图的一种 xff0c 概率图有很多种 xff0c 最常见的就是Bayesian Network 贝叶斯网络 和Markov Random Fields
  • 词袋模型(Bag of Features,BOF)

    Bag of Features xff08 BOF xff09 对于程序而言这个人就是一堆像素嘛 xff0c 让它直接找的话它只能一个个像素的去比较然后返回最接近的了 xff08 近邻算法 xff09 但是现实中物体的形状颜色会发生变化 x
  • SNMPv3基于用户的安全模型USM及消息格式

    一 USM相关网址 SNMPv3使用了基于用户的安全模型USM RFC 3411 Architecture for SNMP Frameworks http www ietf org rfc rfc3411 txtRFC 3414 User
  • 超详细的python搭建区块链(下)

    在前面 超详细的python搭建区块链 xff08 中 xff09 我们搭建了一个简单的区块链 在这个简单的区块链能够实现交易 挖矿等基本功能 不过 xff0c 区块链上的节点应该是分散的 如果它们是分散的 xff0c 我们究竟如何确保它们
  • RuntimeError: Expected 4-dimensional input for 4-dimensional weight [32, 1, 5, 5]

    文章目录 1 问题引入2 运行报错3 代码4 分析原因5 解决办法6 完整代码7 参考文献 1 问题引入 今天在使用pytorch训练一个模型的 xff0c 数据集的读取是使用pytorch自带的函数来进行读取和预处理的 xff0c 网络使
  • 如何在Linux服务器上安装Anaconda(超详细)

    目录 1 安装Anaconda1 1 下载anaconda的安装包1 2 解决安装出现的bug1 3 安装anaconda1 4 点击Enter xff08 回车键 xff09 1 5 输入 yes1 6 继续点击 Enter1 7 输入
  • Pytorch实现FGSM(Fast Gradient Sign Attack)

    目录 1 相关说明2 相关简述3 代码实现3 1 引入相关包3 2 输入3 3 定义被攻击的模型3 4 定义FGSM攻击函数3 5 测试函数 4 可视化结果5 可视化对抗样本6 预训练模型下载7 训练模型8 完整代码 1 相关说明 最近在整
  • RuntimeError: element 0 of tensors does not require grad and does not have a grad_

    文章目录 1 问题描述2 解决方案2 1 方案12 2 方案2 3 参考文献 1 问题描述 今天在跑代码的过程中 xff0c 因为要训练一个模型然后在测试阶段使用PGD来生成相应的adv image来测试这个模型 xff0c 结果运行到测试
  • Pycharm 搭建 Django 项目 (非常详细)

    目录 1 安装需求2 准备工作2 1 新建项目2 2 输入相关配置2 3 项目创建完成2 4 查看安装 Django 版本2 5 启动项目2 6 解决一点小问题 3 一点小补充4 参考文献 1 安装需求 在使用 python 框架 Djan
  • Docker

    官方网站 xff1a https www docker com Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c
  • SpringBoot + Thymeleaf 实现发送验证码计时器功能

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 功能需求2 效果图展示3 代码4 参考文献5 联系我 1 功能需求 实现找回密码然后点击获取验证码之后出现XX秒候重新获取
  • 解决 SpringBoot 图片加载失败

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 问题描述2 解决方案2 1 打开 IDEA 3 参考文献 1 问题描述 在使用 SpringBoot 开发项目的时候发现了
  • 仿牛客论坛项目部署总结

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 前言2 部署项目需求3 环境配置3 1 阿里云服务器3 2 本地文件上传到服务器3 3 MySQL配置与安装3 4 Mav
  • 时间片轮转调度算法的计算

    在分时系统中 xff0c 最简单最常用的就是基于时间片轮转调度算法 xff0c 时间片轮转调度算法是非常公平的处理机分配方式 xff0c 让就绪队列的每个进程每次仅运行一个时间片 1 时间片轮转调度算法的基本原理 在时间片轮转调度算法中 x
  • IntelliJ IDEA添加注释常用的快捷键

    IDEA可以使用快捷键添加行注释Ctrl 43 块注释Ctrl 43 Shift 43 xff0c 还可以快速生成类注释 方法注释等 下面就介绍这几种快捷键的用法 1 行注释Ctrl 43 首先你的光标要处于这一行 xff0c 处于这行的哪
  • Android Studio 设置代码提示和代码自动补全快捷键

    想必使用过Eclipse的小伙伴们都习惯Eclipse快捷键带来的方便 但是当我们使用Android studio来进行开发的时候也想要这种方便该怎么办呢 当然使用过Android studio的小伙伴可能已经知道了它的方便以及强大之处 接

随机推荐

  • 编写一个算法,实现一维数组a输入任意n个整数,假设n=7,输入7个数字为3,7,6,8,9,4,1

    问题描述 编写一个算法 xff0c 实现一维数组a输入任意n个整数 xff0c 假设n 61 7 xff0c 输入7个数字为3 7 6 8 9 4 1 xff0c 然后建立一个具有如图所示的方阵 xff0c 并输出打印 1 3 7 6 8
  • 1.0 DS1302-外部RTC

    一 综述 DS1302是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 xff0c 因为应用非常广泛 xff0c 结果就导致了大量的国产仿制品 xff0c GC1302是一款国产DS1302仿制芯片 xff0c 使用方法
  • 现代C++语言

    include lt iostream gt include lt limits gt include lt future gt include lt string gt include lt map gt using namespace
  • ubuntu 解压 打包 命令全集

    tar 解包 xff1a tar xvf FileName tar 打包 xff1a tar cvf FileName tar DirName xff08 注 xff1a tar是打包 xff0c 不是压缩 xff01 xff09 gz 解
  • 在IDEA中解决进行有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    springboot默认的打包是如下 xff1a lt build gt lt plugins gt lt plugin gt lt groupId gt org springframework boot lt groupId gt lt
  • Jetson Nano更换软件源

    Nano的镜像默认是国外的源 xff0c 速度很慢 xff0c 国内的源有的上不去 xff0c 有的包无法安装 xff0c 经过测试清华大学的源完美可用 xff0c 现放上教程 首先备份原本的source list文件 sudo cp et
  • prometheus在k8s中的部署

    1 k8s的监控指标 监控指标具体实现举例Pod性能cAdvisor容器CPU xff0c 内存利用率Node性能node exporter节点CPU xff0c 内存利用率K8S资源对象kube state metricsPod Depl
  • vue前端

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VueCli 脚手架的安装

    配置淘宝npm仓库 xff1a span class token function npm span config span class token builtin class name set span registry https re
  • vue进阶知识

    Vue单文件组件 xff08 又名 vue文件 xff0c 缩写为SFC xff09 是一种特殊 的文件格式 xff0c 它允许讲Vue组件的模板 逻辑与样式封装在 单个文件中 正如所见 xff0c Vue SFC 是经典的 HTML CS
  • ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

    1 背景 xff1a shell脚本在主机器上执行kafka的启动命令 其他机器也会起这个进程 之前的脚本每次执行的时候出现卡住的现象 xff0c 不能回到命令行 解决方法 xff1a 第一种 span class hljs comment
  • centos升级glibc(升级到 2.17版)

    1 原先的系统glibc库的版本是2 12 xff0c 需要升级到2 17版本 下载地址 xff1a http ftp gnu org gnu glibc glibc 2 17 tar gz 这里可以选择你所需要的版本 2 安装部署 roo
  • u盘启动盘安装centos7.4操作系统

    1 使用UltraISO软件将ISO镜像刻录到U盘 xff0c 然后用u盘安装操作系统 制作好的u盘如下所示 xff1a 2 启动华为h3c服务器 xff0c 出现下面的界面 按照提示按住Ctrl 43 A制作raid 继续点击下一步 xf
  • redis一主一从两台机器高可用

    目录 1 机器规划 2 redis的部署安装 2 1配置文件内容 2 2 启动2台机器上的redis服务 2 3 查看2台机器上redis数据信息 3 redis主从之间手动切换 3 1 停掉22上的redis进程 xff0c 到23从re
  • cumulusclips的部署

    描述 xff1a CumulusClips是一个开源的视频分享 xff08 内容管理 xff09 平台 xff0c 能够提供最佳的视频分享功能之一类似YouTube 在CumulusClips的帮助下 xff0c 您可以开始自己的视频分享网
  • Linux安装nodejs和npm

    最近window系统转向linux系统开发 xff0c linux系统的确适合程序员的开发 作为前端安装了nodejs和npm xff0c 遇到了一些坑 xff0c 赶紧记录下来 第一种安装方法 xff1a 安装nodejs xff1a s
  • python 编写的DHT Crawler 网络爬虫

    1 安装boost依赖和编译环境 yum install y boost boost devel yum install y make gcc gcc c 43 43 kernel devel python devel 2 装 libtor
  • nginx location proxy_pass详解

    在nginx中配置proxy pass时 xff0c 如果在proxy pass后面的url加 xff0c 相当于是绝对根路径 xff0c 则nginx不会把location中匹配的路径部分代理走 如果没有 xff0c 则会把匹配的路径部分
  • hbase代码说明(通话记录查询)

    Hbase的项目 xff08 通话记录查询 xff09 写java的包 导入jar包 Hbase的包 xff0c hadoop的包 xff0c 驱动包 配置文件 xff08 hbase hdfs regionserver backup xf
  • SysTick 定时器详细学习笔记并兼容FreeRTOS

    文章目录 一 xff1a 基础知识二 xff1a SysTick 的时钟频率三 xff1a SysTick 的配置四 xff1a SysTick 实现精准延时并兼容 FreeRTOS五 xff1a 参考 一 xff1a 基础知识 SysTi