定时器开始时延时了十几秒_第六章--系统滴答定时器

2023-11-02

第六章--系统滴答定时器

简介:系统滴答定时器是内核(这里指M4)定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ

应用场合:

为UCOS系统提供时钟节拍

作为简单的定时器延时使用 //最大延时798ms

作为定时器中断使用

=======================================================

1.sTick定时器简介

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统"心跳"的节律。Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过, STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。SysTick定时器能产生中断, CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。

1.1有4个寄存器控制SysTick定时器,功能如表8.9至表8.12所示

-----------------------------------------------------------------------------------------------

2.系统滴答定时器框图:

分析框图写程序看要用到些什么

1. 先看框图左边有一个2选1选择器这是选择滴答定时器的时钟源的分内核时钟和外部时钟源

再看2选1选择器对过来是Sys Tick当前值寄存器 VAL 为24位向下计数器,可以存放的最大值为 2^24=16777216,如你写进100,SysTick控制及状态寄存器CTRL使能计数器后,当前值寄存器向下计数(100减到0),从而达到定时效果,当计数到0后产生一个中断信号Sys Tick控制及状态寄存器CTRL的状态标志位自动置1,如果使能中断则会产生中断,不关闭计数器重装载值寄存器LOAD就会把预先的值写进当前值寄存器VAL重新计数

时钟分析:

内核时钟源:168M

168M=168000 000/s=168/us

当前值寄存器写进16777216则最大延时时间99ms

16777216 /168 = 99864us = 99ms

外部时钟源:21M

21M=21000 000/s = 21/us

当前值寄存器写进16777216则最大延时时间798ms

16777216 / 21 = 798915us = 798ms

-----------------------------------------------------------------------------------------------

2. 分析框图可知要用到的相关寄存器及位如下

SysTik->CTRL :状态及控制寄存器

第2 位:时钟源选择

写0:外部时钟源(STCLK) 21M 系统时钟8分频

写1:内核时钟(FCLK)168M

第0 位:计数器使能

写0:禁止计数

写1:使能计数

第16位:当计数器自动计数到零的时候,此位自动置1(读取该位如果为0,定时时间未到,如果为1,定时时间到)此位需要软件清零

①通过读此位就会清零 SysTik->CTRL

②对当前值寄存器写任意值,此位也会清零 SysTick->VAL = 0xff

当前值寄存器 = 随便写一个数 ;//对状态控制寄存器的16位清零

SysTik->VAL :当前值寄存器

1)当使能计数器后,开始向下计数,当SysTik->VAL为0时,即计数到0时

控制及状态寄存器16位自动置1;

2)对当前值寄存器写操作,它自己本身也清零,状态控制寄存器的16位清零

SysTik->LOAD : 重装载值寄存器

根据要定时多长时间,可以把定时的时间,加载到当前值寄存器中,当计数器的计数值向下计数到了后如果不关闭计数器,那么LOAD的重装载值就会自动加载到计数器中,重新开始向下计数。

注意:最大值 21M 798ms

-----------------------------------------------------------------------------------------------

3.滴答定时器延时配置步骤:

1.选择时钟源->21M/168M

2.清零当前值寄存器->写进任意一个数据

3.向重装载值寄存器写进一个定时值

4.使能计数器

5.等待计数完成

6.关闭计数器

/************************************************

*函数名 :SysTick_us

*函数功能 :系统滴答定时器实现微妙级别延时

*函数参数 :u32 us

*函数返回值:无

*函数描述 :将需要延时的时间写入到参数中

***************************************************/

void SysTick_us(u32 us)

{

//时钟源选择21M //控制及状态寄存器的2位写 0外部时钟

SysTick->CTRL &= ~(1 << 2);

SysTick->VAL = 0xff; //将当前值寄存器清零 //随便写一个数据进入

SysTick->LOAD = us * 21; //将要计时的数据写入到重装载值寄存器

SysTick->CTRL |= 1 << 0; //开始计数//开计数器使能

while(!(SysTick->CTRL & 1 << 16)); // (16位为0) 等待计数完成为1计数完成

SysTick->CTRL &= ~(1 << 0); //关闭计数器

}

-------------------------------------------------------------------------------------

3.滴答定时器中断配置步骤:

1.选择时钟源->21M/168M

2.清零当前值寄存器->写进任意一个数据

3.向重装载值寄存器写进一个定时值

4.使能计数器

5.等待计数完成

4.系统滴答中断

注意:系统滴答属于系统中断,不需要使能NVIC中断响应通道系统滴答延时函数 不能同系统滴答中断一起使用

/************************************************

*函数名 :SysTick_ms_interrupt_init

*函数功能 :系统滴答定时器毫秒级别定时中断初始化

*函数参数 :u16 ms

*函数返回值:无

*函数描述 :将需要定时的时间写入到参数中

***************************************************/

void SysTick_ms_interrupt_init(u16 ms)

{

u32 pri;

/*系统滴答定时器配置*/

SysTick->CTRL &= ~(1 << 2); //时钟源选择21M控制及状态寄存器的2位写 0外部时钟

SysTick->VAL = 0xff; //将当前值寄存器清零->随便写一个数据进入

SysTick->LOAD = ms * 21000; //将要计时的数据写入到重装载值寄存器

SysTick->CTRL |= 1 << 1; //定时中断使能

/*NVIC控制器配置*/

//中断优先级分组(抢占和响应的位数) //抢占2位 响应 2位在主函数中

//中断优先级编码值(抢占和响应的具体级别)

pri = NVIC_EncodePriority(5,2,1);

NVIC_SetPriority(SysTick_IRQn,pri); //将优先级编码值写入到具体中断源中

SysTick->CTRL |= 1 << 0; //开始计数 //开计数器使能

}

/************************************************

*函数名 :SysTick_Handler

*函数功能 :

*函数参数 :无

*函数返回值:无

*函数描述 :

***************************************************/

void SysTick_Handler(void)

{

SysTick->VAL = 0xff; //向VAL寄存器写入一个值清除中断标志位

GPIOF->ODR ^= 1 << 8; //每次触发中断蜂鸣器响取反一次

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定时器开始时延时了十几秒_第六章--系统滴答定时器 的相关文章

  • Unity3D Shader之路 写Shader前必须要知道的事情3 ShaderForge的简单使用

    版本 unity 5 4 1 语言 Unity Shader Shader Forge版本 1 32 总起 在具体介绍Shader之前准备再写一篇有关于ShaderForge的 虽然我们可能使用代码来直接编写Shader 但拥有Shader
  • python基础——列表推导式

    python基础 列表推导式 文章目录 python基础 列表推导式 一 实验目的 二 实验原理 三 实验环境 四 实验内容 五 实验步骤 一 实验目的 掌握Python数据结构 列表推导式的用法 二 实验原理 列表推导式 list com
  • 「Python 基础」常用模块

    文章目录 1 内建模块 datetime collections namedtuple deque defaultdict OrderedDict ChainMap Counter base64 struct hashlib 摘要算法 摘要
  • Tomcat的基本认识和使用

    服务器 安装了服务器软件的计算机 通常都是高配置的计算机 服务器软件 接收用户的请求 处理请求 做出响应 web服务器软件 通过浏览器来进行访问的一种服务器软件 在web服务器软件中 可以部署web项目 让用户通过浏览器来访问这些项目 常见
  • 常见泰勒展开公式及复杂泰勒展开求法

    目录 https blog csdn net weixin 45792450 article details 104404432 初等的函数泰勒展开 e x e x ex e
  • 【OpenCv】相机标定介绍及python/c++实现

    针孔相机内外参标定简单介绍 之前有一个项目需要公司标内参 之前对这方面没有接触过 网上找了很多资料 记录下相机标定的基础知识 文章是个人浅显理解 如有错误还请指正 非常感谢 参考链接 坐标系转换 相机参数标定 camera calibrat
  • keil4 编译提示 ERROR L107: ADDRESS SPACE OVERFLOW

    单片机型号STC15F2K60s2 编译环境keil4 系统win7 模式 small 错误 ERROR L107 ADDRESS SPACE OVERFLOW 这个错误意思 提示地址超出 又去看了一遍数据手册 不应该是两k吗 为啥用了13
  • 动态链接(一)

    1 为什么要动态链接 静态链接的缺点 1 内存和磁盘空间 比如有两个程序 目标文件分别为Program1 o Program2 o 并且都用到Lib o这个模块 静态链接生成可执行文件Program1 Program2时 它们都分别存有Li
  • 在虚拟机里通过U盘引导安装Win10教程

    一 前言 打算在VM虚拟机里安装一个Win10系统 按照网上的教程 通过虚拟机的光驱加载 iso镜像文件来引导 发现启动不了 虚拟机一直停留在如下界面 推测可能是该 ios镜像文件里没有合适的引导程序 因此 打算尝试U盘启动 经过验证 发现
  • GNS3 FastEthernet1/10 is up, line protocol is down / SVI 无法连接的问题

    请重启三层路由器 三层路由器在打开的情况之下 连接上的设备貌似无法工作
  • K - Robotopia Kattis - robotopia

    题目链接 题解 题目其实类似于以前的解二元一次方程组 但是如果解出方程组后 会得到一个式子 但是如果仅仅代入式子的话是错误的因为假设是这样 5X 6Y 11 5X 6Y 11 这两个方程联立的话很明显是 X 1 Y 1 所以用这种方法不对
  • C语言密勒码的软件编码,密勒码的编码规则是什么?请画出代码序列11010010的密勒码波形?...

    相关题目与解析 CMI码的编码规则是什么 请画出代码序列11010010的CMI码波形 数字双相码的编码规则是什么 请画出代码序列11010010的双相码波形 简述双相码 曼彻斯特码 的编码规则并画出二进制比特序列1011010011的双相
  • k近邻算法的原理、示例与分析

    k近邻算法的原理 示例与分析 代码参考书籍 Python机器学习基础教程 Andreas C muller Sarah Guido著 张亮 译 北京 人民邮电出版社 2018 1 2019 6重印 实现环境 System Ubuntu se
  • Ubuntu查看CPU|GPU|型号等电脑配置

    电脑配置以及CPU 一个终极命令 可以包括以下命令显示的信息 cat proc cpuinfo alay ws sudo dmidecode grep Product Name Product Name Inspiron 3558 Prod
  • matlab以空间的点画球,3D空间画空洞小球Matlab程序

    3D空间画空洞小球Matlab程序 3D空间画空洞小球Matlab程序 有时候在三维空间中 需要画出很多的空洞小球 可以使用入戏的代码 clear all clc x y z sphere 100 hold on i 1 K 3 for c
  • 【C++入门】const和mutable关键字、常函数介绍

    1 常函数介绍 1 1 什么是常函数 1 常函数的定义 类的成员函数对类中任何成员不作修改而只能作访问的函数 简单来说 就是调用类的成员函数不会对类做任何修改 2 常函数的实现 常函数是依靠const关键字实现的 具体是在类中声明成员函数和
  • glDrawArrays,glDrawElements用法

    glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染基本图元 render primitives from array data 注 如果要 glDrawArrays 和 glDrawEleme
  • 面试题:【数据库二】mysql:explain解释器type关键字

    mysql的explain解释器的相关资源网上很多 这里我只记录一下我关心的Type列 type type字段的意思 当前sql扫描表的方法 type字段对应的value值 system gt const gt eq ref gt ref
  • Table master训练测试流程

    一 环境配置 参考 https github com JiaquanYe TableMASTER mmocr 由于依赖mmdetection 对版本的要求如下 Python 3 6 PyTorch 1 3 CUDA 9 2 GCC 5 在服

随机推荐

  • JavaScript 颜色转为十六进制

    const rgbToHex r g b gt 1 lt lt 24 r lt lt 16 g lt lt 8 b toString 16 slice 1 rgbToHex 60 115 255 运行结果
  • MobaXterm 突破14个session限制

    通常情况下 随着工作时间的增长 我们会保存许许多多的linux到本地的mobastream 然后当超过14个 就会被被限制 这个会让人很头疼 1 安装python 配置好环境变量 测试安装成功 2 基于项目进行解除限制 git clone
  • ListControl中判定双击哪一行哪一列

    NM DBLCLK消息 void CDBResultDlg OnNMDblclkListDb NMHDR pNMHDR LRESULT pResult int nRet 0 LVHITTESTINFO HitTestInfo LPNMITE
  • 代码审查(Code Review)

    1 代码审查概述 1 1 什么是代码审查 对计算机源代码系统化地审查 常用软件同行评审的方式进行 其目的是在找出及修正在软件开发初期未发现的错误 提升软件质量及开发者的技术 1 2 为什么要做代码审查 可以帮助提高代码质量 代码审查的初衷是
  • Geoscience knowledge graph in the big data era

    Geoscience knowledge graph in the big data era 记录我的学习心得 如有不妥 联系删除 Information 作者包括Chenghu ZHOU Hua WANG Chengshan WANG等人
  • 收到大量垃圾短信怎么办?如何屏蔽垃圾短信?

    手机要是突然收到大量垃圾短信 先不要急 原因可能是短信接口被刷 有人用大量短信轰炸来掩盖消费通知 什么意思呢 就是我们手机上各种购物APP或者第三方支付平台等会绑定银行卡 一些诈骗平台会通过大量短信轰炸来掩盖消费通知 就是银行卡被刷了 但是
  • vscoode中使用vue报错

    前言 为什么写了这篇笔记 因为今天我们学习了vue脚手架的知识 我最开始使用的是hb的命令控制台 他可以使用 我心血来潮 其实是因为vscode的美化太好了 想使用vscode打开vue的脚手架 所以我满怀期待的打开了vscode 1 报错
  • Hadoop总结之HDFS-Client端向HDFS中读写数据的流程

    一 Client向HDFS中存入数据 1 客户端通过Distributed FileSystem模块向NameNode请求上传文件 NameNode检查目标文件是否已存在 父目录是否存在 2 NameNode返回是否可以上传 不能上传会返回
  • 用Java编写,要求输出1~100内的素数。

    public class SuShu public static void main String args for int i 2 i lt 100 i boolean isSuShu true for int j 2 j
  • 接口(interface)和抽象类(abstract)的特点和区别

    接口 interface 和抽象类 abstract 的共同点和区别 进入这个话题之前我们先思考一下以下几个问题 1 我们为什要使用抽象类和接口 2 使用抽象类和接口有什么好处 3 我们在设计复杂程序时该怎么合理使用抽象类和接口 抽象类的特
  • huggingface tokenizers

    专注 NLP 的初创团队抱抱脸 hugging face 发布帮助自然语言处理过程中 更快的词语切分 tokenization 工具 Tokenizers 只要 20 秒就能编码 1GB 文本 功能多样 适用于 BPE byte level
  • Bootstrap typeahead使用问题记录及解决方案

    简单介绍 Bootstrap typeahead插件是用来完成输入框的自动完成 模糊搜索和建议提示的功能 支持ajax数据加载 类似于jquery的流行插件Autocomplete typeahead的使用方式有两种 通过数据属性字段的方式
  • 计算机网络 将TCP封装成CTCP类

    首先我们在之前TCP的基础上 进行了优化 解决了粘包问题 这里的解决方式是 在包头给出包的大小 接收端接收到包时 先解析出包的大小 再根据大小分配空间 解决粘包代码 SOCKET sockWaiter my map GetCurrentTh
  • 学生信息管理系统(C语言版+详解+源代码)

    我二二学生信息管理系统 C语言版 详解 源代码 相信受这篇的都是为了期末项目而发愁吧 那么这篇文章最适合你了 我送给大家保姆级的教程 一 相信有部分同学不知道用什么软件运行吧 知道的可以直接看二哦 我用的软件是Devc 给大家发个链接 期末
  • 微信小程序换行 br 无效解决方法

    在微信小程序中 不识别 br 等标签 如果文字中想要折行显示 可以使用 n替代 br 注意 使用 n的时候 一定是在
  • 报错解决:APIConnectionError 调用异常处理 (openAI api)

    1 报错 raise error APIConnectionError openai error APIConnectionError Error communicating with OpenAI HTTPSConnectionPool
  • 26岁曾月薪15K,现已失业3个月,我依然没有拿到offer......

    我做测试5年 一线城市薪水拿到15K 中间还修了一个专升本 这个年限不说资深肯定也是配得上经验丰富的 今年行情不好人尽皆知 但我还是对我的薪水不是很满意 于是打算出去面试 希望可以搏一个高薪 但真到面试环节几个问题就把我问懵了 有没有做过接
  • CH6- JS UI前端开发

    文章目录 前言 目标 1 JS前端开发基础 JS FA的使用 AceAbility 如何加载JS FA JS FA开发目录 2 个典型JS FA应用开发 构建页面结构 构建页面样式 构建页面逻辑 适配设备类型 3 构建用户界面 组件通用特性
  • 普利姆算法(Prim)

    普利姆算法和克鲁斯卡尔算法都是求连接图中所有结点的最短路径 也就是最小生成树 普利姆算法其实就是不断获取已经访问结点和未访问结点之间的最短边来获取所有结点间的最短路径 也可以认为是广度 贪婪 接下来看算法的实现 这里只给出关键代码 基本的图
  • 定时器开始时延时了十几秒_第六章--系统滴答定时器

    第六章 系统滴答定时器 简介 系统滴答定时器是内核 这里指M4 定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ 应用场合 为UCOS系统提供时钟节拍 作为简单的定时器延时使用 最大延时798ms 作为定时器中断使用 1 sT