当前位置:首页 > 单片机 > 单片机
[导读]上图是LPC1114系统滴答定时器(SysTick)的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器。其存在的主要目的是为嵌入式操作系统提供100

上图是LPC1114系统滴答定时器(SysTick)的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器。其存在的主要目的是为嵌入式操作系统提供100Hz(即10ms)的定时节拍。当然,也可以做为其它的普通定时等其他用途。下面是LPC1114用户手册上列举出的一些用途,你可以了解了解。

可编程设置频率的RTOS 定时器(例如100 Hz),调用一个SysTick 服务程序。

用于核时钟的高速报警定时器。

简单计数器。软件可使用它测量时间 (如:完成任务所需时间、已使用时间)。

基于丢失 / 命中期限控制的内部时钟源。控制和状态寄存器中的COUNTFLAG 位域,
可用于决定一个动作是否在设定的期限内完成,作为动态时钟管理控制环的一部分。

一、寄存器

系统定时器使用起来非常简单。它一共有4个寄存器:SYST_CSR、SYST_RVR、SYST_CVR、SYST_CALIB。定义如下所示:

4个寄存器中,校准寄存器SYST_CALIB不用我们考虑,出厂前就配置好了。这时,就剩下3个寄存器了。一共需要配置3个寄存器就可以完成工作的模块,你想想会很难使用吗?英文不好的同学,请看下面的寄存器翻译:

SYST_CSR寄存器,就是系统定时器控制和状态寄存器

SYST_RVR寄存器,就是系统定时器重载值寄存器

SYST_CVR寄存器,就是系统定时器当前值寄存器

1.SYST_CSR寄存器

翻译成中文的:

CSR寄存器用到的位有4个,bit0用于是否开启定时器,bit1用于是否产生中断,bit2用于选择定时器的时钟源是等于主时钟还是等于主时钟的一半,bit16是定时器的状态。

2.SYST_RVR寄存器

翻译成中文的:

RVR寄存器用到bit0~23,即24位数,这个值是定时器倒计时的初值,打开定时器以后,值会从此值倒计时到0,因为倒计时到0以后,又会从此值开始倒计时,所以定义里面叫这个寄存器位重载值。

3.SYST_CVR寄存器

翻译成中文:

CVR寄存器用到bit0~23,即24位数,这是一个状态寄存器,当定时器开始运作,这个值在不断地变化,从RVR寄存器获取初值以后,倒计时到0.

二、如何调用Keil自带的系统定时器函数

系统自带的Systick函数,由CMSIS(关于什么是CMSIS,去百度搜吧)提供,位于core_cm0.h文件,你可以在LPC1114工程中,如下地方找到:

双击上图红色框内的文件名称,打开对应文件。在core_cm0.h文件的最底部,有一个函数,如下所示:

__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1)>SysTick_LOAD_RELOAD_Msk)return(1);/*Reloadvalueimpossible*/SysTick->LOAD=ticks-1;/*setreloadregister*/NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);/*setPriorityforSystickInterrupt*/SysTick->VAL=0;/*LoadtheSysTickCounterValue*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;/*EnableSysTickIRQandSysTickTimer*/return(0);/*Functionsuccessful*/}

此函数就是CMSIS提供的系统定时器控制函数SysTick_Config()。在使用的时候,可以直接调用,函数有一个参数ticks。由函数内部的语句
“SysTick->LOAD = ticks – 1;”知道,ticks就是LOAD值,即重载值,表示两次中断的计数。

例如,要产生10ms的中断,可以在程序中如下调用函数:

Systick_Config(SystemCoreClock/100);

函数参数中的SystemCoreClock是当前主频的值,假如现在的主频是50MHz,SystemCoreClock就是50 000 000 ,50 000 000 /100=500 000。我们把参数带进去以后,LOAD=499 999,也就是说,定时器开始运行后,定时器的值会从499 999递减到0,进入中断函数,然后再次从499 999 递减到0,如此循环。

这时候,你心中会有一个大大的问号:“为什么从499 999递减到0就是10ms?”接下来,瑞生给你解答,其实很简单,不信听我说。

定时器运行,要知道“为什么从499 999递减到0就是10ms”,只要知道定时器每递减一个值需要多长时间就可以了。知道每递减一个值需要多长时间,那么递减500 000下,需要多长时间,就知道了。

要知道每递减一个值需要多长时间,就需要知道当前定时器运行的时钟是多少。由寄存器CSR知道,定时器的时钟有两种,一种是等于主频,一种是等于主频的二分之一,由CSR寄存器中的bit2决定。

函数中用到的寄存器名称和我们手册上给出的名称不太一样,但是你要知道,名称就是个代号,实际调用的其实是名称背后的寄存器地址。函数中LOAD就是我们之前说的RSR,VAL就是我们之前说的CVR,CTRL就是我们之前说的CSR。

函数中,对控制寄存器的bit0 bit1 bit2都置1,对照前面的寄存器定义可知,时钟设置为等于主频,打开系统定时器中断,允许定时器运行。

我们知道了时钟,就知道定时器每递减一个值需要的时间了,即:1/SystemCoreClock 秒,换算成毫秒即:(1/SystemCoreClock)*1000=1000/SystemCoreClock毫秒,即每递减一个值,耗时1000/SystemCoreClock毫秒。所以如果要使得10ms定时,即10/(1000/SystemCoreClock)=SystemCoreClock/100,回头看看前面定时10ms的参数,是不是这个值呢。以此类推,需要定时多长时间,你可以自己算一个参数带进去了,需要注意的是,LOAD值是个24位数,带进去的数不要超过24位数的最大值。还有一个需要注意的地方,就是LOAD值最小255,当你给LOAD值带进去小于255值,LOAD会自动变成255。

三、系统定时器中断函数怎么写

系统定时器的中断函数名称如下所示:

voidSysTick_Handler(void){}

有的童鞋会问,函数名称可以自己改吗?答案是不可以改,非要自己改一个,需要一定的步骤。接下来瑞生给你解答。

打开一个工程,双击startup_LPC11xx.h文件打开

在第74行,你可以看到系统定时器中断函数的名称,如下所示:

你不仅可以看到系统定时器中断函数的名称,所有的中断函数的名称,都已经写好了,在用其它模块的中断时,到这个地方找就对了。还有前面那个是否可以自己改的问题,你把这个地方的名称改了,就可以在.c文件中使用你修改后的名称了,不过为了程序的移植性统一性阅读性,瑞生建议大家不要修改。

四、写一个毫秒延时函数delay_ms()

1.自己配置寄存器(假设当前主频为50MHz)

staticvolatileuint32_tTimeTick=0;voidSysTick_Handler(void)//中断函数{TimeTick++;}voiddelay_ms(uint32_tms)//参数最大带入671{SysTick->LOAD=25000*ms-1;SysTick->VAL=0;SysTick->CTRL|=((1<<1)|(1<<0));//开定时器,开中断while(!TimeTick);TimeTick=0;SysTick->CTRL=0;//关定时器}

为什么主频为50MHz时,上面函数中与ms乘的数是25000?我在上面已经讲过了,这里我再讲一次,非常简单哦。CTRL寄存器bit2默认是0,也就是说默认的系统定

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭