Sys Tick【转】

news2024/11/25 2:57:37
STM32学习及应用笔记一:SysTick定时器学习及应用 - STM32/STM8技术论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
1SysTick究竟是什么?

关于SysTick在STM32的资料中并没有详细的介绍,这可能由于SysTick是ARM内核的东西。在《STM32F10xxx参考手册》、《STM32F4xx参考手册》以及《STM32F7xx参考手册》中,介绍时钟的时候仅仅是在使用树上简单的画出了HCLK时钟经过8分频后送到了Cortex系统时钟。对这个时钟的描述也非常的简单。在《STM32F10xxx参考手册》中仅仅说:“RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。”同样在《STM32F4xx参考手册》和《STM32F7xx参考手册》中,也只是说:“RCC 向 Cortex 系统定时器 (SysTick) 馈送 8 分频的 AHB 时钟 (HCLK)。”

另外,STM32在中断部分对SysTick也有一句话的描述。如在《STM32F10xxx参考手册》中的“9.1.1 系统嘀嗒(SysTick)校准值寄存器”中提到:“系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。”而在《STM32F4xx参考手册》的“10.1.2SysTick 校准值寄存器”一节和《STM32F7xx参考手册》“10.1.1SysTick 校准值寄存器”一节中也都有:“SysTick 校准值设置为 18750。当 SysTick 时钟设置为 18.75 MHz(HCLK/8,HCLK 设为150 MHz),会产生 1 ms 时间基准。”

仅看这些让我们觉得SysTick似乎都是定好的,但事实上并非如此,因为在库函数中有相关寄存器的操作函数。为了搞清楚这一点,我们必须查看Cortex-M3和M4的手册。在《Cortex-M3权威指南》的“第8章 NVIC与中断控制”中有比较详细的描述。首先很明确SysTick 就是一个定时器;其次SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常,主要适用于操作系统的“心跳”节律。关于SysTick的时钟来源最终还是由芯片厂商决定。

SysTick定时器能产生中断,并且是一个单独的异常类型,并且在向量表中有它的一席之地。并有四个寄存器来控制SysTick,在《Cortex-M3权威指南》中对他们的描述如下:

1)、STK_CSR控制寄存器:寄存器内有4个位具有意义

                              
 
2)、STK_LOAD 重载寄存器
 
Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就 会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24 位的寄存器最大计数0xFFFFFF。

 
 
3)、STK_VAL当前值寄存器
 
也是个24 位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

 
 
4)、STK_CALRB 校准值寄存器

 
 
2STM32中的SysTick
 
作为一用于系统级的24位递减计时器,在STM32中又是处理的呢?ST在手册里介绍的比较简单,但在库函数中却有比较清楚的定义。不论是标准库还是HAL库都有较为清楚的定义,如在标准库中就定义SysTick寄存器结构体机器操作函数,在misc.C文件中的SysTick_CLKSourceConfig函数,它是一个时钟源配置函数,其定义如下:
 
/*@功能:配置SysTick时钟源
 
*@输入参数:  SysTick_CLKSource:  指定 SysTick 时钟源.
 
*  该参数可以是以下其中一个值:
 
* @ SysTick_CLKSource_HCLK_Div8: AHB 时钟 8 分频作为SysTick时钟源
 
* @ SysTick_CLKSource_HCLK: AHB 时钟作为 SysTick 时钟源. */  
 
void SysTick_CLKSourceConfig(uint32_t Sy sTick_CLKSource)
 
{
 
assert_param(IS_SYSTICK_CLK_SOURCE(SysTi ck_CLKSource));
 
      if(SysTick_CLKSource==  SysTick_CLKSource_HCLK)
 
     {
 
SysTick->CTRL|= SysTi ck_CLKSource_HCLK;
 
}  
 
else
 
{
 
SysTick->CTRL&= SysTick_CLKSource_HCLK_Div8;
 
}
 
}
 
由此可见,在STM32中时钟可以设置为HCLK或者HCLK的8分频,根据使用的需求而定。默认不配置的话时钟就是HCLK的8分频。同样在HAL苦衷的定义也是如此。
 
在core_cm3.h文件中有寄存器定义:
 
typedefstruct
 
{
 
__IOuint32_t CTRL;
 
__IOuint32_t LOAD;
 
__IOuint32_t VAL;
 
__Iuint32_t CALIB;
 
}SysTick_Type;
 
还定义了一个SysTick_Config 函数
 
#if (!defined(__Vendor_Sy sTickConfig )) ||(__Vendor_SysTickConfig  == 0)
 
/**
 
* @功能  初始化并开启 Sy sTick 计数器及其中断
 
*@输入参数    ticks   两次中断间的 ticks 数值
 
*@返回值  1 =  失败, 0=成功
 
*  初始化系统滴答定时器及其中断并开启系统滴答定时器在自由运行模式下以产生周期中断*/
 
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
 
{
 
if(ticks >SysTick_LOAD_RELOAD_Msk)  return(1);/* 重装值超过了 24 位,是不可能的。返回失败值 0 */
 
SysTick->LOAD  =(ticks & SysTick_LOAD_RELOAD_Msk) - 1;/*  设置重装载寄存器  */
 
NVIC_SetPriority(SysTick_IRQn,( 1<<__NVIC_PRIO_BITS) - 1);  /*设置优先级for Cortex-M0系统中断*/
 
SysTick->VAL  = 0; /*装载计数器值(当前计数值清 0)  */
 
SysTick->CTRL =SysTick_CTRL_CLKSOURCE_Msk |
 
SysTick_CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk;/* 使能 Sy sTick 中断请求和 Sy stick 定时*/
 
return(0);          /*成功,返回 0 */
 
}
 
#endif
 
经过以上分析,我们我们需要,可以很方便的在自己的软件中操作SysTick来实现一些功能。
 
3STM32SysTick应用举例
 
既然SysTick我们已经清楚了他的原理及操作,也明白了STM32库中如何来操作它,那么我们能用他来做什么呢?首先我们可以在STM32中使用嵌入式操作系统的时候使用它来,并更具实际应用来设置。其实在不考虑操作系统是我们还可以使用SysTick来实现延时计时器。
 
一个实现的例子如下:
 
//定义延时计数的变量
 
__IO uint32_t TimingDelay;
 
const uint16_t delayAdjustments=12;
 
 
//函数名:ms延时函数
 
//描 述:参数1即为1ms,1000即为1s;只有几us的误差;
 
void Delayms(__IO uint32_t nTime)
 
{
 
while(SysTick_Config(SystemCoreClock/1000));
 
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;// 关闭滴答定时器
 
  TimingDelay = nTime;
 
  SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk;// 使能滴答定时器
 
  while(TimingDelay != 0);
 
  SysTick->CTRL=0x00; //关闭计数器
 
  SysTick->VAL =0X00; //清空计数器
 
}
 
 
//函数名:us延时函数
 
//描 述:参数1即为1us,1000即为1ms;只有几us的误差;
 
void Delayus(__IO uint32_t nTime)
 
{
 
  while(SysTick_Config(SystemCoreClock/1000000));
 
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;// 关闭滴答定时器
 
  TimingDelay = nTime;
 
  SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk;// 使能滴答定时器
 
  while(TimingDelay != 0);
 
  SysTick->CTRL=0x00; //关闭计数器
 
  SysTick->VAL =0X00; //清空计数器
 
}
 
 
//函数名:延时递减计数函数
 
//描 述:由systick的中断函数调用,实现延时数值的递减计数
 
void TimingDelay_Decrement(void)
 
{
 
  if (TimingDelay != 0x00)
 
  {
 
    TimingDelay--;
 
  }
 
}
 
 
//函数名:延时调整形式的delaynus函数
 
//描 述:参数1即为1us,1000即为1ms,根据时钟频率的不同时间不同
 
void delay_nus(uint16_t n)
 
{
 
  uint16_t j;
 
  while(n--)
 
  {
 
    j=delayAdjustments;//根据不同时钟频率的指令周期调整数值
 
    while(j--);
 
  }
 
}
 
 
//函数名:延时调整形式的delaynms函数
 
//描 述:参数1即为1ms,1000即为1s,根据时钟频率的不同时间不同
 
void delay_nms(uint16_t n)
 
{
 
  while(n--)
 
  {
 
    delay_nus(1000);
 
  }
 
}
 
4、参考文献
 
我们参考了一些经典的手册以及网络论坛上的一些讨论,无法一一列出,暂列出部分参考文献:
 
(1)、《Cortex-M3权威指南》
 
(2)、《STM32F10x参考手册》
 
(3)、《STM32F4参考手册》
 
(4)、《STM32F7参考手册》
 
(5)、《STM32F10x库函数说明》
 
(6)、《STM32F1 HAL库说明》
 
(7)、《STM32F4 HAL库说明》
 
(8)、《STM32F7 Hal库说明》

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

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

相关文章

在用对讲机中竟有近5成属于违规使用?

目前对讲机在很多领域和场景中都有着广泛的应用&#xff0c;包括建筑工地、宾馆饭店、住宅小区、大型商场超市、安保活动、物业管理等。 不过据非官方数据统计&#xff0c;在用对讲机中竟有近5成属于违规使用&#xff0c;这严重干扰了城市上空的无线电波秩序。 根据近年来无线…

多行 SQL 格式化换行调整(数据清洗、数据迁移)

多行 SQL 格式化换行调整&#xff08;数据清洗、数据迁移&#xff09; 原数据数据如下&#xff1a; select * from user_info;select * from user_info; select * from user_info;INSERT INTO student VALUES (107, zhao, NULL, 3, 北京); select * from user_info;INSERT INT…

哪个骨传导蓝牙耳机的好,几款高性能的骨传导蓝牙耳机分享清单

骨传导耳机是目前在运动领域最火热的产品&#xff0c;也是最适合运动的耳机&#xff0c;它的原理是通过颅骨将声音转化为神经冲动&#xff0c;通过内耳传至听觉中枢&#xff0c;因此不会对耳朵造成任何损伤&#xff0c;它同时也可以让耳朵更好地听到周围的声音。能够很好的提高…

hbuilderx+uniapp基于安卓的古汉语学习考试系统 微信小程序

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括古汉语学习软件APP的网络应用&#xff0c;在外国学习软件已经是很普遍的方式&#xff0c;不过国内的古汉语学习软件可能还处于起步阶段。古汉语学习软件具有古汉语、学习视频等…

2013 年一月联考逻辑真题

2013 年一月联考逻辑真题 真题&#xff08;2013-26&#xff09;-可能性推理的因果关系 26.某公司自去年初开始实施一项“办公用品节俭计划”&#xff0c;每位员工每月只能免费领用限量的纸笔等各类办公用品。年末统计时发现&#xff0c;公司用于各类办公用品的支出较上年度下降…

深度:解密智能汽车产业的3个世纪之问!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 汽车行业正在经历一场前所未有的变革&#xff0c;要理解这场深刻的汽车变革&#xff0c;我们从全新的电子电气架构&#xff0c;核心零部件的大量替换&#xff0c;到全新的制造工艺&#xff0c;探究电动车与燃油车的本质区别…

防雷工程中防雷等级的意义

在现代社会中&#xff0c;各种电子设备和通信系统已经成为我们生活中不可或缺的一部分。然而&#xff0c;雷击是这些设备和系统的一个常见问题&#xff0c;不仅会导致设备损坏&#xff0c;还可能对人们的生命财产造成威胁。因此&#xff0c;防雷措施变得尤为重要。 为了保护设…

OC 知识 多线程 GCD(源码)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

Unity与Android交互(2)——常用交互方式

常用AndroidJavaClass/AndroidJavaObject实现C#调用Java代码&#xff0c;常用UnitySendMessage实现Java调用C#代码。 【调用代码示例】 Java代码为&#xff1a; package com.test.addtest;import com.unity3d.player.UnityPlayer;public class JavaTestClass {public static…

BM1684X移植自写算法记录

移植步骤------------------------------------------------------------------------ 首先搭建好自己的网络模型&#xff0c;并导出为onnx格式--具体可以参照--> https://github.com/warren-wzw/MNIST-pytorch.git 将onnx模型使用tpu-mlir工具转化为bmodel格式--具体可以…

2.3 TensorRT基于Entropy的校准

tensorRT的Entropy Calibration的伪代码&#xff0c;具体流程如下&#xff1a; for循环&#xff1a;遍历所有可能的分割点&#xff0c;从128到2048reference_distribution_P&#xff1a;将原始直方图bins按照当前分割点i进行切割&#xff0c;得到左侧的i个bin。outliers_count…

构建新型智能化智慧档案馆十防一体化解决技术方案

HONSOR现代化智慧档案馆智慧档案库房自动化温湿度环境安全监控系统方案【推介】 目前&#xff0c;我国档案正处于现代化科技飞升的起点&#xff0c;以物联网、大数据、智能化、云计算等为标志的网络充斥到社会生活、生产的各个角落。在我国&#xff0c;档案馆产生与发展经历了一…

为了搞懂ERP,我连问 ChatGPT 30个问题,通透!

我对ERP有很多的疑问&#xff0c;这次向ChatGPT请教&#xff0c;连问30个问题&#xff0c;瞬间觉得通透了很多&#xff0c;以下是我的问题和ChatGPT的回复&#xff0c;分为概念篇、架构篇和生态篇三部分&#xff0c;希望能带给你新的启示。 一、概念篇 1、ERP是什么&#xff1f…

图论与算法(5)图的广度优先遍历应用

1. 广度优先遍历 1.1 树的广度优先遍历 树的广度优先遍历&#xff08;Breadth-First Traversal&#xff09;&#xff0c;也称为层次遍历&#xff0c;是一种按层次顺序逐级访问树节点的遍历方式。在广度优先遍历中&#xff0c;先访问树的根节点&#xff0c;然后按照从上到下、…

高频面试八股文用法篇(二) hive中几种排序类型区别

目录 排序函数 1、order by 2、sort by 3、distribute by 4、cluster by 总结 排序类型 1、order by order by是与关系型数据库的用法是一样的。select * from emp order by empno desc; 针对全局数据进行排序&#xff0c;所以最终只会有1个reduce&#xff0c;因…

开源 Golang 微服务入门一: HTTP 框架 Hertz

前言 从本篇笔记开始将介绍 Go 框架三件套&#xff08;Web / RPC / ORM&#xff09;&#xff0c;框架的学习有助于后续课程的学习以及大项目的完成。本文主要介绍字节跳动的开源 Golang 微服务 HTTP 框架 Hertz。先了解一下三件套的相关基本知识&#xff0c;做一下铺垫&#x…

ArgoCD(二)--部署

3.2 ArgoCD部署 ArgoCD部署官网&#xff1a;https://argo-cd.readthedocs.io/en/stable/getting_started/ ArgoCD有两种部署方式&#xff1a;多租户部署和核心化部署&#xff1a; 多租户 常用于多个应用程序开发团队提供服务&#xff0c;并由平台团队维护的场景&#xff1b; …

BPMN模拟动画执行流程

目录 第一步&#xff1a;构建BPMN图 第二步&#xff1a;开启模拟 第三步&#xff1a;执行模拟 第四步&#xff1a;监听模拟 第一步&#xff1a;构建BPMN图 通过id标记&#xff0c;每一个流程 第二步&#xff1a;开启模拟 BPMN官方提供了各种各样的模块&#xff0c;比如执行…

修改linux ssh 22 端口

1、找到 sshd 的配置文件&#xff0c;增加一行 Port 32586 ,默认是 22 端口&#xff0c;记得&#xff0c;先不要把 22 端口的这一行删除&#xff0c;或者注释&#xff0c;因为我们要先验证一下&#xff0c;我们修改后的端口是否可以使用&#xff0c;都ok后&#xff0c;再把 22 …