datasheet

STM32学习笔记一一SysTick

2019-01-09来源: eefocus关键字:STM32  SysTick

1.简介


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


Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer。SysTick定时器的时钟源可以是内部时钟(FCLK, CM3 上的自由运行时钟),或者是外部时钟(CM3 处理器上的 STCLK 信号)。不过, STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。在 STM32 中 SysTick 以 HCLK(AHB 时钟)或 HCLK/8 作为运行时钟。 

ysTick 定时器能产生中断, CM3 为它专门开出一个异常类型。SysTick 定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。


2.SysTick timer工作原理


SysTick 是一个 24 位的定时器,即一次最多可以计数 2^24 个时钟脉冲,这个脉冲计数值被保存到 当前计数值寄存器 STK_VAL (SysTick current valueregister) 中,只能向下计数,每接收到一个时钟脉冲 STK_VAL 的值就向下减1,直至 0,当 STK_VAL 的值被减至 0 时,由硬件自动把重载寄存器STK_LOAD(SysTick reload value register) 中保存的数据加载到 STK_VAL,重新向下计数。当 STK_VAL 的值被计数至 0 时,触发异常,就可以在中断服务函数中处理定时事件了。


3.SysTick timer寄存器


SysTick—系统定时有4个寄存器,简要介绍如下。在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。


这里写图片描述


要使 SysTick 进行以上工作必须要进行 SysTick 进行配置。它的控制只有三个控制位和一个标志位,都位于寄存器 STK_CTRL(SysTick control and status register ) 中,


这里写图片描述


寄存器位作用


Bit0ENABLE:SysTick timer 的使能位,此位为 1 的时候使能 SysTick timer,此位为 0 的时候关闭 SysTick timer

Bit1TICKINT:为此位为 1 并且 STK_VAL 计数至 0 时会触发SysTick 异常,此位被配置为 0 的时候不触发异常

Bit2CLKSOURCE:为 SysTick 的时钟选择位,此位为 1 的时候 SysTick 的时钟为 AHB 时钟,此位为 0 的时候 SysTick 时钟为 AHB/8(AHB 的八分频)

Bit16COUNTFLAG为计数为 0 标志位,若 STK_VAL 计数至 0,此标志位会被置 1


4.SysTick timer配置

SysTick timer 理论上它的最小计时单位为AHB 的时钟周期,即 1/72000000 秒, 72 分之一的微秒。


4.1 定时时间的计算:

重装载计数器的参数为: SystemCoreClock / 1000000 , SystemCoreClock 为定义了系统时钟(SYSCLK)频率的宏,即等于 AHB (72M) 的时钟频率, 这个 SystemCoreClock 宏展开为数值 7200 0000。输入参数为 SysTick 将要计的脉冲数,经过 ticks 个脉冲(经过 ticks 个时钟周期)后将触发中断,触发中断后又重新开始计数。


这里写图片描述


ticks:重装载寄存器 LOAD 的赋值;


1/f:SysTick timer 使用的时钟源的时钟周期, f 为该时钟源(72 or 72 / 8)的时钟频率,当时钟源确定后为常数。


定时1us :tibks = 72000000 / 1000000,表示 72 个周期中断一次,所以定时时间 T = 72 * (1/72)= 1us。


SysTick 定时器的定时时间(配置为触发中断,即为中断周期),由 ticks 参数决定,最大定时周期不能超过 2^24个。


5.软件实现

#include "systick.h"


u32 systick;


//系统滴答初始化

void SysTick_Init(void)

{

    SysTick->LOAD = (uint32_t)(SystemCoreClock/1000000-1UL);    //72M时钟,一次1us

    SysTick->VAL = 0UL;

    SysTick-> CTRL = SysTick_CTRL_ENABLE_Msk  | //使能

                     SysTick_CTRL_TICKINT_Msk | //触发异常

                     SysTick_CTRL_CLKSOURCE_Msk;    //时钟源选择

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭滴答定时器

}


void delay_us(u32 time)

{

    (systick) = time;


    SysTick->VAL = 0;

    SysTick-> CTRL |= SysTick_CTRL_ENABLE_Msk;

    while((systick));

    SysTick-> CTRL &= ~SysTick_CTRL_ENABLE_Msk;

}


void delay_ms(u32 time)

{

    (systick) = time * 1000;


    SysTick->VAL = 0;

    SysTick-> CTRL |= SysTick_CTRL_ENABLE_Msk;

    while((systick));

    SysTick-> CTRL &= ~SysTick_CTRL_ENABLE_Msk;


}


//滴答中断

void SysTick_Handler(void)

{

    while(systick)

        (systick)--;

}


调用了 delay_us() 函数, SysTick 定时器就被开启,按照设定好的定时周期递减计数, SysTick 的计数寄存器里面的值减为 0 时,就进入中断函数,当中断函数执行完毕之后由重新计时,如此循环,除非它被关闭。

关键字:STM32  SysTick

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news010942850.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32驱动WS2812D全彩LED
下一篇:STM32学习笔记一一UCOSII(1)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32堆栈设置

1.堆和栈大小 定义大小在startup_stm32f2xx.sStack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem      
发表于 2019-04-16
STM32堆栈设置

STM32堆和栈(Heap & Stack)的资料理解

源起:在移植cjson的过程中,解析json包的时候发现动态内存分配不足而导致解析失败,为解决这一问题,而深入了解stm32的堆和栈。stm32的存储器结构。Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。FLASH存储下载的程序。SRAM是存储运行程序中的数据。而SRAM一般分这几个部分:静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率
发表于 2019-04-16
STM32堆和栈(Heap & Stack)的资料理解

STM32定义堆栈地址到ram区顶部

本设置针对stm32f103rbt6的设置,该芯片RAM大小为20kB,故RAM区地址范围为0x20000000—0x20005000,芯片信息如下图所示;第一步:设置.sct文件;;*************************************************************; *** Scatter-Loading Description Filegenerated by uVision ***; *************************************************************LR_IROM1 0x08000000 0x00020000  
发表于 2019-04-16
STM32定义堆栈地址到ram区顶部

STM32之程序如何防止堆栈溢出

近日为某个项目写了个草稿程序,即非正式程序,后来发现老是进入hardfaulthandler,原来是堆栈溢出,后仔细查看发现函数调用纵深太深,最多的时候可保持7个函数在堆栈中调用。因此有心得如下:一、函数调用不要纵深太深,即以下模式:main(){   fun1();}fun1(){  fun2();}fun2(){   fun3();}fun3(){  fun4();}fun4(){  fun5();}fun5(){  fun6();}fun6(){   fun7();}这样子main函数要调用fun1函数完成某个功能,则要一直调到
发表于 2019-04-16

stm32之堆栈

stm32中的堆栈设置keil编译完成时存储情况当编译成功时,会出现: BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632Code:程序代码部分RO-data: 程序定义的常量const tempRW-data:已初始化的全局变量ZI-data:未初始化的全局变量片中的:flash=Code+RO-data+RW-dataRAM=RW-data+ZI-data通过上面的BUILD可以看出,这个程序已经用了1600多的RAM,为什么会出用到这么多的RAM呢?在startup_stm32f10x_md.s文件中存在:St
发表于 2019-04-16

说说STM32的堆栈与内存

1.概念这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构中的堆栈(虽然其实规则一样)。这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。而不是什么手机内存卡之类。这里所说的flash,指的是用作为ROM的存储器,保存代码与常量数据。而不是动画制作。。。栈的生长方向:指的是入栈方向,从高地址向低地址生长叫做向下生长,或逆向生长;反过来就叫向上生长,或正向生长。STM32的栈是向下生长。2.内存中的堆栈安排确切地说,是keil mdk根据STM32的特性,对stm32的RAM甚至flash进行部署。编译工程后,在生成的.map文件里可以看到具体的安排。双击工程界面的工程根目录
发表于 2019-04-16
说说STM32的堆栈与内存

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved