systick
系统滴答时间。这个定时器之前的文章已经讲过。这个是一个递减的定时器,有个模数寄存器。在此不多说。就是一个系统的模块,这个模块是集成在ARM M0+内核中的,其实主要是集成在NVIC 中的,NVIC也是ARM 内部模块,该模块的定时器,用该模块的时钟源来使能该定时器。以及模数计数器。总共只有四个寄存器。控制状态寄存器:主要包含一个COUNTFLAG 中断标志位,当计数器计数到0的时候标志该位,CLKSOURCE :可选择时钟源,默认为内核始终,有的厂家还会提供其他外设始终。TICKINT中断使能位,ENABLE计数器使能位。
RVR重载寄存器:每次计数器计数到0 的时候,都重载该值。
CVR计数器的值,记录当前的值。
CALIB校准寄存器:有的厂家将计算好的10ms的ticks值放入该寄存器。也就是说是厂商决定的,厂商烧入,则有,没有设置则没有。
TPM
这个寄存器是递增的。有三个模块,
分为主计数器,和通道计数器,也就是相当于一个计数器,分一个主模数,一个次模数。状态和控制寄存器(SC)中,通过CMOD 可以选计数的模式通过该计数模式可以选择时钟,是选择模块时钟还是选择时钟失效,还是选择异步外设时钟,。再经过PS分频,2(PS次幂)代表分频值,即将该时钟降频。 CPWMS:中心对齐PWM选择(即计数器的计数模式,这个也算该计数器的一个特色吧。比如一般来说计数器是1,2,3,4,5, 然后1,2,3,4,5 。通过该位置1,可以设置成1,2,3,4,5,4,3,2,1)。所以置1只能配出中央对齐的PWM.
该定时器有一个总的MOD模数值,该值用来控制该模块的一个总的中断请求置状态寄存器的TOF位,当计数器达到该值时,该请求。当然一定有一个中断使能位,就是TOIE中断使能位,。两个值一并即触发了中断服务历程。
TPM的分通道。每个模块也有自己的模数寄存器的值。就相当于,主计数器模数是5,从1数到5,通道模数是3,即从1数到3的时候就出发了通道相应的事件。
其实也就是说通过将该模块的计数值。当前通道通过一定的配置 ,根据计数器来进行相应的处理。通道中分为MSnB:MSnA该位控制模式的。ELSNB:ELSNA该两位控制的是边沿和等级。模式有0:输入捕捉(01上升沿,10下降沿,11上升或下降捕捉),1,输出比较(在通道的模数值和计数器的值相等的时候,01翻转电平,10清除电平即置0,11设置电平即置1),2边沿对其PWM(10重新加载的时候是高电平,匹配的时候是低电平,即先高后低,01或11先低电平后高电平),11输出比较(10在匹配的时候打出低电平,X1在匹配的是打出高电平)。后面两种其实是一种,不同的就是在重新加载计数器的时候是否有操作。
每个通道都有一个状态控制寄存器和模数值,包含一个标志通道的中断的标志位,该标志位每个通道都有,还有一个中断使能位,还有就是刚才提到的模式控制和边沿控制,外加一个DMA使能。
模数值和计数器的模数值一样都是16位的,
由于一个模块的通道都比较多,每个通道虽然都有这个中断标志,但是,模块中断只有一个,所以KL25有一个寄存器STATUE将总中断标志位TOF,和每个通道的中断标志位,都映射到一个寄存器中,这个标志都是写1清0的。
有CONFIG配置寄存器,配置计数器的模式,以及时钟源,以及触发方式,比如让计数器不计数,等到输入捕捉到一个上升沿就开始捕捉。等等。还有在调试模式和在等待模式下用的时间基数。
根据以上寄存器的功能可以配置一下的几种功能:
输入捕捉:一般用于编码器
采集输入脉冲的上升沿,下降沿或者上升沿下降沿都采集。采样周期得是计数器时钟的1/4。这其中还涉及到一个Nyquist定律。输入捕捉的时候,CnV就没有用了。
输出捕捉功能:一般用于打出方波波形,比如步进电机需要的方波波形
即只有在通道值和模块的计数器的值相等的时候,会操作,可以翻转,默认高,或者默认低。该脉冲周期是计数器周期的两倍
边沿对其的PWM;即在上面的输出比较功能的基础上添加在重载计数器的值得时候进行设置。形成方波脉冲波形。
中心对其的PWM:这个就比较复杂了。周期是模数的两倍。就是1,2,3,4,5,模数是5 ,通道的模数是3 ,当开始和结尾的时候有一次溢出中断,总中断,当1数到3的时候触发一次通道中断,当3数到5 再从5数到3的时候又触发一次通道中断,然后再从3数到1.
PIT: PIT有两个定时器,两个定时器可以连到一起去的。
该计数器的值和上面不一样,它是倒序的,跟systick有点像,从一个值往下递减,减到0的时候重新加载。该定时器还有两个寄存器表示生命周期,可以用来计算该计算机运行了多久,多长时间,对了,该定时器还有一个功能,就是累加(chain)也可以说连接吧,就比如KL25里面有2个TIMER,当第一个TIMER达到0的时候,第二个TIMER减1.
控制寄存器CR也没有几个功能,就是一个模块使能。和一个freeze
每个定时器都有以下的值:
PIT加载值,该值就是该计数器数到0的时候重新加载的值,
PIT当前值:计数当前计数器的值,
PIT时间控制寄存器。可以设置chain累加到前面一个计数器。timer0肯定没有这个功能。TIE中断使能位,TEN时钟使能。
PIT标志位:该位标志了计数器的值达到timer
LPTMR
低功耗定时器:
一共有四个寄存器:控制状态寄存器。预分频寄存器,比较值寄存器,计数寄存器
该定时器可以用外部的脉冲来进行使能,一共有4个外部引脚。
控制寄存器:TCF:定时器比较标志,
TIE:中断使能 TPS外部引脚使能 TPP引脚极性(上升沿递增,下降沿递增) TFC当计数器的值在TCF的时候复位,或者溢出复位。
TMS:时钟模式选择,定时器或者外部脉冲
TEN:定时器使能。
预分频寄存器:分配值,有2~65535 预分频时钟选择:PCS:与四个外部引脚相对应
比较值寄存器:比较寄存器,存储该值。
RTC:(实时时钟)
一共有8个寄存器:秒计数器:闹钟定时器,预分频寄存器,补偿寄存器,控制寄存器,状态寄存器,锁定寄存器,中断使能寄存器:
秒计数器TSR:1s递增一次
闹钟定时器TAR:当TSR达到TAR的值得时候,触发中断。
预分频寄存器,该值是对于32.768晶振来起作用的。预分频晶振的值。
补偿寄存器:可以对预分频进行设置,可以+-127进行配置。
控制寄存器,根据晶振的电容,CLKO晶振使能。OSCE晶振使能。
状态寄存器,锁定寄存器,中断使能寄存器:
Spring框架由7个模块组成,这七个模块为我们提供了企业级应用所需要的一切,我们可以自由选择使用其中的模块。事实上Spring提供了与其他框架和库的集成点,因此我们可以自由使用。但是《Spring in Action 第二版 中文版》中没有具体说明是有那七个模块组成,只是给出了一幅图,并对图中的每个模块做了一段解释。附图如下:深色部分是我自己加的,因为《Spring in action》中没有具体指出是哪个7个模块,所以我在网上查资料查到的结果是这7个模块就是我所标注的这7个深色的部分。
这里我选择其中两个模块给予说明,其他的请参考《Spring in Action 第二版 中文版》第一章。
Core:(核心容器)是Spring的核心容器,它为Spring框架提供了基础功能,他是最基本的Spring容器和Spring的DI所依赖的基础。其核心类是BeanFactory。
Context:(上下文模块)Spring的应用上下文建立在核心容器至上。如果说核心模块中的BeanFactory使Spring成为了容器的话,那么上下文模块就是使Spring成为框架的原因。这个模块的核心类是ApplicationContext,他扩展了BeanFactory,添加了对国际化,应用声明周期事件以及验证的支持,另外,这个模块还提供了许多企业级服务,如电子如见服务,JNDI访问,EJB继承,远程调用以及定时服务,并支持与模块框架(如Velocity和FreeMarker)的集成。一般我们的应用程序都是在这个基础上进行开发的。
单例模式就是一个类或者值能够被应用程序全局访问,并且始终是初始化创建的那个实例。单例模式是属于创建模式的范畴,它比较简单,但是,需要注意几个细节。
class DreamFactory{ //lazy instantiation private static DreamFactory dream = null; protected static DreamFactory getInstance(){ if(dream == null){ synchronized(DreamFactory.class){ return new DreamFactory(); } } return dream; } protected DreamFactory(){ System.out.println("Lazy instantiation ............"); } }
public class Singleton { public static void main(String []args){ // Miracle.getInstance(); DreamFactory.getInstance(); } }上面这个例子,采用了延迟初始化技术来创建单例。这种技术确保了单例在需要时才创建。另外, DreamFactory使用是protected 构造方法,这样确保了客户端不能实例化DreamFactory。有几点需要注意:这种实现方式不是线程安全的(修要加上synchronized才能保证去安全性)。另一种实现方式就比较简单、高效、线程安全。
class Miracle{ static Miracle miracle = new Miracle(); //early instantiation protected static Miracle getInstance(){ return miracle; } Miracle(){ System.out.println("-----Change your mind and work for your dream------------"); } protected void makeEffort(){ System.out.println("----Make a great effort for my dream----------"); System.out.println("----Never forget my dream for every moment------"); } protected void persistInDoing(){ System.out.println("------Do it day and night------"); } protected void study(){ System.out.println("------Study and overcome every difficulty-----------------"); } }