cortex-a8裸机系列:第十三章 定时器
0赞一、210定时器
210有5个32位的定时器。其中0-3是可以输出到外部管脚的,可以当做PWM使用。4是不能的,只能当做普通定时器使用。
用的管脚是GPD0的0-3管脚
使用的时钟是PCLK(一般是66M),0-1共享第一级的预分频器,然后各自有自己的第二级预分频(2,4,8,16),还可以选择时钟是SCLK_PWM。2-4共享第一级的预分频器,然后各自也有自己的预分频器(2,4,8,16)。
TCNTBx,是定时器的周期值,周期为TCNTBx*PCLK,TCMPx是PWM用来比较产生不同占空比。有两种,一种是当TCNTx大于TCMPx输出高,另一种是TCNTx小于TCMPx输出高。
210使用TCNTx大于TCMPx输出低,不过可以开启输出翻转,使TCNTx大于TCMPx输出高。
对于PWM0和PWM1可以使用死区生成器。死区的时间是可以通过寄存器配置的。
寄存器列表(804页)
二、寄存器:
1.TCFG0
配置第一级两个预分频的预分频值,和PWM0,PWM1的死区时间。
2.TCFG1
用来选择第二级的时钟输入。
3.CON
timer的设置,开启或关闭定时,计数减为0自动载入或不载入,输出翻转是否使能,手动是否更新TCNTB,TCMPB,死区生成器开启和关闭,
对于manual update位。当值1后,会马上将TCNTBn,TCMPBn值载入到TCNTn,TCMPn,实现了马上更改寄存器值。而如果值为0,那么会在TCNTn计数到0时,才会将TCNTBn,TCMPBn值载入到TCNTn,TCMPn。
对于auto|reload位,置为1,定时器一直工作,置为0,定时器只工作1次。
在编程的时候,要注意,对于自动刷新,第一次的时候要打开,不过打开后,要关闭。不然定时器不能正常工作。在之后更改TCMPBn或者TCNTBn值后,定时器计数到0时,会自动的自动载入。
对于开启定时器位,应该在定时器的参数都设置好后,最后才开启。
4.TCNTB和TCMPB
设置定时器的计数时长和占空比大小
5.TINT_CSTAT
中断使能及中断状态
三、WDT
看门狗,使用比较简单。就配置几个寄存器。WDT可以产生中断,也可以产生复位信号,当产生复位信号,中断就没有用了。
在usb调试模式下,WDT产生复位后,程序再次启动会失败。猜测原因是:复位后,将内部的iram寄存器的值给复位了,所以造成程序启动失败。所以在USB模式下,使用WDT的复位是没有用的。
四、RTC
1.rtc
实时时钟使用外部晶振32.768KhZ,可以使用备用电池进行供电。RTC能存储秒,分,时,星期,日,月,年。还具有闹钟的功能。
RTC可以产生两个中断,一个闹钟中断,一个是tick中断。
Tick中断就是利用RTC来产生一个周期性的中断信号,该信号可以提供给操作系统使用,当做时间片切换进程。
RTC框图
所有的寄存器都是BCD格式,如果要往这些寄存器写值,需要设置RTCCON寄存器的第0位。
寄存器列表
2.寄存器
1)INTP
中断状态寄存器,为1表示有中断产生,在中断处理中,需要将之清除,写1清除。
2)RTCCON
RTC时钟控制寄存器,设置RTC时钟输出是否时能,是否时能tick timer,tick timer时钟源选择,RTC是否使能,RTC修改是否使能。
3)TICNT
tick设置的时间值
4)RTCALM
控制闹钟的时钟域哪些使能。
5)ALMSEC
闹钟的秒
6)ALMMIN
闹钟的分
7)ALMHOUR
闹钟的时
8)ALMDAY
闹钟的日
9)ALMMON
闹钟的月
10)ALMYEAR
闹钟的年
时间值:
11)BCDSEC
秒
12)BCDMIN
分
13)BCDHOUR
时
14)BCDDAY
日
15)BCDDAYWEEK
星期
16)BCDMON
月
17)BCDYEAR
年
18)CURTICCNT
tick的当前计数值
3.RTC结构体
对于RTC寄存器,可以定义一个结构体,因为寄存器有些不是连续的,需要使用reserved进行占位。
初始化该寄存器组,可以使用以下方法,定义一个初始化的结构体。然后依次对寄存器进行赋值。
这里,不能使用memcpy,进行两个结构体数值的赋值。因为memcpy针对的是char *,每次赋值按字节为单位进行赋值。对于外设的寄存器,是要以字为单位进行访问的。
对于使用闹钟中断和tick中断,只需要注册中断处理程序和开启中断即可。对于闹钟中断,还需要设置闹钟的寄存器,打开闹钟中断。