STM32——系统滴答定时器(SysTick寄存器详解)

文章目录

    • 1.SysTick简介
    • 2.工作原理
    • 3.SysTick寄存器
    • 4.代码延时逻辑
    • 5.附上整体代码
    • 6.一些重要解释

1.SysTick简介

Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数器,可以使用处理器时钟或外部参考时钟(通常是片上时钟源)。

2.工作原理

SysTick定时器的工作原理非常简单。它有一个内置的计数器,计数器从一个初始值开始递减,当计数器的值达到零时,它会触发一个中断并重新加载初始值。SysTick定时器一般会与系统时钟频率(通常是CPU时钟)同步工作,可以用来创建精确的时间延迟。
在这里插入图片描述

主要特性
定时器计数:SysTick定时器的计数器在每个时钟周期递减,直到它的值为零时会触发一个中断。
中断功能:当计数器到达零时,SysTick会触发一个中断,通常用于处理系统的定时任务(如操作系统的时钟中断)。
自动重载:SysTick有一个自动重载功能,计数器会从预定的值重新加载并继续计数。
可配置的时钟源:SysTick可以选择不同的时钟源,通常选择处理器的系统时钟,或者是外部的低速时钟源

3.SysTick寄存器

在这里插入图片描述

4.代码延时逻辑

  1. 选择时钟源
    在这里插入图片描述
    根据CTRL寄存器的第2位和第0位,来选择时钟源和是否使能定时器
    其中位0的意思是:位0=0 失能 关闭定时器
    位0=1 使能 开启定时器
SysTuck->CTRL&=(1<<2);//第二位为1.选择高速内部时钟
  1. 关闭计数器
SysTuck->CTRL&=~(1<<0);//第0 位为0,关闭定时器
  1. delay_us(num)
    在这里插入图片描述
    定时器计数为0时候,重装载值为倍乘数系统时钟,我这里用的F4,系统分频的是21Mhz,那么应该是211/21Mhz,
    周期=1/频率=1/168000000约等于0.00592us;这是系统时钟的周期,
    最大延时取决于分频的频率
    分频的频率为21Mhz,1个周期的时间为1/21000000s,大概为1/21us,所以倍乘数应该是21.
    在这里插入图片描述
    写入任何值将清零当前数值
SysTick->LOAD=num*value_us;//设置重装在制,其中num是系统时钟的频率,value_us是倍乘数,若num=42Mhz,则value_us=421,21Mhz,value_us=21,8M则value_us=8,原因看标签5的解释
SysTick->VAL=0;//计数器当前值清零
SysTuck->CTRL|=(1<<0);//第0 位为0,关闭定时器
  1. 等待计数完毕
    判断CTRL寄存器的第16位是否为1–》计数到0
    CTRL=1 &(1<<16)=1 while (!1)
    CTRL=0 &(1<<16)=0 while(!0)
while(!(SysTick->CTRL(&1<<16)))
  1. 清空当前值
SysTick->VAL=0;
  1. 关闭计数器
SysTuck->CTRL&=~(1<<0);//第0 位为0,关闭定时器

5.附上整体代码

//仿原子延时,不进入systic中断
void delay_us(u32 nus)
{u32 temp;SysTick->LOAD = 21*nus;SysTick->VAL=0;//计数器当前值清零SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源do{temp=SysTick->CTRL;//读取当前倒计数值}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达while(!(SysTick->CTRL(&1<<16)))SysTuck->CTRL&=~(1<<0);//第0 位为0,关闭定时器SysTick->VAL=0;//计数器当前值清零
}
void delay_ms(u16 nms)
{u32 temp;SysTick->LOAD = 21000*nms;SysTick->VAL=0;//计数器当前值清零SysTuck->CTRL&=~(1<<0);//第0 位为0,关闭定时器do{temp=SysTick->CTRL;//读取当前倒计数值}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达SysTuck->CTRL&=~(1<<0);//第0 位为0,关闭定时器SysTick->VAL=0;//计数器当前值清零
}

借鉴链接https://blog.csdn.net/weibo1230123/article/details/81136564?spm=1001.2014.3001.5506
以及还有一个之前的找不到了。。。

6.一些重要解释

  1. 为什么频率是21M时候,value_us=21,才是1us
    因为当时钟源选择21M的时候,1s时间计数为21M次
    T=1/f(时间是频率的倒数)
    当21M时,计数1次所产生的时间为1/21000000s,是1/21000ms,1/21us,所以*21是1us

  2. 最大延时
    当最大延时为21M时,24位计数器最大值为16777215
    16777215/21=798915us=798.915ms。

由上两点可以计算出若外部时钟源选择是8M时,则value_us=8,valua_ms=8000,最大延时为167.77215/8=2097152us=2097.152ms

  1. HAL_Init()会提前配置好HAL_delay的参数
    ①FLASH读取指令缓存、数据缓存
    ②设置中断组优先级
    ③设置SysTick作为基准时间源、配置1ms tick,复位后默认时钟源为HSI(内部高速时钟源)
    ④初始化底层硬件
    附上原始HAL_Init()函数源码,可看可不看
HAL_StatusTypeDef HAL_Init(void)
{/* Configure Flash prefetch, Instruction cache, Data cache */ 
#if (INSTRUCTION_CACHE_ENABLE != 0)__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE */#if (DATA_CACHE_ENABLE != 0)__HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */#if (PREFETCH_ENABLE != 0)__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE *//* Set Interrupt Group Priority */HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);//中断优先级分组4/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */HAL_InitTick(TICK_INT_PRIORITY);/* Init the low level hardware */HAL_MspInit();/* Return function status */return HAL_OK;
}

以上资料部分来自于《清华开发者书库 ARM Cortex-M3与Cortex-M4权威指南 (Joseph Yiu、吴常玉、曹孟娟、王丽红。) (Z-Library)》
书籍已上传到博客

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

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

相关文章

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…

使用 Conda创建新的环境遇到的问题

下载速度很慢 1、更新 conda update -n base -c defaults conda2、清理缓存 conda clean --all解决方法 方法 1&#xff1a;关闭严格的渠道优先级 检查是否开启了严格渠道优先级&#xff1a; conda config --show channel_priority 如果返回 strict&#xff0c;说明启用了严…

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

nginx-灰度发布策略(基于cookie)

一. 简述&#xff1a; 基于 Cookie 的灰度发布是一种常见的策略&#xff0c;它允许您根据用户的特定 Cookie 值将流量路由到不同的服务版本。这种方法可以确保只有满足条件的用户会看到新版本的功能&#xff0c;从而降低风险并便于监控和回滚。 二. 配置案例&#xff1a; 测…

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务&#xff0c;解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么&#xff1f; 了解后台任务和长时任务前&#xff0c;我们需要先明白鸿蒙的后台特性&#xff1a;所谓的后台&#xff0c;指的是设备返回主界面、锁屏、…

怎么用vs编python文件

用vs编写python文件的方法&#xff1a;1、安装python插件&#xff0c;在vs的Extensions扩展中搜索Python&#xff0c;如下&#xff1a; 2、安装完成后&#xff0c;就需要配置一下本地python解释器的路径&#xff0c;这个直接在settings.json文件中设置参数python.pythonPath就可…

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式&#xff08;Singleton&#xff09; 游戏实现中的唯一对象 在游戏开发过程中…

【工业场景】用YOLOv8实现工业安全帽识别

工业安全帽识别是一项重要的工作安全管理措施&#xff0c;旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型&#xff0c;可以实时准确地检测出工人是否佩戴安全帽&#xff0c;及时发现违规行为&#xff0c;为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…

打开idea开发软件停留在加载弹出框页面进不去

问题 idea软件点击打开&#xff0c;软件卡在加载弹框进不去。 解决方法 先进入“任务管理器”停止IDEA的任务进程 2.找到IDEA软件保存的本地数据文件夹 路径都是在C盘下面&#xff1a;路径&#xff1a;C:\Users\你的用户名\AppData\Local\JetBrains 删除目录下的文件夹&…

【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)

未经许可,不得转载。 今天我们将分享一个关于在 Bugcrowd 平台的 HubSpot 公共漏洞赏金计划中实现全账户接管的故事。 文章目录 正文SQL 注入主机头污染(Host Header Poisoning)负载均衡器主机头覆盖(Load Balancer Host Header Override)Referer Header 测试ORIGIN Heade…

[笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境

随着 DevOps 流程的普及&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;已成为现代软件开发中不可或缺的一部分。Jenkins 作为一款开源的自动化服务器&#xff0c;广泛应用于 CI/CD 管道的构建与管理。它不仅支持多种编程语言和工具链&am…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

Keepalived 进阶秘籍:全方位配置优化

文章目录 1.sysctl.conf参数优化2. limits参数优化3. global_defs模块区域4.vrrp_script模块区域5.vrrp_instance VI_1实例定义配置模块区域6. virtual_server模块区域7.Keepalived与Heartbeat、Corosync比较 前言&#xff1a; 作为一台Keepalived服务器&#xff0c;有必要对内…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容&#xff0c;这部分内容一定要认真掌握&#xff0c;这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#…

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…

基于Python的投资组合收益率与波动率的数据分析

基于Python的投资组合收益率与波动率的数据分析 摘要&#xff1a;該文通过研究马科维茨的投资组合模型&#xff0c;并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据&#xff0c;接着利用数据分析的黄金组合库&#xf…

Linux部署web项目【保姆级别详解,Ubuntu,mysql8.0,tomcat9,jdk8 附有图文】

文章目录 部署项目一.安装jdk1.1 官网下载jdk81.2 上传到Linux1.3 解压1.4 配置环境变量1.5 查看是jdk是否安装成功 二.安装TomCat2.1 官网下载2.2 上传到Linux2.3 解压2.4配置2.5 启动Tomcat2.6 验证是否成功 三.安装mysql四.部署javaweb项目4.1 打包4.2 启动tomcat 部署项目 …