当前位置: 首页 > news >正文

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录

一、SysTick定时器

1、SysTick寄存器介绍

(1)控制及状态寄存器

(2)重装载数值寄存器

(3)当前数值寄存器

2、SysTick寄存器配置函数

二、FreeRTOS中的SysTick定时器

1、SysTick配置函数及分析

2、SysTick中断函数

三、其他操作配置FreeRTOS的SysTick

1、找到头文件 FreeRTOSConfig.h 有如下定义。

2、搜索 configTICK_RATE_HZ,在port.c中。

3、搜索 portNVIC_SYSTICK_CTRL_REG,在port.c中。

4、下面证明地址是不是SYSTICK的配置地址。

 5、跳转到 SysTick 定义处。


一、SysTick定时器

SysTick系统定时器是属于内核中的一个外设,内嵌在NVIC中。该定时器是一个24位的向下递减的计数器。在裸机编程中常用做延时函数,而在FreeRTOS中则用来给系统提供时钟的,因此非常重要。

1、SysTick寄存器介绍

SysTick共有4个相关寄存器,通常只用到3个(校准寄存器少用)。

寄存器名称寄存器描述
CTRLSysTick控制及状态寄存器
LOADSysTick重装载数值寄存器
VALSysTick当前数值寄存器
CALIBSysTick校准数值寄存器

(1)控制及状态寄存器

可通过读取第16位判断计数是否到0。

(2)重装载数值寄存器

       用来存放重装载数的,改变该值以调节计数时间。数值范围:0—(2^24-1)即(0-16777215)。

(3)当前数值寄存器

       该寄存器的值在递减,计数到0时会自动重载,数值为重装载数值寄存器内的值。

2、SysTick寄存器配置函数

        在库文件core_cm4.h (M4内核)中有相关配置函数,也可以重写。

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) /*参数ticks为计数值,最大2^24(已有减1操作)*/
{if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);/*判断传入的值是否满足,不能超过0xffffff*/SysTick->LOAD  = ticks - 1;                      /*将数值传入重装载数值寄存器*/NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /*设置Systick中断优先级*/SysTick->VAL   = 0;                                       /*清空当前值寄存器*/SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;  /* SysTick_CTRL_CLKSOURCE_Msk = 1<<2 *//* SysTick_CTRL_TICKINT_Msk   = 1<<1 *//* SysTick_CTRL_ENABLE_Msk    = 1<<0 *//*将第0、1、2位置1,即使能定时器,使能中断,选择系统时钟(168M或72M)*/return (0);                                                }

二、FreeRTOS中的SysTick定时器

在FreeRTOS中SysTick定时器尤为重要,因为它是给FreeRTOS系统提供时钟的。在FreeRTOS中任务的切换即每个任务运行的时间是由SysTick定时器提供的。

1、SysTick配置函数及分析

在FreeRTOS中已经提供了SysTick配置的函数vPortSetupTimerInterrupt(),函数在port.c文件中。当调用了开启任务调度函数vTaskStartScheduler()后里面就会调用该函数完成SysTick的配置。vPortSetupTimerInterrupt()函数分析:
 

#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) /*条件编译*/__weak void vPortSetupTimerInterrupt( void ){/* Calculate the constants required to configure the tick interrupt. */#if ( configUSE_TICKLESS_IDLE == 1 ) /*条件编译,这段不编译*/{ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );}#endif /* configUSE_TICKLESS_IDLE */portNVIC_SYSTICK_CTRL_REG = 0UL;            /*清空控制及状态寄存器*/portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;   /*清空当前值寄存器*//*设置重装载数值寄存器数值*//*168000000/1000=  168000重装载值,168000/168M=0.001S=1MS*/portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;/*设置控制及状态寄存器*/                    portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );/*( 1UL << 2UL ) | ( 1UL << 1UL ) | ( 1UL << 0UL ) *//*选择处理器时钟、开定时器中断、使能定时器*/}#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */

 

2、SysTick中断函数

在SysTick中断函数中并不是直接执行任务切换,而是将xTickCount进行加1操作,xTickCount是FreeRTOS的系统时钟节拍数,具体实现函数则是xTaskIncrementTick(),该函数在中断函数中被调用。中断函数的实现在port.c文件中也有定义:xPortSysTickHandler(),因此在SysTick中断函数中直接调用该函数即可。

void SysTick_Handler(void)
{     if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) //系统已经运行{xPortSysTickHandler(); //调用port.c中已写好的中断函数}}

三、其他操作配置FreeRTOS的SysTick

1、找到头文件 FreeRTOSConfig.h 有如下定义。

#define configCPU_CLOCK_HZ                        ((unsigned long)168000000)    //CPU频率
#define configTICK_RATE_HZ                        (( portTickType )1000)    //时钟节拍频率,这里设置为1000,周期就是1ms

2、搜索 configTICK_RATE_HZ,在port.c中。

portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

3、搜索 portNVIC_SYSTICK_CTRL_REG,在port.c中。

#define portNVIC_SYSTICK_CTRL_REG            ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
#define portNVIC_SYSTICK_LOAD_REG            ( * ( ( volatile uint32_t * ) 0xe000e014 ) )

4、下面证明地址是不是SYSTICK的配置地址。

STM32库函数中core_cm4.h中配置systick函数为 uint32_t SysTick_Config(uint32_t ticks)

SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */return (0UL);                                                     /* Function successful 

 5、跳转到 SysTick 定义处。

#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address  */
#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address                   */
#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address                   */
#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address                   */
#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address            */
#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address               */
#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                  */
#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address  */#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */
#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */

FreeRTOS学习笔记——SysTick中断-CSDN博客

STM32使用FreeRTOS时SysTick哪里配置的?_systic在哪配的-CSDN博客

FreeRTOS 之六 任务调度原理解析(Systick、PendSV、SVC)_freertos svc-CSDN博客

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍_freertos systick-CSDN博客

相关文章:

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 &#xff08;1&#xff09;控制及状态寄存器 &#xff08;2&#xff09;重装载数值寄存器 &#xff08;3&#xff09;当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …...

Vue3封装自定义指令+h()

官方install介绍 directive/myDir/index.js 定义指令 import { h, render, ref } from "vue"; const vMyDir {mounted(el, binding) {renderElement(el, binding);}, }; // inserted是Vue2的生命周期钩子&#xff0c;所以在Vue3项目中要使用mounted const renderEl…...

爆火的迅雷网盘推广,一手云盘app拉新推广渠道必备项目 学习资料

迅雷网盘是目前几个主流网盘拉新推广之一 都可以通过”聚量推客“申请 目前主流的为&#xff1a;夸克网盘拉新、uc网盘推广、迅雷网盘&#xff0c;但是由于阿里的原因 夸克目前不对外开放名额&#xff0c;需要等待&#xff0c;取而代之主流的云盘推广就是迅雷网盘了 聚量推客…...

Jmeter 请求返回多字段 —— 传递登录接口!

Jmeter创建JDBC请求获取登录账密&#xff0c;结果存储到变量中&#xff0c;依次传给登录接口。 1、添加JDBC Request并设置变量&#xff0c;获取数据库多个字段值 ①添加好JDBC Connection Configuration并做好数据库连接配置 ②导入mysql驱动jar包 ③测试计划->添加线程…...

es 7.0常用的命令

es 7.0常用的命令 es 7.0中只有索引和文档(document)&#xff0c;没有类型(type)了。 es新建索引&#xff1a; 格式&#xff1a; PUT /索引名称 {"mappings":{"properties":{"字段名称":{"type":"字段类型"}}} }PUT 加索…...

[文件读取]lanproxy 文件读取 (CVE-2021-3019)

1.1漏洞描述 漏洞编号CVE-2021-3019漏洞类型文件读取漏洞等级⭐漏洞环境VULFOCUS攻击方式 描述: Lanproxy 路径遍历漏洞通过../绕过读取任意文件。该漏洞允许目录遍历读取/../conf/config.properties来获取到内部网连接的凭据。 1.2漏洞等级 高危 1.3影响版本 Lanproxy 1.4漏洞…...

记录一种引起 CL.exe/ C++ 编译器无任何提示直接崩溃的问题

只需定义在源文件或公共引入的头文件之中&#xff0c;编译必定CL.exe 退出&#xff0c;错误代码2&#xff0c;它不会产生任何语法意义上的错误提示&#xff0c;感兴趣的可以记录下。 引发崩溃的代码&#xff1a; template <typename T> class IS_CONFIG_LOADER_T_CLASS…...

【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)题目描述解题思路java题解代码代码OJ评判结果代码讲解寄语【华为OD机试高分必刷题目…...

【Vue】过滤器Filters

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如对您有用&#xff0c;可以点赞收藏哈 过滤器 filters过滤器已从Vue 3.0中删除&#xff0c;不再支持了&#xff0c;这里可以作为了解进行学习 vue3要精简代码&…...

springcloud旅游网站源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索景区&#xff0c;轮播图&#xff0c;旅游攻略列表 点击攻…...

Unity中关于Lerp()方法的使用

在Unity中&#xff0c;Lerp()方法用于在两个值之间进行线性插值。 它的语法有&#xff1a; public static float Lerp(float a, float b, float t);//在两个float类型的值a和b之间进行线性插值 public static Vector2 Lerp(Vector2 a, Vector2 b, float t);//在两个Vector2类…...

计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

Android BottomSheetDialog中列表滑动冲突问题

前言 使用BottomSheetDialog弹窗时&#xff0c;里面嵌套了一个纵向的RecyclerView&#xff0c;弹出后加载列表数据&#xff0c;发现弹窗不能滑动&#xff0c;产生了滑动冲突。 一、使用步骤 1.布局示例 代码如下&#xff08;示例&#xff09;&#xff1a; <androidx.appco…...

sql查询查看数据库空间使用情况

SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),990.99) || % "使…...

算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令&#xff0c;代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征&#xff1a; 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性&#…...

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新

JPA提供了一种事件监听器的机制&#xff0c;用于SQL审计&#xff0c;通过监听器我们可以很快速地去自动更新创建时间、修改时间&#xff0c;主要步骤如下&#xff1a; 一、创建基础实体&#xff0c;包含了创建和修改时间&#xff0c;然后让其他真正的实体继承该实体&#xff0…...

Vue3集成json-editor-vue3

安装依赖 npm install json-editor-vue3 --save引入 main.js import "jsoneditor";具体模块 import JsonEditorVue from json-editor-vue3;代码实现 <json-editor-vue ref"jsonEditor" class"editor" v-model"state.addFormField.p…...

UML建模语言

UML建模语言 类的关系 依赖关系 类的方法中使用形参、局部变量或者静态方法的方式调用其他类&#xff0c;表示当前类依赖其他类。 public class Main {public void eat(Person person) {person.play();// 方法参数Student student new Student();student.study();// 局部变…...

centos7系统离线安装tcpdump抓包软件、使用教程

tcpdump 是Linux系统下的一个强大的命令&#xff0c;可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 本教程对tcpdump命令使用进行讲解说明&#xff0c;通…...

划分VOC数据集,以及转换为划分后的COCO数据集格式

1.VOC数据集 LabelImg是一款广泛应用于图像标注的开源工具&#xff0c;主要用于构建目标检测模型所需的数据集。Visual Object Classes&#xff08;VOC&#xff09;数据集作为一种常见的目标检测数据集&#xff0c;通过labelimg工具在图像中标注边界框和类别标签&#xff0c;为…...

C++中显示与隐式加载dll的使用与区别

一、什么是 DLL&#xff1f;DLL&#xff08;Dynamic Link Library&#xff09; 是 Windows 下的动态链接库&#xff0c;包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中&#xff0c;调用 DLL 中的函数有两种主要方式&#xf…...

Taotoken的TokenPlan套餐如何实现更经济的模型调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken的TokenPlan套餐如何实现更经济的模型调用 1. 理解TokenPlan的计费模式 在模型应用开发过程中&#xff0c;成本的可预测性…...

机器学习模型评估中的构念效度:超越基准测试分数的科学推断

1. 项目概述与核心问题在机器学习的日常研究和工程实践中&#xff0c;我们每天都在和各种各样的基准测试&#xff08;Benchmark&#xff09;打交道。无论是为了比较新提出的ResNet变体在ImageNet上的Top-1准确率&#xff0c;还是评估一个大型语言模型在MMLU上的常识推理能力&am…...

Python PIL 画矩形框

基础代码 from PIL import Image, ImageDraw# 打开图片 img Image.open(your_image.jpg)# 创建绘图对象 draw ImageDraw.Draw(img)# 矩形坐标 (x1, y1, x2, y2) coords (23, 21, 69, 76)# 画矩形框&#xff08;红色&#xff0c;线宽2&#xff09; draw.rectangle(coords, ou…...

特定任务需求场景下的过约束并联机构构型设计与控制方法【附代码】

✨ 长期致力于曲面加工、构型综合、运动学和动力学建模、性能评价、多目标优化、滑模控制、鲁棒控制、视觉传感技术研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;…...

抖音内容批量下载实战:从零开始构建个人视频资料库

抖音内容批量下载实战&#xff1a;从零开始构建个人视频资料库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

如何用免费工具解锁QQ音乐、网易云音乐等加密格式:3分钟解决音乐播放限制

如何用免费工具解锁QQ音乐、网易云音乐等加密格式&#xff1a;3分钟解决音乐播放限制 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web…...

告别复杂模型:用Python+OpenCV+dlib实现简易驾驶员疲劳监测(附完整代码)

轻量级驾驶员疲劳监测系统&#xff1a;PythonOpenCVdlib实战指南 在长途驾驶或夜间行车时&#xff0c;疲劳是导致交通事故的重要因素之一。传统基于嵌入式设备的疲劳监测系统往往需要专用硬件&#xff0c;增加了开发成本和部署难度。本文将介绍如何利用Python生态中的OpenCV和d…...

3分钟掌握抖音视频批量下载:解放双手的素材收集革命

3分钟掌握抖音视频批量下载&#xff1a;解放双手的素材收集革命 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为一个个手动保存抖音视频而烦恼吗&#xff1f;想要高效收集创作者素材却苦于没有合适的…...

企业级Veo 2提示词治理框架(含合规校验/版本回溯/效果归因三模块)——仅限首批500名开发者开放》

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Veo 2提示词治理框架的核心定位与演进逻辑 Veo 2提示词治理框架并非单纯的技术工具升级&#xff0c;而是面向AIGC生产环境规模化、合规化与可审计化需求的战略性基础设施重构。其核心定位在于将离散、经…...