MCU(RealTek)系统时钟及1ms中断设定
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
******************************************************************************* 学习内容:
1:Realtek的时钟
2:1ms 中断实现
3:volatile word time
20111027
******************************************************************************* 1:Realtek的时钟
如果把Scaler比作是一个系统的大脑,它控制着系统的各种动作行为;那么,时钟则可以比喻成是这个系统的心脏,它控制的是整个系统要以什么状态来工作,是兴奋亦或是休闲/睡眠。
时钟周期与机器周期的关系
时钟周期:指系统时钟频率,可以是直接来自外部XTAL,也可以是来自其它时钟来源,如PLL。
机器周期:指程序运行一个基本指令操作需要的时间,8051单片机需要12个时钟周期,AVR单片机只需要1个时钟周期,还有些单片的机器周期为6个时钟周期或者4个时钟周期。
Realtek的时钟周期来源可以有三个:
1:外部XTAL
2:内部时钟(Lower Power IC上才有)
3:外部XTAL经过M2PLL倍频分频后的时钟,在软体中的参数设定为:_EMCU_XTAL ,它的单位为K
以Lenovo Li2361机种为例:当XTAL使用的是27M Hz,实际系统正常跑的时钟为经过PLL倍频后的时钟:_EMCU_XTAL=33.5M Hz。
在DC OFF 或Powersaving时,时钟是以外部XTAL=27M Hz来跑。
具体设定看CMcuSelectFlashClk(bit select)这个函数:
由上可知,在正常模式下,系统使用频率比在powersaving或DC OFF时使用的时钟频率要高,相应系统的功耗会比较大。
因Lenovo_Li2361使用的这颗IC RTD2743PD并非LOW POWER 的IC,所以,它在POWER SAVING时,并未以一个更低的内部时钟来进行工作。
Realtek的嵌入式51内核的机器周期,可以是12个时钟周期,也可以是4个时钟周期,具体是以哪个机器来跑,可以参考寄存器:CKCON --8Eh,
当它设定为0x00时,表示当前的机器周期是以12个时钟周期来跑;
当它设定为0x01时,表示当前的机器周期是以4个时钟周期来跑。
在MCU初始化时,CKCON被初始化为0x00,表示系统的机器周期为12个时钟周期。
整个系统是使用哪一颗心脏在运行,就决定了这个系统在做某些行为的快与慢。
附件是之前在BenQ 机种上发生的一个BUG的视频文件,从中,我们可以看到,平常画OSD的速度是很快的,因为平常的情况下,整个系统的时钟心脏是在一个比较快的频率。
当某种条件下,系统的时钟心脏发生的突变,变成了以一个很慢的频率在动作时,连画一个OSD所需要的时候都变得很长,OSD可以认为是一点一点在慢慢的画出来。(这个BUG 目前依然无解,因为无法找到它是满足什么条件下进去了那么慢的时钟心脏,当然,会出现这么慢的情况还有另外一个可能,就是系统不断的执行中断,导致正常画OSD的动作被无限次中断给打断,导致速度变慢,我个人是倾向于是进入一个错误的时钟在跑整个系统。)
2:1ms 中断实现
软体中有设计一个功能:每隔1ms执行中断一次,用来作为系统的一些时间事件的计数使用,比如开机LOGO要2s后关闭,nosignal的OSD要6s后关闭等等。
1ms一中断的功能,Realtek的CODE是使用8051内部资源中的Timer0来实现的。
在AC一上电的时候,做CMcuInitial()时,把TMOD设定成0x11.
TMOD(定时器/计数器方式控制寄存器)介绍:
GATE:当GATE设定为0时,计时器/计数器是否能工作,取决于寄存器TRx是否为1,初始化时,TRx=0,计时器/计数器不工作,在程序往下执行时,TRx会被置成1,此时,计时器/计数器才能真正的开始工作。
C/T:选择它是作为计时器还是计数器来使用?
C/T=0:当前作为计时器使用
C/T=1:当前作为计数器使用
M1/M0:设定计时器/计数器的计数模式:
0/0: 13位定时/计数方式,最多能计到2的13次方,也就是8192次
0/1:16位定时/计数方式,最多能计到2的16次方,也就是65536次
1/0,1/1 :都是8位定时/计数方式,最多能计到2的8次方,也就是256次
由上可知,Realtek的程序中,把TMOD=0x11,让Timer0/ Timer1都工作在计时方式,且都是设定为16位的计时器。
计时器中断介绍:
计时器中断可以用以下图形来形象的描述:
计时器可以比喻成一个水桶,当以每个系统时钟的速度往水桶里进水,在不做任何设定处理的情况下,要把一个16位计时器的水桶装满水,需要65536个时钟周期。当我们需要一个比较快的速度就让它装满水,只需要往桶里预先装一些水,再以这个系统时钟的速度往桶里装水,就可以实现在我们要求的时间内就产生一个溢出中断。
Lenovo Li2361机种使用的是一颗27M的XTAL,而正常工作的时候,系统时钟
_EMCU_XTAL=33.5M Hz。
正常工作时,计时器0的预丢值如下:
_TIMER0_COUNT_HBYTE = 0xF5
_TIMER0_COUNT_LBYTE = 0x39
由计时器0,工作在16位计时器模式下,预丢值为:0Xf539,这时,产生1ms溢出中断的时间计算公式如下:
其中:
t:表示溢出时间
M:表示系统机器周期,Lenovo Li2361的软体设定系统周期为12
F:表示系统时钟,Lenovo Li2361的软体设定下,正常工作时钟周期为33.5MHZ,DC OFF / PowerSaving下时钟周期为27MHZ
n:表示当前计时器工作模式是多少位的计时器,软体中设定为16位。
X:表示计时器的预丢值,正常工作时的预丢值为0XF539=62777
把以上参数带到公式: