Contents
- 1 第十三章 定时器
- 1.1 1、210定时器
- 1.2 2、寄存器
- 1.3 3、WDT
- 1.4 4、RTC
- 1.4.1 4.1、rtc
- 1.4.2 4.2、寄存器
- 1.4.2.1 4.2.1、INTP
- 1.4.2.2 4.2.2、RTCCON
- 1.4.2.3 4.2.3、TICNT
- 1.4.2.4 4.2.4、RTCALM
- 1.4.2.5 4.2.5、ALMSEC
- 1.4.2.6 4.2.6、ALMMIN
- 1.4.2.7 4.2.7、ALMHOUR
- 1.4.2.8 4.2.8、ALMDAY
- 1.4.2.9 4.2.9、ALMMON
- 1.4.2.10 4.2.10、ALMYEAR
- 1.4.2.11 4.2.11、BCDSEC
- 1.4.2.12 4.2.12、BCDMIN
- 1.4.2.13 4.2.13、BCDHOUR
- 1.4.2.14 4.2.14、BCDDAY
- 1.4.2.15 4.2.15、BCDDAYWEEK
- 1.4.2.16 4.2.16、BCDMON
- 1.4.2.17 4.2.17、BCDYEAR
- 1.4.2.18 4.2.18、CURTICCNT
- 1.4.3 RTC结构体
第十三章 定时器
这章代码,查看我的github地址:https://github.com/weiqi7777/s5pv210
1、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页):
2、寄存器
2.1、TCFG0
配置第一级两个预分频的预分频值,和PWM0,PWM1的死区时间。
2.2、TCFG1
用来选择第二级的时钟输入。
2.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时,会自动的自动载入。
对于开启定时器位,应该在定时器的参数都设置好后,最后才开启。
2.4、TCNTB和TCMPB
设置定时器的计数时长和占空比大小。
2.5、TINT_CSTAT
中断使能及中断状态:
3、WDT
看门狗,使用比较简单。就配置几个寄存器。WDT可以产生中断,也可以产生复位信号,当产生复位信号,中断就没有用了。
在usb调试模式下,WDT产生复位后,程序再次启动会失败。猜测原因是:复位后,将内部的iram寄存器的值给复位了,所以造成程序启动失败。所以在USB模式下,使用WDT的复位是没有用的。
4、RTC
4.1、rtc
实时时钟使用外部晶振32.768KhZ,可以使用备用电池进行供电。RTC能存储秒,分,时,星期,日,月,年。还具有闹钟的功能。
RTC可以产生两个中断,一个闹钟中断,一个是tick中断。
Tick中断就是利用RTC来产生一个周期性的中断信号,该信号可以提供给操作系统使用,当做时间片切换进程。
RTC框图:
所有的寄存器都是BCD格式,如果要往这些寄存器写值,需要设置RTCCON寄存器的第0位。
寄存器列表:
4.2、寄存器
4.2.1、INTP
中断状态寄存器,为1表示有中断产生,在中断处理中,需要将之清除,写1清除。
4.2.2、RTCCON
RTC时钟控制寄存器,设置RTC时钟输出是否时能,是否时能tick timer,tick timer时钟源选择,RTC是否使能,RTC修改是否使能。
4.2.3、TICNT
tick设置的时间值:
4.2.4、RTCALM
控制闹钟的时钟域哪些使能:
4.2.5、ALMSEC
闹钟的秒:
4.2.6、ALMMIN
闹钟的分:
4.2.7、ALMHOUR
闹钟的时:
4.2.8、ALMDAY
闹钟的日:
4.2.9、ALMMON
闹钟的月:
4.2.10、ALMYEAR
闹钟的年:
4.2.11、BCDSEC
秒:
4.2.12、BCDMIN
分:
4.2.13、BCDHOUR
时:
4.2.14、BCDDAY
日:
4.2.15、BCDDAYWEEK
星期:
4.2.16、BCDMON
月:
4.2.17、BCDYEAR
年:
4.2.18、CURTICCNT
tick的当前计数值:
RTC结构体
对于RTC寄存器,可以定义一个结构体,因为寄存器有些不是连续的,需要使用reserved进行占位。
初始化该寄存器组,可以使用以下方法,定义一个初始化的结构体。然后依次对寄存器进行赋值。
这里,不能使用memcpy,进行两个结构体数值的赋值。因为memcpy针对的是char *,每次赋值按字节为单位进行赋值。对于外设的寄存器,是要以字为单位进行访问的。
对于使用闹钟中断和tick中断,只需要注册中断处理程序和开启中断即可。对于闹钟中断,还需要设置闹钟的寄存器,打开闹钟中断。