(1)timer0和timer1共同使用一个预分频器、timer2、3、4共同使用一个预分频器;
(2)时钟来源是PCLK_PSYS;
(3)timer0和timer1支持死区生成功能;
(4)定时器的时钟信号由PCLK_PSYS信号经过两级分频得到,其中第二级分频系数不是任意的,实际是一个多选一(1/1、1/2、1/4、1/8、1/16);
4.5、PWM定时器相关寄存器
4.5.1、TCNT 、TCNTB、TCNTO寄存器
(1)TCNT和TCNTB是一对寄存器。TCNTB是能查询到地址的寄存器,我们将要定时的时间间隔次数写入到该TCNTB寄存器;TCNT是没有寄存器地址的,
程序员不能去操作这个寄存器。定时器开始后,如果开启自动重加载则TCNTB的值在定时到后被硬件自动刷新到TCNT寄存器中,开启下一次定时;如果没有开启自动重加载,
则需要我们去操作寄存器手动将TCNTB中的值刷新到TCNTB中。
(2)TCNTO寄存器是做捕获计时的,读取出TCNTo寄存器的值可以知道还要多少次时间间隔TCNT寄存器中的值才减到零;
4.5.2、TCNTB、TCMPB寄存器
(1)TCNTB和TCMPB是用来产生PWM波的,TCNTB是定时的时间长度,也就是周期,TCMPB是在周期中高或低(查手册)电平有多少个时间间隔;
(2)假设时间间隔为1ms,TCMPB是高电平的间隔次数。TCNTB设置为1000,TCMPB设置为400,那么产生的PWM波的周期T=1000ms,占空比为400/1000=0.4。
4.6、死区生成器
timer0支持死区生成器,死区生成器和交流电整流有关,具体细节不太清楚,用不上死区生成器就把该功能关闭。
4.7自动重加载和双缓冲
(1)自动重加载:硬件会自动将TCNTB的值刷新到TCNT中,TCNT寄存器里的值每过一个时间间隔就减一,当见到0的时候就触发定时器中断。我们经常是需要循环定时,即本次定时结束后自动开始下一次的计时,有了自动重加载我们便不用每次定时结束都去把TCNTB中的值刷新到TCNT中。
(2)双缓冲:顾明思议就是两个缓冲区,有备份。比如TCNT和TCNTB就构成双缓冲,你可以在本次定时还没有结束就去设置TCNTB的值,这样下一次定时就是新的定时时间。自动重加载也是依赖双缓冲的,正是因为有TCNTB中的值做备份,当定时时间到后才能再把定时间隔刷新到TCNT中,开启一下次的定时。
4.8输出电平翻转器
就是将输出电平信号取反,比如PWM波的占空比是0.4,如果电平取反则PWM波的周期不变,占空比变成1-0.4=0.6。有寄存器控制电平翻转功能,根据自己需求判断是否开启。
4.9、设置PWM定时器
(1)将PWM波输出的GPIO引脚设置为PWM波输出功能;
(2)配置好PWM定时器的时钟频率;
(3)TCNTB和TCMPB寄存器写入根据PWM波的周期和占空比计算好的值;
(4)开启自动重加载功能;
(5)第一次启动时手动将TCNTB中的值刷新到TCNT寄存器中,不然第一次定时的时间将是默认值而不是你定时的时长;
(6)开启定时器;
5、看门狗定时器
5.1、看门狗介绍
(1)看门狗定时器默认到了定时的时间就会发出复位中断信号,让系统重启。是为了系统卡死后能够重启,不至于一直卡住;
(2)看门狗定时器可以关闭;
(3)看门狗定时器可以被设置成在到了定时的时间后不发出复位中断信号,而发出普通中断信号,当一个普通的定时器用;
(4)默认功能下,如果看门狗定时器开启,则要在定时时间到之前喂狗,在WTCNT寄存器减到0之前给WTDAT寄存器中重新写值以喂狗,因为WTCNT寄存器中的值减到零就会发出复位中断,导致系统重启;
5.2、看门狗定时器时钟框图
(1)看门狗定时器的时钟信号是PCLK_PSYS经过两级分频得到;
(2)看门狗定时器可以设置成发出复位信号,也可以设置成发出普通中断信号;
(3)两级分频器中,预分频器的分频系数是0-255,而第二级分频器实际是个多路选择开发,只能选择固定的分频系数。实际分频系数 = 预分频器分频系数 x 第二级分频系数;
5.3、看门狗定时器相关寄存器
(1)WTCON:设置分频系数、使能开关、设置发出复位信号还是普通中断信号
(2)WTDAT:设置定时的时间间隔,当你把值写到WTDAT寄存器后,硬件会自动把值刷新到WTCNT中;
(3)WTCNT:保存的看门狗定时间当前的计数值。需要注意,第一次启动前,必须先写一次WTCNT寄存器,否则第一次将是默认的定时时间间隔;
(4)WTCLRINT:清中断;
5.4、设置看门狗定时器(复位)
(1)设置分频系数;
(2)设置看门狗定时器发出复位中断信号还是普通中断信号;
(3)设置定时的时间长度:把计算好的值写入到WTDAT和WTCNT寄存器中;
(4)打开看门狗定时器;
(5)在定时的时间到之前去喂狗;
6、RTC
6.1、实时时钟介绍
(1)RTC(real time clock)是实时时钟,保存的是当前的时间点,包含年、月、日、时、分、秒、星期;
(2)RTC是Soc中的一个外设,自带晶振,有寄存器去记录时间(年、月、日、时、分、秒、星期),通过读取/写入这些寄存器来获取/设置时间。一般为了系统关机还能准确计时,会单独用电池给RTC供电;
(3)有的为了计时更加精确,会单独接RTC芯片,然后主控SOc去RTC芯片读取/设置时间;
6.2、RTC的结构框图
(1)有7个寄存器存储分别年、月、日、时、分、秒、星期,其中date寄存器保存的是星期;
(2)有专门的晶振(xrtCXTI、crtcxTO、XRTCCLKO);
(3)有闹钟模块,可以设置闹钟,和我们平时设置的闹钟功能是一样的;
6.3、闹钟发生器
(1)这个闹钟功能就是和我们平时的闹钟功能一样的,闹钟发生器就是在设定的时候里发出终端信号;
(2)闹钟发生器有一个控制寄存器和(年、月、日、时、分、秒)寄存器,先设置闹钟发生的时间,再打开相应的使能。
6.4、BCD码
(1)RTC中所有的时间(年月日时分秒星期,包括闹钟)都是用BCD码编码的,准确的是是8421 BCD码;
(2)因为时间相关的寄存器里存的数据都是BCD码编码的,所以我们在操作RTC寄存器时需要在BCD编码和十进制间进行转换。比如我们想设置分钟数为56,则往分钟寄存器里应该写0x56,我们需要写一个函数来将56转成0x56。
6.5、RTC相关寄存器
(1)INTP 中断挂起寄存器
(2)RTCCON RTC控制寄存器,比如使能、读写控制;
(3)RTCALM 闹钟的控制寄存器
(4)ALMxxx 闹钟功能有关的寄存器,保存闹钟功能设置的时间;比如ALMSEC(秒)、ALMMIN(分钟);
(4)BCDxxx 保存当前的时间,比如BCDSEC(秒)、BCDMIN(分钟);
6.6、年的设置
S5PV210中做了个设定,BCDYEAR寄存器存的并不是完整的年数(譬如今年2015年),而是基于2000年的偏移量来存储的,譬如今年2015年实际存的就是15(2015-2000)。还有些RTC芯片是以1970年其他的年份作为基点来记录的。
6.7、设置时间
(1)设置RTCCON寄存器打开RTC读写开关;
(2)往RTC的BCDxxx寄存器中写值,设置年、月、日、时、分、秒;
(3)设置RTCCON寄存器关闭RTC读写开关;
6.8、读取时间
(1)设置RTCCON寄存器打开RTC读写开关;
(2)往RTC的BCDxxx寄存器中读数据,读取年、月、日、时、分、秒;
(3)设置RTCCON寄存器关闭RTC读写开关;
6.9、设置闹钟
(1)设置好闹钟功能的时间寄存器ALMxxx;
(2)设置RTCALM寄存器,打开相应使能开关;
(3)绑定好闹钟功能的终端处理程序;
原作者:正在起飞的蜗牛