IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍 -> 正文阅读

[嵌入式]【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录

一、SysTick定时器

1、SysTick寄存器介绍

(1)控制及状态寄存器

(2)重装载数值寄存器

(3)当前数值寄存器

2、SysTick寄存器配置函数

二、FreeRTOS中的SysTick定时器

1、SysTick配置函数及分析

2、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中已写好的中断函数
??? }

}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:35:13  更:2021-08-11 12:35:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 11:00:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码