weiqi7777

cortex-a8裸机系列:第十三章 定时器

0
阅读(731) 评论(2)

一、            210定时器

210532位的定时器。其中0-3是可以输出到外部管脚的,可以当做PWM使用。4是不能的,只能当做普通定时器使用。

clip_image002

         用的管脚是GPD00-3管脚

clip_image004

         使用的时钟是PCLK(一般是66M)0-1共享第一级的预分频器,然后各自有自己的第二级预分频(24816),还可以选择时钟是SCLK_PWM2-4共享第一级的预分频器,然后各自也有自己的预分频器(24816)。

         TCNTBx,是定时器的周期值,周期为TCNTBx  *  PCLKTCMPxPWM用来比较产生不同占空比。有两种,一种是当TCNTx大于TCMPx输出高,另一种是TCNTx小于TCMPx输出高。

         210使用TCNTx大于TCMPx输出低,不过可以开启输出翻转,使TCNTx大于TCMPx输出高。

clip_image006

 

         对于PWM0PWM1可以使用死区生成器。死区的时间是可以通过寄存器配置的。

clip_image008

 

寄存器列表(804页)

clip_image010

 

二、            寄存器:

1.    TCFG0

      配置第一级两个预分频的预分频值,和PWM0PWM1的死区时间。

clip_image012

2.      TCFG1

用来选择第二级的时钟输入。

clip_image014

 

3.      CON

timer的设置,开启或关闭定时,计数减为0自动载入或不载入,输出翻转是否使能,手动是否更新TCNTB,TCMPB,死区生成器开启和关闭,

clip_image016

         对于manual update位。当值1后,会马上将TCNTBn TCMPBn 值载入到TCNTn TCMPn,实现了马上更改寄存器值。而如果值为0,那么会在TCNTn计数到0时,才会将TCNTBn TCMPBn 值载入到TCNTn TCMPn

         对于auto|reload位,置为1,定时器一直工作,置为0,定时器只工作1次。

         在编程的时候,要注意,对于自动刷新,第一次的时候要打开,不过打开后,要关闭。不然定时器不能正常工作。在之后更改TCMPBn或者TCNTBn值后,定时器计数到0时,会自动的自动载入。

clip_image018

 

         对于开启定时器位,应该在定时器的参数都设置好后,最后才开启。

4.    TCNTBTCMPB

设置定时器的计数时长和占空比大小

clip_image020

 

5.      TINT_CSTAT

 中断使能及中断状态

clip_image022

 

三、            WDT

         看门狗,使用比较简单。就配置几个寄存器。WDT可以产生中断,也可以产生复位信号,当产生复位信号,中断就没有用了。

         usb调试模式下,WDT产生复位后,程序再次启动会失败。猜测原因是:复位后,将内部的iram寄存器的值给复位了,所以造成程序启动失败。所以在USB模式下,使用WDT的复位是没有用的。

四、            RTC

1.    rtc

实时时钟使用外部晶振32.768KhZ,可以使用备用电池进行供电。RTC能存储秒,分,时,星期,日,月,年。还具有闹钟的功能。

 

         RTC可以产生两个中断,一个闹钟中断,一个是tick中断。

         Tick中断就是利用RTC来产生一个周期性的中断信号,该信号可以提供给操作系统使用,当做时间片切换进程。

 

         RTC框图

clip_image024

 

         所有的寄存器都是BCD格式,如果要往这些寄存器写值,需要设置RTCCON寄存器的第0位。

 

         寄存器列表

clip_image026

2.    寄存器

1)     INTP

中断状态寄存器,为1表示有中断产生,在中断处理中,需要将之清除,写1清除。

clip_image028

2)      RTCCON

RTC时钟控制寄存器,设置RTC时钟输出是否时能,是否时能tick timertick timer时钟源选择,RTC是否使能,RTC修改是否使能。

clip_image030

clip_image032

3)      TICNT

tick设置的时间值

clip_image034

4)      RTCALM

控制闹钟的时钟域哪些使能。

clip_image036

clip_image038

5)     ALMSEC

闹钟的秒

clip_image040

6)     ALMMIN

闹钟的分

clip_image042

7)      ALMHOUR

闹钟的时

clip_image044

8)      ALMDAY

闹钟的日

clip_image046

9)      ALMMON

闹钟的月

clip_image048

10)              ALMYEAR

闹钟的年

clip_image050

时间值:

11)BCDSEC

clip_image052

12)BCDMIN

clip_image054

13)BCDHOUR    

clip_image056

14)BCDDAY

clip_image058

15)BCDDAYWEEK

星期

clip_image060

16)BCDMON

clip_image062

17)BCDYEAR

clip_image064

18)              CURTICCNT

tick的当前计数值

clip_image066

3.    RTC结构体

对于RTC寄存器,可以定义一个结构体,因为寄存器有些不是连续的,需要使用reserved进行占位。

clip_image067

       初始化该寄存器组,可以使用以下方法,定义一个初始化的结构体。然后依次对寄存器进行赋值。

       这里,不能使用memcpy,进行两个结构体数值的赋值。因为memcpy针对的是char *,每次赋值按字节为单位进行赋值。对于外设的寄存器,是要以字为单位进行访问的。

clip_image069

 

对于使用闹钟中断和tick中断,只需要注册中断处理程序和开启中断即可。对于闹钟中断,还需要设置闹钟的寄存器,打开闹钟中断。

clip_image071

  1. @xzy610030   

    A8还跑裸机啊...

    一步一步的来啊。从裸机到驱动

  2. A8还跑裸机啊...