【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博客

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

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

相关文章

打开Outlook报错修复

打开Outlook报错修复 故障现象 打开outlook提示&#xff0c;outlook.exe --系统错误 故障截图 故障原因 原因是软连接指向错误重建即可。 解决方案 下载并运行下面批处理解决 del /F /Q "C:\Program Files\Microsoft Office\root\Office16\AppvIsvStream64.dll"…

WPF提供了哪些不同类型的画刷

在WPF中&#xff0c;画刷&#xff08;Brush&#xff09;用于填充图形对象&#xff08;如形状、控件的背景和前景&#xff09;的颜色和样式。WPF提供了几种不同类型的画刷&#xff1a; SolidColorBrush&#xff1a;这是最简单的画刷&#xff0c;它提供了一个单一的、固定的颜色。…

Pytorch部分报错问题

一、存在问题 1.链接库报错 问题报错&#xff1a;undefined symbol: __nvJitLinkAddData_12_1, version libnvJitLink.so.12 2.GPU不能使用 问题报错&#xff1a;在torch安装后测试gpu是否可用 torch.cuda.is_available() false 返回false 问题分析&#xff1a; 可能是…

yolov8系列[六]-项目实战-yolov8模型部署android

yolov8系列[六]-项目实战-yolov8模型部署android [TOC](yolov8系列[六]-项目实战-yolov8模型部署android) 参考:YOLOV8部署AndroidStudio

集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

下载地址&#xff1a; https://github.com/anerg2046/sns_auth 安装方式建议使用composer进行安装 如果linux执行composer不方便的话&#xff0c;可以在本地新建个文件夹&#xff0c;然后执行上面的composer命令&#xff0c;把代码sdk和composer文件一起上传到项目适当位置即…

aws服务器配置密码登陆

在 AWS 上&#xff0c;EC2 实例默认使用密钥对进行身份验证&#xff0c;而不是密码登录。不过&#xff0c;你可以通过以下步骤在 EC2 实例上启用密码登录&#xff1a; 登录 AWS 管理控制台并导航到 EC2 服务。 选择要配置密码登录的目标 EC2 实例。 在底部的 “描述” 标签页…

Leadshop开源商城小程序源码 – 支持公众号H5

Leadshop是一款出色的开源电商系统&#xff0c;具备轻量级、高性能的特点&#xff0c;并提供持续更新和迭代服务。该系统采用前后端分离架构&#xff08;uniappyii2.0&#xff09;&#xff0c;以实现最佳用户体验为目标。 前端部分采用了uni-app、ES6、Vue、Vuex、Vue Router、…

Python常用的第三方库----requests

文章目录 1. 发送GET请求代码示例:运行结果:2. 发送POST请求代码示例:运行结果:3. 上传文件代码示例:运行结果:4. 处理Cookies代码示例:运行结果:5. 自定义请求头代码示例:运行结果:6. 错误处理代码示例:运行结果:

考研数学笔记:线性代数中抽象矩阵性质汇总

在考研线性代数这门课中&#xff0c;对抽象矩阵&#xff08;矩阵 A A A 和矩阵 B B B 这样的矩阵&#xff09;的考察几乎贯穿始终&#xff0c;涉及了很多性质、运算规律等内容&#xff0c;在这篇考研数学笔记中&#xff0c;我们汇总了几乎所有考研数学要用到的抽象矩阵的性质…

基于安卓android微信小程序的装修家装小程序

项目介绍 巧匠家装小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要实现的功能后进行界面的设计&#xff0c;在这中间还要考虑如何可以更好的将功能及页面进行很好的结合&#xff0c;方便用户可以很容易明了的找到自己所需要的信息&#xff0c;还有系…

SpringBoot--中间件技术-4:整合Shiro,Shiro基于会话SessionManager实现分布式认证,附案例含源代码!

SpringBoot整合安全中间件Shiro 技术栈&#xff1a;SpringBootShiro 代码实现 pom文件加坐标 Springboot版本选择2.7.14 &#xff1b;java版本1.8 &#xff1b; shiro做了版本锁定 1.3.2 <properties><java.version>1.8</java.version><!--shiro版本锁定…

Linux系统编程——进程中vfork函数

函数原型 pid_t vfork(void);//pid_t是无符号整型 所需头文件 #include <sys/types.h> #include <unistd.h> 功能 vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程&#xff0c;但它们创建的子进程是有区别的。 返回值 成功子进程中返回 …

土木非科班转码测开,斩获10家大厂offer

大家好&#xff0c;我是洋子 24届秋招基本已经落下了帷幕&#xff0c;各大互联网大厂基本也开奖完毕&#xff0c;还没有拿到满意offer的同学也不要灰心&#xff0c;积极备战明年的春招。另外&#xff0c;25届想要找暑期实习的同学也可以开始准备起来了&#xff0c;基本大厂在春…

为什么程序员一定要写单元测试?

大家好&#xff0c;我是鱼皮&#xff0c;很多初学编程的同学都会认为 “程序员的工作只有开发新功能&#xff0c;功能做完了就完事儿”。但其实不然&#xff0c;保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。 之前给大家分享过企业项目的完整开发流程&am…

Visual Studio Code安装和设置中文

文章目录 Visual Studio Code安装Visual Studio Code设置中文 步骤如下: Visual Studio Code安装 1.下载安装包 VS Code的官网 下载链接中的“az764295.vo.msecnd.net” 替换为国内镜像地址“vscode.cdn.azure.cn”&#xff0c;下载速度直接飙升至几十 Mb/s。(在官网下载速度…

reticulate | R-python调用 | 安装及配置 | conda文件配置

reticulate | R-python安装及配置 | conda文件配置 1. 基础知识2. 安装reticulate from CRAN3. 包含了用于Python和R之间协同操作的全套工具&#xff0c;在R和Rstudio中均可使用4. 配置python环境4.1 4种环境配置方式4.2 miniconda 环境install_miniconda()报错一install_minic…

大模型时代的机器人研究

机器人研究的一个长期目标是开发能够在物理上不同的环境中执行无数任务的“多面手”机器人。对语言和视觉领域而言&#xff0c;大量的原始数据可以训练这些模型&#xff0c;而且有虚拟应用程序可用于应用这些模型。与上述两个领域不同&#xff0c;机器人技术由于被锚定在物理世…

【C++11】shared_ptr智能指针使用详解

系列文章目录 【C11】智能指针与动态内存 文章目录 系列文章目录简介一、头文件二、初始化1. make_shared2. 拷贝和赋值 三、实例 简介 shared_ptr 是一个类的模板&#xff0c;它使用引用计数的方式来管理一个动态分配的内存资源。shared_ptr 需要一个动态分配的对象时&#…

专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会&#xff0c;我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者&#xff0c;对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了&#xff0c;笔者解析过glide的源码&#xff0c;也是因为觉得自己熟悉一些&#xff0c;也就没太关注过项目里glide的具体使用对当前业务的影响&#xff1b;主要是自负&#xff0c;还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…