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中断,只需要注册中断处理程序和开启中断即可。对于闹钟中断,还需要设置闹钟的寄存器,打开闹钟中断。