历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2019年01月09日 | STM32学习笔记一一SysTick

2019-01-09 来源:eefocus

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 时,就进入中断函数,当中断函数执行完毕之后由重新计时,如此循环,除非它被关闭。

推荐阅读

史海拾趣

东科半导体(DK)公司的发展小趣事

面对电源管理芯片市场需求的不断增长,东科半导体(DK)公司决定投资扩产。公司投资数亿元建设新的生产线和研发基地,提升产能和研发能力。同时,公司还加大了对新技术、新产品的研发投入,不断推出具有竞争力的新产品。通过投资扩产和加大研发投入,东科半导体(DK)公司进一步巩固了其在电源管理芯片市场的领先地位。

以上五个故事从不同角度展现了东科半导体(DK)公司在电子行业中的发展历程和成就。这些故事不仅记录了公司的成长轨迹,也反映了公司在技术创新、产学研合作、市场拓展和品牌建设等方面的努力和成果。

Etco Inc公司的发展小趣事

自1947年成立以来,Etco Inc公司一直致力于电子连接技术的研发与创新。在20世纪70年代,公司成功研发出一款新型的高性能连接器,该产品凭借其卓越的性能和可靠性,迅速在汽车电子行业中占据了一席之地。这一技术突破不仅为Etco带来了可观的市场份额,还奠定了其在电子连接器领域的技术领先地位。

Foxconn_Optical_Interconnect_Technologies__Inc.公司的发展小趣事

自1947年成立以来,Etco Inc公司一直致力于电子连接技术的研发与创新。在20世纪70年代,公司成功研发出一款新型的高性能连接器,该产品凭借其卓越的性能和可靠性,迅速在汽车电子行业中占据了一席之地。这一技术突破不仅为Etco带来了可观的市场份额,还奠定了其在电子连接器领域的技术领先地位。

台湾富致(FUZETEC)公司的发展小趣事

Futaba Electric最初起源于收音机收讯真空管的制造,但在1970年,公司做出了重大的战略调整,决定结束真空管业务,专注于萤光表示管(VFD)的生产。这一决策标志着公司从传统电子元件向高级显示技术的转型。随着VFD技术的不断发展,Futaba凭借其在清晰度、视角和亮度方面的卓越表现,逐渐在全球VFD市场中占据领先地位,目前市场份额超过60%。这一转型不仅使Futaba成为VFD技术的领导者,还为其在汽车仪表盘和抬头显示器等领域的广泛应用奠定了基础。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

华瓷(Chinocera)公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,华瓷始终坚持创新引领的发展战略。公司加强与高校、科研机构的合作,共同研发新型陶瓷材料和生产技术。同时,华瓷还积极引进国内外先进的生产设备和制造工艺,不断提升自身的产业水平和核心竞争力。

问答坊 | AI 解惑

大赛用芯片资料

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 芯片资料  …

查看全部问答>

RIL驱动

最近在看RIL驱动,其中的MDD和PDD部分不是很理解,而且在看代码的过程中无法联系在一起,请各位大侠指教!!~~…

查看全部问答>

淘宝上的linux开发板能买不??

我是新手,以前都是跟着导师做单片机的。感觉单片机有点“不过瘾”的感觉,想往高深的学。想学linux下嵌入式编程,但是身边又没有的这方面的资源。于是想买一块开发板子。请问:淘宝上的那种便宜的开发板比如像2410、2440板子能买不?? 问题1:开 ...…

查看全部问答>

请问一般公司会招聘底层开发(驱动开发)的应届生吗

本人在校学生,最近做的项目都用到了一些驱动的开发,感觉底层这方面的编程比普通的软件开发难度大一点。如果是软件公司招聘的话,他们会招聘新手吗?个人感觉做这方面的真正开发,都是有多年经验的老手。…

查看全部问答>

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。 …

查看全部问答>

2812调试时关于看门狗的一些问题

2812调试时关于看门狗的一些问题 大家好, 我目前正在调试一块自己做的2812的板子,遇到关于看门狗的一些问题: 一点连续运行按钮程序就跳到3FFC00处(此处应该是复位向量),而点单步运行的时候程序可以走的.点连续运行的时候用示波器观察reset引脚,发 ...…

查看全部问答>

机械电能表到电子式电能表讲义

机械电能表到电子式电能表讲义,从事电能表行业可以看看哦! [ 本帖最后由 aishuang 于 2011-7-16 12:22 编辑 ]…

查看全部问答>

人人都爱易电源

人人都爱易电源——转发有礼!https://bbs.eeworld.com.cn/thread-352431-1-1.html…

查看全部问答>

请大家看看我这个串口的程序哪里不对??很多乱码

单片机的接收端是连接的GPS信号, 发送端连接的是GPRS的接收。 单片机就是把收到的经纬度找出来传给GPRS,用UDP发送。 只要不连GPS, 发送的数据就完全正确。 连了GPS之后,数据就乱了,GPS是一直在发送,速度很快 #include #include #incl ...…

查看全部问答>

用户指南方框图怎么看

看用户指南的方框图,有的看不懂。 方框地下那个凸形状的是什么逻辑。什么用?…

查看全部问答>