1、计数器
计数器就是每隔一段固定的时间计数值就加一,于是我们可以根据计数值来计算时间:经过的时间=计数值x计数时间间隔。
2、定时器
2.1、定时器介绍
定时器具有计时的功能,类似于我们手机自带的倒计时功能。比如我们先给定时器设置计时一小时,当一小时之后定时器就会发出终端信号,提醒CPU该执行提前绑定好的中断处理程序。
2.2、定时器原理
定时器内部有一个计数器,当我们设定好计时的时间后,内部的计数器会通过计数值和计数时间间隔来计算经过的时间。当经过的时间等于设定的 计时时间,定时器就会发出终端信号,提醒CPU时间到了,该去处理相应的中断函数。定时的时间由计数值和计数时间间隔有关,其中计数时间间隔和定时器的时钟频率有关,假设时钟频率是1000,那计数时间间隔就是1ms;如果我们想定时1分钟,就需要将计数值设置为1000ms/1ms=1000。
3、PWM波定时器、看门狗定时器、RTC之间的关系
(1)三者都是和时间相关的外设,但是用途不同。PWM定时器和看门狗定时器是一类,都是用来定时一个时间段;RTC是关于时间点,用来得到当前的时间。 (2)PWM波定时器和看门狗定时器本质都是一样的,只是PWM波定时器是专门用来产生PWM波的,看门狗定时器是专门用来产生复位信号的;
4、PWM定时器
4.1、PWM波介绍
PWM是脉冲宽度调制,是占空比可变的脉冲波形。脉冲宽度调制是一种对模拟信号电平进行数字编码的方法。PWM波的两个重要概念: 周期T:PWM波是周期性的波形,每个周期里由一段高电平和一段低电平组成; 占空比duty:占空比就是一个周期内高电平的时间除以周期时间的商;
4.2、PWM波的典型应用
PWM波可以控制电机、蜂鸣器、LED灯等。PWM波就是不停的交替输出高低信号,我们通过设置PWM波的周期和占空比来实现对器件的控制。
4.3、S5PV210的PWM定时器介绍
(1)S5PV210芯片有5个PWM定时器,其中0、1、2、3各自对应一个外部GPIO,可以通过这些对应的GPIO产生PWM波形信号并输出;timer4没有对应的外部GPIO,因此不是为了生成PWM波形而是为了产生内部定时器中断而生的。 (2)S5PV210的5个PWM定时器的时钟源为PCLK_PSYS,timer0和timer1共同使用一个预分频器、timer2、3、4共同使用一个预分频器;每个timer有一个专用的独立的分频器;预分频器和分频器构成了2级分频系统,将PCLK_PSYS两级分频后生成的时钟供给timer模块作为时钟周期。
4.4、PWM定时器的时钟框图
(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)绑定好闹钟功能的终端处理程序;
|