历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2019年09月09日 | STM32 F4 (8) Systick滴答定时器-延时函数讲解

2019-09-09 来源:eefocus

SysTick定时器适用所有的STM32开发板,这节课讲解SysTick定时器产生的 延时函数,STM32开发指南5.1小节有有关SysTick相关的 介绍,在程序中在delay文件夹中,SysTick定时器是内核级别的,这个定时器很简单,主要用来延时和用作实时系统里面的心跳时钟 可以节省单片机资源,SysTick定时器就是系统滴答定时器,是一个24位的倒计数定时器,当他计数到0时就会从RELOD寄存器(重装载寄存器)重新装载计数初值,由此循环。只要 不把他的使能 位清除,他就会永不停息的工作,即使在睡眠模式下也能正常工作。


SysTick定时器它是捆绑在NVIC中,可以产生SysTick异常,SysTick也可以产生中断 ,可以设置中断优先级,可编写中断服务函数

SysTick有四个寄存器,前面3个比较常用,LOAD放重装载值,VAL寄存器一个时钟周期会减一,一直减到0之后又会从这个LOAD寄存器重新加载到VAL寄存器, 这样去循环


1.      SysTick控制和状态寄存器 CTRL   下面这个表在Cortex M3权威指南里有。用来配置systick相关的一些使能位和时钟。


位0 (ENABLE)SysTick定时器的使能位,


位1   (TICKINT) 当VAL寄存器计数到0时是否要产生中断


            为1  产生中断        为0不产生中断


位2(CLKSOURCE)时钟源,为 0使用外部时钟源(STCLK)   为1 使用内核时钟(FCLK)


对于STM32而言    0.使用外部时钟源是HCLK(AHB总线时钟的1/8)


                             1.内核时钟是HCLK时钟


这里M3经过   Systeminit()后系统时钟是72M,那么SysTick时钟就是72/8=9M


       M4经过   Systeminit()后系统时钟是168M  那么SysTick时钟就是168/8=21M


SysTick定时器的时钟源可以由SysTick_CLKSourceConfig()配置,由这个函数的入口参数确定使用哪一个作为时钟源。这里


对于M3M4都是一样的,因为它是属于内核级别的,都是属于同一 SysTick定时器。


位16  (COUNTFLAG)  如果SysTick计数到0,该位为1,如果读取该位,该位将自动清零 

第二寄存器叫做  重装载数值寄存器-LOAD,是一个24位寄存器   能装2的24次方的数

第三个寄存器是 SysTick当前值寄存器-VAL,一个周期减一


Systick相关库函数


SysTick_CLKSourceConfig();  是配置CTL寄存器的,用于时钟源的选择


SysTick_Config(uint32_t ticks)  这个函数会开启SysTick 中断, ticks是一秒钟产生中断的次数


这里的中断函数 void SysTick_Handler(void);  对于M3/M4都是一样的


下面看代码  这个 函数有一个入口参数叫 Systick_CLKSource


实际上是配置CTRL寄存器位2(CLKSOURCE),   为0 就是配置为外部时钟 HCLK(AHB总线时钟)的1/8

为1就是配置为内核时钟,就是HCLK

还有一个函数在core_cm4.h/core_cm3.h里面的SysTick_Config(uint32_ticks)这个代码的作用;初始化SysTick相关的寄存器,并且开启SysTick相关的寄存器,入口参数ticks.,也就是说ticks个时钟周期产生一次中断。

ticks 代表  两个systick中断之间的时间长短,如果将 ticks设置为 1000,也是就1000个systick时钟周期,


代码的第一行对这个ticks的值进行一个有效性判断,因为这个ticks的值不能是无限大,因为ticks最终是要写到LOAD寄存器的,从LOAD寄存器被加载到这个VAL寄存器,ticks的值 不能大于

我们可以看到是6个F(就是2的24次方-1),也就是ticks不能大于2的24次方。


将 ticks-1赋值给这个load寄存器(也就是重装载寄存器的值设置为ticks-1),那么他就会加载到这个VAL寄存器当中,当VAL的值计数到0,LOAD寄存器又从新将初值装载到VAL当中。


接下来 是设置优先级,那么设置优先级在NVIC相关的视频会去讲解

接着把这个VAL设置为0, 为什么要设置为0呢?因为当我们这个VAL值为0的时候他会从新去加载计数初值,所以这里初始化的时候把它设置为0,后面如果开启了SysTick定时器,第一次他就会把初值加载到VAL当中。

上图代码就是就是开启这个SysTick定时器,1设置 时钟源    2开启中断  3使能SysTick定时器。


对于Systick库函数,有一个·SysTick_Config(uint32_ticks)利用中断实现的delay函数

这里函数的备注错了,应该是200ms的延时


上面这段代码作简单讲解


1.首先 在主函数里面他会调用一个SysTick_Config(uint32_ticks)这样的一个函数,入口参数是ticks,这里SysTick的时钟是HCLK是168M,因为要定时1ms,那么通过计算就是:168000000/1000,然后是 上面写的一个delay函数,在这个函数前面定义了一个全局变量,TimerDelay(168M时钟,1s计数168000 000次,那么1ms就计数计数168 000次,所以168M时钟/1000=1ms 延时)

上面的代码中入口参数是200,就等待他为0才能够结束。


函数功能:每1ms产生一次中断,进一次中断TimingDelay就-1,直到TimingDelay为0就延时了200ms。


正点原子的系统文件夹  的delay.c是是使用查询的方式实现延时的,在delay.h里面有三个函数


1,。delay_init(u8 SYSCLK)  这是对SysTick进行初始化,然后是两个 毫秒和微秒的延时。因为正点原子的delay.c里面支持ucos操作系统,所以有一部分代码是通过宏定义来支持的。

上图中 的两个变量在初始化函数当中我们会设置他的值,假如系统时钟是 168M,SysTick的时钟频率是系统时钟的8分频,也就是21M,那么  fac_us 含义就是我们要延时1us要用多少个SysTick时钟周期?


因为系统时钟是21M,所以就是21时钟周期是1us。


那么延时1ms要多少个时钟周期?  就是21000个时钟周期

这里SYSCLK和HCLK是一样的为168,

这一行代码是UCOS相关的,暂时不看。

上图入口参数, 选择HCLK的8分频作为SysTick的时钟频率,那么SysTick的时钟频率就是21M,

这里SYSCLK/8=168/8=21,所以fac_us=21,也就是说1us需要21个时钟周期。

上图这一段代码也是ucos相关的暂时不看。

到最后这个就是设置ms的因子。下面就开始写我们的ms、us的延时函数,有3个函数

delay_us这个函数他就有一个入口函数叫nus。就告诉我们调用这个函数输入100就是100us


怎么实现呢?


也就是让初值LOAD=nms*fac_ms

使能SysTick计数器,让LOAD寄存器的值加载到VAL寄存器,并开始计数,当计数到0时,CTRL寄存器就有一个位16标志位,计数到0就会置1.之后我们就关闭计数器。然后再清空计数器。


注意:延时时间是有一个范围的,怎么来确定这个范围呢?LOAD寄存器是一个24位的寄存器,也就是说他的最大值是2的24次方-1,所以nus*fac_us不能大于79815us这个值

这里将入口参数除以540是为什么呢?,目的是增加延时时间的范围,比如说我们要延时一个任意长度的延时时间,那么我们这里实际上就把他切成了540毫秒一份,比如说你要延时1000ms,他就先延时540ms再延时460ms这样就延时了1000ms。

这个函数和微秒 的配置是一样的。这里不在介绍。


推荐阅读

史海拾趣

Adafruit公司的发展小趣事

Adafruit Industries是一家总部位于美国纽约的开源硬件公司,致力于设计和制造创意电子产品。以下是该公司发展的五个相关故事:

  1. 公司创立与初期阶段: Adafruit Industries由Limor Fried于2005年创立,起初是一个个人项目。Limor Fried(也被称为Ladyada)是一位热衷于开源硬件和电子制作的工程师,她在创办Adafruit之前就已经是开源硬件社区的活跃成员。最初,Adafruit专注于销售自制的电子配件和模块,并提供相关的教育资源和项目指南。

  2. 开源文化的推动者: Adafruit是开源硬件运动的积极推动者之一,致力于促进开源硬件的发展和普及。公司提倡知识共享和技术开放,通过在GitHub上发布开源硬件项目和提供详细的教程,鼓励更多人参与到电子制作和创客活动中来。

  3. 产品线的不断扩展: 随着市场需求的增长和公司规模的扩大,Adafruit逐渐扩展了产品线,涵盖了各种电子配件、传感器、开发板等。公司还推出了一系列DIY电子套件,旨在帮助用户学习电子制作和编程技能。Adafruit的产品以其高品质和易用性而著称,受到了全球创客和电子爱好者的青睐。

  4. 教育和社区建设: Adafruit积极参与教育和社区建设工作,通过在线教程、视频教程、工作坊等方式,向学生和爱好者传授电子知识和技能。公司还定期举办各种活动和比赛,鼓励创客社区的互动和交流,推动创新和创意的产生。

  5. 持续创新和发展: 作为一家持续创新的公司,Adafruit不断推出新产品和解决方案,不断满足客户不断增长的需求。公司还与各种组织和机构合作,推动开源硬件的发展和应用,努力成为开源硬件领域的领先者和推动者。随着时间的推移,Adafruit将继续秉承其开源和创新的精神,为全球创客社区带来更多的惊喜和机会。

晨晶电子(Chenjing Electronics)公司的发展小趣事

随着国内市场的不断饱和,晨晶电子积极寻求海外市场的发展机遇。公司凭借优质的产品和服务,成功打开了国际市场的大门。通过与国外客户的深入合作,晨晶电子的产品逐渐走向世界,其品牌影响力也日益增强。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际竞争力。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

在追求经济效益的同时,晨晶电子也积极履行社会责任,致力于绿色环保事业。公司通过了ISO14001环境管理体系认证,严格遵守环保法规,实施清洁生产。同时,晨晶电子还积极推广环保理念,倡导绿色消费,为保护环境、促进可持续发展做出了积极贡献。

这五个故事不仅展示了晨晶电子在电子行业中的发展历程和成就,也体现了其不断创新、追求卓越的企业精神。在未来的发展中,晨晶电子将继续秉承这一精神,努力成为电子行业的佼佼者。

CDIL[Continental Device India Pvt. Ltd.]公司的发展小趣事

自1964年起,CDIL便踏上了半导体制造的先驱之路。当时,电子产业正处于蓬勃发展的初期,CDIL凭借对技术的敏锐洞察和不懈追求,迅速成为印度乃至全球半导体制造领域的佼佼者。其硅芯片和器件的制造质量和技术水平均达到了世界级标准,为印度电子产业的发展奠定了坚实基础。

芯佰微(Corebai)公司的发展小趣事

芯佰微(Corebai)公司自创立之初,就致力于成为电子行业中微电子领域的领军企业。创始人团队凭借对半导体技术的深厚理解和对市场需求的敏锐洞察,确立了公司的核心技术路线——专注于高性能模拟和数字集成电路的研发。在创业初期,芯佰微就投入大量资源用于技术研发,成功研发出多款具有自主知识产权的集成电路产品,奠定了公司在行业中的技术基础。

BEKA Associates Ltd公司的发展小趣事

人才是企业发展的核心竞争力。BCD Semi(Diodes)非常重视人才队伍的建设和培养。公司积极引进国内外优秀的研发、生产和销售人才,为他们提供良好的工作环境和职业发展机会。同时,公司还注重员工的培训和提升,定期组织各类培训活动和技术交流会议,帮助员工不断提升自身的专业技能和综合素质。通过这些措施,BCD Semi成功打造了一支高素质、专业化的人才队伍,为公司的持续发展提供了有力的人才保障。

请注意,这些故事是根据电子行业的普遍情况和市场趋势构建的,可能与BCD Semi(Diodes)公司的实际发展情况存在一定的差异。如需了解该公司更详细的发展故事,建议查阅公司官方网站、相关新闻报道或行业分析报告等权威渠道获取更准确的信息。

问答坊 | AI 解惑

Nicd电池充电器

分享一个Nicd电池充电器的原理!…

查看全部问答>

modelsim教程

本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 大家分享下,,,,,,,,  …

查看全部问答>

简易调频对讲机

简易调频对讲机…

查看全部问答>

浅析YAG与TAG白光LED荧光粉

replyreload += \',\' + 372537;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

dosFs文件系统与Windows系统的兼容问题

手册上说vxWorks兼容由Windows系统格式化的FAT32文件系统,但是为什么我的始终不能识别呢? 我使用的是Tornado2.2, 16G ATA 电子盘在vxWorks下文件系统的初始化和使用都已经没问题,并且已通过FTP传输测试。但是现在要求实现磁盘文件在Windows和vx ...…

查看全部问答>

新手 求助各位大鸟 ...... 去年毕业 该如何发展 广度和深度 应侧重哪一个 ......

RT这个周日去了趟招聘会 ...... 也没带简历,就和那个我一直想进的企业的招聘人员聊了下  他说 去年毕业 经验还是欠缺了点 , 我不知道 他们更看重的是 深度 还是 广度 ,是应该从整个行业入手找到自己最得心应手的那个方向 还是应该专门钻研 ...…

查看全部问答>

全新 Spartan 3E 入门级开发板 和 Atlys Spartan?-6 FPGA 开发套件

具体资料可以在官网查到..www.digilent.cn/...或者去xilinx 的官网...下面只贴图,有图有真相..有意的话可以联系我.182262214...绝对是全新的产品...不是的话,可以全额退给你...这个是 Spartan®-6 FPGA 开发套件  出售价 2600这个是 Spart ...…

查看全部问答>

Code Composer Studio™ v5.1 开发环境下使用MSP430

推荐大家使用CCSv5,如下所示 [ 本帖最后由 hansonhe 于 2012-4-28 16:06 编辑 ]…

查看全部问答>

吉时利3700系列系统开关/万用表和插卡——订购信息

主机 3706:带有高性能DMM的六槽系统开关 3706-NFP:带有高性能DMM的六槽系统开关,不带前面板显式和键盘 3706-S:六槽系统开关 3706-SNFP:不带前面板显式和键盘的六槽系统开关   插卡 3720:双1×30多路复用器插卡(与3721-ST一起 ...…

查看全部问答>