srm32的Systick

发布者:科技驿站最新更新时间:2017-01-21 来源: eefocus关键字:srm32  Systick 手机看文章 扫描二维码
随时随地手机看文章

(一) 背景介绍
在传统的嵌入式系统软件按中通常实现 Delay(N) 函数的方法为:
for(i=0;i<=x;i++); 
x--;            对应于N毫秒的循环值
对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实
现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时 N 毫秒的精确值。
针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用
Delay(N)。

(二) STM32 SysTick 介绍
Cortex-M3 的内核中包含一个 SysTick 时钟。SysTick 为一个 24 位递减计数器,
SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,
SysTick 计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发
中断 (如果中断使能情况下)。
在 STM32 的应用中,使用 Cortex-M3 内核的 SysTick 作为定时时钟,设定每一毫秒
产生一次中断,在中断处理函数里对 N 减一,在Delay(N) 函数中循环检测 N 是否为 0,
不为 0 则进行循环等待;若为 0 则关闭 SysTick 时钟,退出函数。
注: 全局变量 TimingDelay , 必须定义为 volatile 类型 , 延迟时间将不随系统时钟频
率改变。

(三) SysTick 库文件
使用ST的函数库使用systick的方法
1、调用SysTick_CounterCmd() -- 失能SysTick计数器
2、调用SysTick_ITConfig () -- 失能SysTick中断
3、调用SysTick_CLKSourceConfig() -- 设置SysTick时钟源。
4、调用SysTick_SetReload() -- 设置SysTick重装载值。
5、调用SysTick_ITConfig () -- 使能SysTick中断
6、调用SysTick_CounterCmd() -- 开启SysTick计数器

(四) SysTick 工程实战

外部晶振为 8 MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大
为HCLK/8),在这个条件下,把 SysTick 效验值设置成9000,将 SysTick 时钟设
置为9MHz,就能够产生1ms的时间基值,即SysTick产生1ms的中断。

第一步:配置RCC寄存器和SysTick寄存器



 1 /****************************************************************************

 2 * 名    称:void RCC_Configuration(void)

 3 * 功    能:系统时钟配置为72MHZ, 外设时钟配置

 4 * 入口参数:无

 5 * 出口参数:无

 6 * 说    明:

 7 * 调用方法:无 

 8 ****************************************************************************/ 

 9 void RCC_Configuration(void){

10   SystemInit();   

11   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOE,ENABLE);

12 }


写个RCC函数配置系统时钟和外设时钟使能


1 if (SysTick_Config(72000))            //时钟节拍中断时1ms一次  用于定时 

2 { 

3      /* Capture error */ 

4      while (1);

5 }

在主函数中调用库函数SysTick(72000)初始化系统时钟


第二步:配置SysTick中断函数

这里我们定义了一个static __IO uint32_t TimingDelay;全局变量, 用于我们使用 Keil 软件自带的逻辑分析仪来分析.


1 void SysTick_Handler(void)

2 {

3   TimingDelay_Decrement();

4 }

这是一个SysTick中断触发函数,里面调用一个TimingDelay_Decrement()函数,如下:



 1 /****************************************************************************

 2 * 名    称:void TimingDelay_Decrement(void)

 3 * 功    能:获取节拍程序

 4 * 入口参数:无

 5 * 出口参数:无

 6 * 说    明:

 7 * 调用方法:无 

 8 ****************************************************************************/  

 9 void TimingDelay_Decrement(void)

10 {

11   if (TimingDelay != 0x00)

12   { 

13     TimingDelay--;

14   }

15 }


TimingDelay_Decrement()负责全局变量 TimingDelay每次减1


第三步:编写Delay延时函数



 1 /****************************************************************************

 2 * 名    称:void Delay(__IO uint32_t nTime)

 3 * 功    能:定时延时程序 1ms为单位

 4 * 入口参数:无

 5 * 出口参数:无

 6 * 说    明:

 7 * 调用方法:无 

 8 ****************************************************************************/  

 9 void Delay(__IO uint32_t nTime)

10 { 

11   TimingDelay = nTime;

12   while(TimingDelay != 0);

13 }


第四步:主函数中调用Delay



1 while (1)

2 {

3   GPIO_SetBits(GPIOB, GPIO_Pin_8);     //LED1 亮 

4   Delay(500);                         //延时500ms

5   GPIO_ResetBits(GPIOB, GPIO_Pin_8); //LED1 灭 

6   Delay(500);                         //延时500ms

7 }

第五步:仿真

设置一:采用软件仿真(右边是硬件仿真)

设置二:打开波形仿真界面

 

设置三:引入端口

设置四:执行与波形调整

设置五:硬件仿真

设置六:跟踪调试

 


关键字:srm32  Systick 引用地址:srm32的Systick

上一篇:GPIO及最小框架
下一篇:USART USART1收发功能工程

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

浅谈STM32F10X芯片SysTick系统时钟定时器
1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 SysTick控制及状态寄存器STK_CTRL SysTick重装载数值寄存器STK_LOAD SysTick当前数值寄存器STK_VAL SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: 配置SysTick系统时钟:SysTick_CLKSourceConf
[单片机]
STM32学习笔记:SysTick时钟
SysTick时钟,俗称“嘀嗒定时器”,它能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 它是由HCLK/8得到的,也就是:72MHz/8=9MHz。 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄存器的配置了: 可以看到SysTick共有4个寄存器. 注意看上面的CTRL寄存器的CLKSOURCE位(时钟源位),它有两个选择,一个是
[单片机]
STM32学习笔记:<font color='red'>SysTick</font>时钟
系统滴答SysTick两种实现方式
其实系统滴答就是一个24位的倒计时定时器,而且能够自动装置。仪器8位单片机如AVR/51要跑操作系统,需要专门占用一个定时器,但是由于优先级的原因很容易被其他程序打乱。而STM32以Cortex M3为内核,它专门开辟了一个硬件定时器,具有很高的优先级,即使在系统处于睡眠状态也能工作。我们使用系统滴答点亮LED灯的方法有两种: 第一种方法:就是将系统滴答作为普通的定时器,采用查询的方法。首先使用SysTick- LOAD装置初值,即要倒计的值。然后时钟SysTick- CTRL控制寄存器使能计数器工作在连拍模式,也就是计数减到0的时候,会出现一个标志位:COUNTFLAG,然后在使用while不断地查询这一位。按照这种编程方法封装的
[单片机]
STM32F10x 学习笔记之SysTick 定时器
SysTick 定时器被集成在NVIC中。因此,只要是Cortex-M3 内核的单片机,就都有它。这个学习笔记就用SysTick 定时器来实现走马灯的功能。 SysTick 定时器非常简答,只有四个寄存器。这四个寄存器的含义在《Cortex-M3权威指南》那本书中讲的非常的清楚,这里不复述了,下面只讲讲在STM32上SysTick有什么特殊之处。按照CMSIS 标准,用C语言访问这四个寄存器时使用的寄存器名称分别如下: SysTick- CTRL SysTick- LOAD SysTick- VAL SysTick- CALIB SysTick- CALIB 的值固定为9000,因此,只有当系统嘀嗒时钟设定为9MHz(
[单片机]
stm32学习之四
systick(滴答定时器): 系统的滴答定时器可以测试的例子是,将开发板上的LED等轮流点亮即可(我选择的是1s轮流点亮三个LED等)。 首先,系统滴答定时器的特点是,设置开启定时器的话,会自动计数,这个时候,计数到0的时候,会触发中断。 可以设置一个静态的变量,全局进行计数,从而延时。 步骤: 1、建立一个SysTick.h文件,代码如下: #ifndef _SYSTICK_H #define _SYSTICK_H #include stm32f10x.h void SysTick_Init(void); //void timeDecrement(void); void delay(__IO ui
[单片机]
stm32上最方便的定时器Systick[操作寄存器+库函数]
Systick 是stm32上一个用处很多的内设,所有基于arm-cortex m3 的芯片都有这个定时器,所以考虑到平台的可移植性时,可以多使用Systick。 Systick 是一个24位数据宽度的倒计数定时器,其计数范围只能到 1677215(2^24),当计数到0时会从RELOAD寄存器 中自动重装定时初值。只要不把SysTick的控制及状态寄存器中的使能位清除,计数器就不会停止。 SysTick 可以产生中断、设置中断优先级,有专门的中断处理函数SysTick_Handler().库函数作为ST公司自己的推出的框架, 在中断这方面做了更为细致的处理。 库函数包含的头文件是 stm32f10x.h 这个文件中 列出
[单片机]
stm32上最方便的定时器<font color='red'>Systick</font>[操作寄存器+库函数]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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