当前位置: 首页 > 编程日记 > 正文

STM32学习笔记9(SysTick滴答时钟)

我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。

systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。(知道我为什么找ST关于systick的说明了吧)。

下面介绍STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:

STK_CSR,        0xE000E010  --  控制寄存器
STK_LOAD,     0xE000E014  --  重载寄存器
STK_VAL,        0xE000E018  --  当前值寄存器
STK_CALRB,   0xE000E01C  --   校准值寄存器

首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义

第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

STK_LOAD  重载寄存器:

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

 

STK_VAL当前值寄存器:

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

STK_CALRB  校准值寄存器:

这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:

位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用

位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms

位[23:0] :Calibration value

Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器:

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

//*                               SystemTick-Register                                 

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

#define SYSTICK_TENMS    (*((volatile unsigned long *)0xE000E01C))

#define SYSTICK_CURRENT  (*((volatile unsigned long *)0xE000E018))

#define SYSTICK_RELOAD   (*((volatile unsigned long *)0xE000E014))

#define SYSTICK_CSR       (*((volatile unsigned long *)0xE000E010))

 

配置systick寄存器:

void SysTick_Configuration(void)

{

   SYSTICK_CURRENT=0; //当前值寄存器

   SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M中断一次1mS

   SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位

 }

中断处理:

void SysTick_Handler(void) //中断函数

{

extern unsigned long TimingDelay; // 延时时间,注意定义为全局变量

 

SYSTICK_CURRENT=0;

if (TimingDelay != 0x00)

TimingDelay--;

}

利用systick的延时函数:

 

unsigned long TimingDelay;  // 延时时间,注意定义为全局变量

void Delay(unsigned long nTime)  //延时函数

{

SYSTICK_CSR|=0x07;   // 使能SysTick计数器

TimingDelay = nTime; // 读取延时时间

while(TimingDelay != 0); // 判断延时是否结束

SYSTICK_CSR|=0x06;// 关闭SysTick计数器

}

 

int main()

 {

  SystemInit0();    //系统(时钟)初始化

 stm32_GpioSetup (); //GPIO初始化

  SysTick_Configuration(); //配置systick定时器

 while(1)

 {

  GPIO_PORTB_ODR|=(1<<5);

Delay(1000); //1S

 GPIO_PORTB_ODR&=~(1<<5);

 Delay(1000); //1S                                                                             

  }

}

完成!Delay(1000);实现了1S的精确延时,利用Delay(unsigned long nTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法。

 

转载于:https://www.cnblogs.com/dustinzhu/p/4149906.html

相关文章:

oracle存储空间管理,Oracle存储空间管理

Oracle存储空间管理1.查看每个数据文件的剩余表空间(一个表空间只对应N个数据文件,N一般等于1)主要是利用表dba_free_space(表空间剩余空间状况)和dba_data_files(数据文件空间占用情况)select b.file_id  "文件ID",b.tablespace_name  "表空间名",b.f…

漫谈Httpclient

引用地址&#xff1a; http://hc.apache.org/httpclient-3.x/ End of life The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient andHttpCore modules, whic…

具体数学-扰动法

from scipy.special import combn int (input("n: "))k int (input("k: "))sum1 0for j in range(0, k):for i in range(0, n1):sum1 sum1 (i**j)*comb(k1,j)result ((n1)**(k1) - sum1)/comb(k1,k) print(result) python 中计算排列组合&#xff1a…

C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析

文章目录前言deque 实现deque类_Deque_iterator 类deque 的元素插入 insert函数deque如何模拟空间连续queue 实现stack 的实现前言 C容器中 deque是一个非常有趣的容器结构&#xff0c;我们知道deque本身是一个支持双向扩容的结构&#xff0c;对外表现出连续的存储方式。 本节将…

php好的mvc中index方法,创建一个mvc应用目录架构并创建入口文件index.php

摘要&#xff1a;<?php require vendor/autoload.php;require pig/Base.php;define(ROOT_PATH,__DIR__./);$configrequire pig/config.php;$queryStr$_S<?php require vendor/autoload.php;require pig/Base.php;define(ROOT_PATH,__DIR__./);$configrequire pig/confi…

C语言对mysql数据库的操作

C语言对mysql数据库的操作 原文:C语言对mysql数据库的操作这已经是一相当老的话题。不过今天我才首次使用&#xff0c;把今天的一些体会写下来&#xff0c;也许能给一些新手带来一定的帮助&#xff0c;更重要的是供自己今后忘记的怎么使用而进行查阅的&#xff01; 我们言归正传…

[转]MCC(移动国家码)和 MNC(移动网络码)

From : http://blog.chinaunix.net/uid-20484604-id-1941290.html 国际移动用户识别码&#xff08;IMSI&#xff09; international mobile subscriber identity 国际上为唯一识别一个移动用户所分配的号码。  从技术上讲&#xff0c;IMSI可以彻底解决国际漫游问题。但是由于…

虚拟机cenos 重置密码

许久不用虚拟机&#xff0c;临时想登录看下&#xff0c;结果想不起来密码了&#xff0c;尝试各种可能的密码都登录失败。然后百度查验各种方法&#xff0c;看到一篇文章然后根据上面说的成功解决了问题&#xff0c;贴出链接&#xff1a;https://blog.csdn.net/dannistang/artic…

g-git 相关命令 及其 基本原理探索 (一)

文章目录git 最小配置作用域git 创建本地仓库git log 查看版本演进.git 目录refs目录objectsgit 三种对象类型详解 (commit ,tree,blob)因为工作需求&#xff0c;接下来将从git的使用到其内部工作原理&#xff0c;来避免代码提交或者review或者版本管理上的一些尴尬&#xff0c…

php表单退出怎么写,PHP提交表单失败后如何保留填写的信息

[导读]本文章来给各位同学介绍PHP提交表单失败后如何保留填写的信息一些方法总结&#xff0c;最常用的就是使用缓存方式了&#xff0c;这种方法如果网速慢是可能出问题的&#xff0c;最好的办法就是使用ajax了。1&#xff0e;使用header头设置缓存控制头Cache-c本文章来给各位同…

lists,tuples and sets of Python

(python2.7.x) Lists 列表 列表是一个有序序列(集合)&#xff0c;可变的&#xff08;可以修改&#xff09;&#xff0c;可以理解为其他语言中的数组类型&#xff0c;但是列表更灵活更强大。 列表由方括号[]来定义的&#xff0c;它的元素可以是任意类型或对象&#xff0c;一个列…

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令

WScript.Shell&#xff08;Windows Script Host Runtime Library&#xff09;是一个对象&#xff0c;对应的文件是C:/WINDOWS/system32/wshom.ocx&#xff0c;Wscript.shell是服务器系统会用到的一种组件。shell 就是“壳”的意思&#xff0c;这个对象可以执行操作系统外壳常用…

控件绘制的方法

1处理WM_PAINT 最极端的选择是执行一个 WM_PAINT 处理程序&#xff0c;并且自己完成所有的绘制。这意味着&#xff0c;您的代码将需要进行一些与呈现控件相关的琐事 — 创建适当的设备上下文&#xff08;一个或多个&#xff09;&#xff0c;决定控件的大小和位置&#xff0c;绘…

google gflags的参数解析,便捷实用

命令行参数解析&#xff0c;一直是我们后段开发人员需要经常使用的一个功能&#xff0c;用来从终端解析接口的输入 &#xff0c;并做出对应的处理。这里为使用C/python的开发人员推荐一个便捷的命令行解析接口集 gflags。 我们之前使用C的getopt/getopt_long 函数需要自己使用…

linux进程下的线程数,Linux下查看进程线程数的方法

0x01&#xff1a;ps -ef只打印进程&#xff0c;而ps -eLf会打印所有的线程[rootcentos6 ~]# ps -ef | grep rsyslogdroot 1470 1 0 2011 ? 00:01:13 /sbin/rsyslogd -c 4root 29865 28596 0 22:45 pts/5 00:00:00 grep rsyslogd[rootcentos6 ~]# ps…

OpenCV学习(20) grabcut分割算法

在OpenCV中&#xff0c;实现了grabcut分割算法&#xff0c;该算法可以方便的分割出前景图像&#xff0c;操作简单&#xff0c;而且分割的效果很好。算法的原理参见papaer&#xff1a;“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一…

VMware workstation中rhel安装VMware tools失败

切换登录用户为root即可转载于:https://www.cnblogs.com/dazzleC/p/10555809.html

g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!

上一篇git 基本原理对git的使用以及文件分布已经有了一个整体的了解。 本篇将对工作中常用的一些git 操作命令的操作进行总结归纳&#xff0c;方便今后查阅。 文章目录1. 分离头指针2. 通过HEAD 来进行不同提交的差异对比3. 删除不需要的分支4. 对当前分支最近一次提交的messag…

Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换

题目描述&#xff1a;编写一个函数实现Linux文件寻址的算法&#xff0c;即读取文件当前位置到物理存储位置的转换函数&#xff0c;需要给出运行的测试数据&#xff0c;可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块…

datatable和dataset的区别

DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库&#xff0c;DataTable是一个内存中的数据表&#xff0c;DataSet里可以存储多个DataTabledatatable是dataset中的一个表另…

如何避免重构带来的危险

http://blog.jobbole.com/30049/ 重构代码很危险&#xff0c;它会给测试工作增加巨大的负担。除非你的程序需要重构&#xff0c;一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环&#xff0c;或把一个StringBuffer改成StringBuilder&#xff0c;我说的是大…

ip通信(第二周)

计算机网络分为局域网&#xff08;LAN&#xff09;、城域网&#xff08;MAN&#xff09;和广域网&#xff08;WAN&#xff09;。拓扑结构分为星型网&#xff0c;树形网&#xff0c;分布式网络&#xff0c;总线型网络&#xff0c;环型网络和复合型网络。认识了几个常见的国际标准…

《DDIA》读书笔记

数据存储系统的经典书籍&#xff1a; 从数据系统的特性开始&#xff0c;先讲单机存储引擎 再到 分布式存储系统&#xff0c;最后到一些数据流的处理方式&#xff0c;作者深入浅出&#xff0c;译者更是精雕细琢&#xff0c;本书需要细品。 将持续阅读整理&#xff0c;先从理论走…

linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网

前段时间下载了红帽的linux&#xff0c;版本为redhat 9.0&#xff0c;整整刻了三张CD。最初是为了体验一下linux下QQ聊天软件的功能&#xff0c;最后因内核太低(官方推荐内核在2.6以上&#xff0c;我下载的版本是2.4)而告终。最大的收获是了解了linux下文件系统及linux下软件与…

安卓天天酷跑脚本刷高分图文教程

http://news.gamedog.cn/a/20130923/241742.html

SpringBoot 中 JPA 的使用

前言 第一次使用 Spring JPA 的时候&#xff0c;感觉这东西简直就是神器&#xff0c;几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目&#xff0c;增加依赖 在 Intellij IDEA 里面新建一个…

《DDIA》读书笔记(一):可靠性、可扩展性、可维护性

这一节描述了密集型应用的基本思考方式。 可靠性。意味着系统发生故障&#xff0c;也能保持正常的运行。故障会集中在三个方面&#xff0c;硬件故障(通常是随机和不相关的)、软件故障(通常是系统性的bug,较难发现&#xff0c;较难处理)&#xff0c;人为故障(不可避免得时不时出…

TCP协议-TCP连接管理

TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

[Unity WWW] 跨域访问解决方法

什么是跨域访问 域(Domain)是Windows网络中独立运行的单位&#xff0c;域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后&#xff0c;2个域之间不但可以按需要相互进行管理&#xff0c;还可以跨网分配…

linux环境安全测评实验报告,linux第一次实验报告

iframe载入页面过程显示动画效果http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1加密算法使用(三)&#xff1a;用用BASE64采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到 package testEncrypt; import java.security.Key; import java.secu ...jav…