STM32 中 SysTick时钟的配置

发布者:智慧启迪最新更新时间:2018-07-17 来源: eefocus关键字:STM32  SysTick  时钟 手机看文章 扫描二维码
随时随地手机看文章

SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值。



systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。


SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。

SysTick的重装寄存器决定了定时器频率。


若SysTick的时钟源是72M,   SystemFrequency = 72000000Hz

所以 SysTick_Config(SystemFrequency / 1000); 就是1ms时基。

//     1/1000 s=1ms





STM32中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定时器的用法。


关键字:STM32  SysTick  时钟 引用地址:STM32 中 SysTick时钟的配置

上一篇:利用STM32的SysTick设计精确延时函数
下一篇:STM32笔记:使用SysTick测量程序的运行时间

推荐阅读最新更新时间:2024-03-16 16:09

基于STM32设计的智能空调
一、项目背景 随着人们生活水平的不断提高,对居住环境的舒适度要求也越来越高。空调作为一种重要的家电设备,已经成为了现代家庭中必不可少的一部分。本文介绍了一种基于STM32的智能空调设计方案,可以自动地根据环境温度进行温度调节。 二、设计思路 2.1 整体构架 智能空调系统由温度检测传感器、微控制器、OLED显示屏、按键及直流电源等组件构成。传感器用于检测环境温度,通过微控制器进行处理后,将结果输出到OLED显示屏上展示。按键可根据需求调整预设阀值,切换模式等操作。 2.2 硬件设计 (1)温度检测传感器 选择DS18B20数字温度传感器作为本系统的温度检测器件。该传感器具有精度高,响应速度
[单片机]
基于<font color='red'>STM32</font>设计的智能空调
STM32系统滴答_及不可不知的延时技巧上
我想每个单片机爱好者及工程开发设计人员都有过点灯的经历。流水灯是个好东西,尤其是在调试资源有限的环境中,有时会帮上大忙。 然在最初入门时,如何让这些小灯们按照我们的想法欢快地跑起来呢,绝大多数小朋友的做法是:在一个while循环里加上延时程序,让小灯在每个状态下停留一段时间,再进入下一个状态,这样小灯们就会在不同的状态中切换,就可以根据我们设计的程序闪烁了。 这样这里就会涉及到一个延时程序的编写的问题,而一般的做法是一个for循环里去减一个很大的数,直到为0,则延时完成,那个数的值则是根据时钟频率和指令运行周期,估算出来的,还记得较久以前看过一篇帖子介绍51单片机精确延时的几种方法,有一种方法是在keil中设定好时钟频率,
[单片机]
<font color='red'>STM32</font>系统滴答_及不可不知的延时技巧上
基于AT89C52单片机实时时钟程序编写
#include‘reg52.h’ //包含单片机寄存器的头文件 #include‘intrins.h’ //包含_nop_()的头文件 sbit RS=P2^0; //LCD读写选择位 sbit RW=P2^1; //LCD读写选择位 sbit E=P2^2; //LCD使能端 sbit BF=P0^7; //忙信号 sbit SCLK=P1^0; //1302时钟输出端 sbit DATA=P1^1; //1302数据端 sbit RST=P1^2; //1302复位端 unsigned char code digit[]=“0123456789”; void delay1ms(unsigned int n) { un
[单片机]
基于AT89C52单片机实时<font color='red'>时钟</font>程序编写
s3c2440裸机-时钟编程(一、2440时钟体系介绍)
1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线。 不同总线对应不同的时钟。 SOC - FCLK AHB - HCLK APB - PCLK 其中: 1.使用AHB总线的有:LCD控制器、usb控制器、中断控制器、内存控制器等... 2.使用APB总线的有:i2c、spi、timer、gpio、adc等...具体上图。 2.时钟框架 下图表示2440 Soc的时钟框图: 下面从细节上讲解时钟体系: 1.如何选择时钟源: s3c2440时钟源有2个,一个是OSC,一个是外部时钟EXTCL
[单片机]
s3c2440裸机-<font color='red'>时钟</font>编程(一、2440<font color='red'>时钟</font>体系介绍)
STM32驱动DP83848注意事项
检查STM32的MAC时钟是否已开启。 检查以太网50M的时钟是否正确配置。 检查STM32的以太网复用IO是否连接到重映射端口上。 检查STM32的以太网RMII端口是否已正确初始化,IO端口的时钟是否已开启。 检查连接DP83848的RST引脚的IO是否已初始化。 检查DP83848的CONFIG引脚在复位状态下的电平是否正确。 检查DP83848的地址引脚配置是否与STM32中初始化定义的地址一致。 检查DP83848的时钟接法,如果是外接晶振,检查晶振是否起振,否则查看是否接到STM32的MOC脚,如果是,检查STM32是否已配置MOC脚输出50M时中。。。。。。。。。。。
[单片机]
STM32定时器中断应用实例
本文将介绍:通过STM32cube mx配置工程文件,实现定时器中断的功能; 实例中使用的是STM32F407芯片 ①STM32cube mx配置工程文件 ②代码实现 ①STM32cube mx配置工程文件 Step1:使能RCC、选择外部晶振 Step2:配置时钟树 Step3:使能TIM6、配置TIM6 ,1秒产生一次定时器中断 Step4:配置中断的优先级分组、中断优先级 Step4:使能串口、用于调试使用 Step5:生成工程文件 ②代码实现 Step1:编写串口输出重定向函数,用于调试使用;记得添加头文件stdio.h Step2:开启定时器中断 Step3:自定义定时器中断服务函数 先在
[单片机]
<font color='red'>STM32</font>定时器中断应用实例
STM32系列第28篇--游戏手柄
FC手柄,大致可分为两种:一种手柄插口是11针的,一种是9针的,可以直接和DR9的串口头对插。 FC手柄有10个按键(实际上只有8个): 上、下、左、右、Start、Select、A、B、A连发、B连发。 A和A连发是一个键值,而B和B连发也是一个键值,只是连发按键当你一直按下的时候,会不停的发送(方便快速按键,比如发炮弹之类的功能)。 FC手柄的控制电路,由1个8位并入串出的移位寄存器(CD4021),外加一个时基集成电路(NE555,用于连发)构成。读取手柄按键值的信息十分简单:先Latch(锁存键值),然后就得到了第一个按键值(A,下降沿采集),之后在7个Clock的作用下,依次读取其他按键的键值,总共8个按键键值。 读写时
[单片机]
<font color='red'>STM32</font>系列第28篇--游戏手柄
基于单片机C8051F021和时钟芯片实现定时采集存储系统的设计
随着科技的高速发展,现代工业测控领域的很多应用中都需要实现大量数据的定时采集存储。以为海流计设计的海流数据采集存储接口电路为例,介绍一种定时采集存储系统的工作原理及其实现方法。 1 总体结构 在很多情况下,尤其是恶劣的工作环境下,高性能的单片机和大容量的Flash存储器是数据采集存储系统的最佳选择,本文介绍的系统也是基于这样的考虑。系统硬件结构并不复杂,包括高性能单片机C8051F021、实时时钟芯片SD2300、大容量Flash存储器K9G8G08及其外围电路,如图1所示。工作原理也较为简单,通过串口将单片机C8051F021与海流计相连,通过对单片机的编程实现对海流计的控制和使用。同时,为了实现定时采集和数据存储的功能,还
[单片机]
基于单片机C8051F021和<font color='red'>时钟</font>芯片实现定时采集存储系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved