西比爱斯

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

1:定时器种类

H8的定时器有5个,加上前面说到的WDT总共有6个,定时器都是16位可编程定时器。它们可以提供如下功能:

(1):自由定时器

      最简单的应用,相当于一个自增的寄存器,溢出后从0开始,一般用来做时间统计等。

(2):周期寄存器

      给定时器一个比较值,每当到达这个比较值后触发一个CPU中断。

(3):PWM发生器

 

 

2:自由定时器

  作为最简单的应用,首先从H8的定时器组开始说起,在之后的章节中将不再描述这些内容。H8有5个定时器所以关于他们整体的机能设置有一些寄存器来控制。

TSTR:负责开启,关闭定时器。它对应的位为1后,定时器就开始工作了。

TSNC:负责管理哪些定时器是协同工作,如果全为0则所有定时器都是单独工作的。

TMDR:定式方式设置寄存器,负责设置定时器的工作方式,它的0-4位是设置定时器0-4的输出是否为PWM。第5位设置通道2的溢出位置1条件,为0时通道2的计数器

         向上溢出或向下溢出都会置1,为1时只有向上溢出的时候才会置1。第6位设置通道5的PWM相位。

TFCR:通道3和通道4是H8芯片最复杂的定时器,它能够相互互补工作,这样的话就能生成多相位的PWM信号。TFCR就是专门设置通道3,4协同的寄存器,在这里略。

TOER:和TFCR一样,这里不做讨论。

TOCR:PWM反相方面的设置,这里不做讨论。

 

这样的话,共用寄存器就是这几个了,对于具体的定时器还有不少私有的寄存器可以设置。

TCNT:这是可读可写的,但是一般来说都是读,因为它就是一个自增的计数器,不停的增加溢出后设置溢出位后再反复做。

GRA,GRB:比较寄存器,在想要实现周期中断的应用中,和TCNT比较输出中断的那个比较值就放在这两个值里面。可以选择和其中的谁对比。

BRA,BRB:只有在3,4通道里有,是缓冲寄存器,一旦GRA,B比较成功后BRA,BRB的值会马上填进去,这样的好处是什么?在做PWM的时候可以很轻松的做到不同的占空比。在本周期没有结束的时候不能设置比较寄存器,但是设置了缓冲寄存器后下一个周期就会设置到比较寄存器中。

TCR:选择时钟源和清零方式。

TIOR:选择在符合条件(比较,溢出)的时候输出什么数据,其实这是相位反转的技术根本,在0的时候设置输出为1.

TSR:状态寄存器,只有低三位有效,第3位就是溢出标记,每当超多0xFFFF的时候就会变为1.第二位和第一位是比较标记,等于GRA,GRB的时候置位。在某些应用中非常重要,因为常常需要进行溢出与否的检查来判断时间间隔是否正确。

TIER:TSR中的三个位对应三种事件,在定时器中最为重要的集中临界状态,但是TIER却可以通过设置来禁止上面三种事件发出中断,这样定时器就成了在内部运行但是无法输出东西的线程了。

 

有上可以看出,实现自由计数并不难,设置好时钟源,关闭中断功能,关闭PWM功能,打开定时器,就OK了。

1 VOID StartSchedule()
2 {
3 ITU0.TCR = 0x83;
4 ITU0.TIOR = 0x88;
5 ITU0.TIER = 0x00;
6 ITU0.TCNT = 0x00;
7 ITU0.GRA = 0;
8 ITU0.GRB = 0;
9
10 ITU.TSTR = 0x01;
11 }  

 

下面是10ms等待函数,在这个函数里如果现在的时钟计数和上次的计数之差为10ms的话,那么返回,否则就做点别的。这个函数是单片机系统里做周期的一种方式,在大量的函数调用完毕,到这个函数后它要求等待本周期完毕了才能通行。实现上述周期功能需要随时检查溢出寄存器位,如果溢出了计算方法会有些许差异。但是注意,这并不是最精确的设计,在转换为汇编后,每个计算周期的汇编语句也会占用时间,这也可以精确的计算出来。

 

1 VOID Wait_10ms()
2 {
3 U2 u2_curTimeCont = 0;
4 U2 u2_curBlankTime= 0;
5
6 _DI();
7
8 while(TRUE)
9 {
10 u2_curTimeCont = ITU0.TCNT;
11
12 if( ITU0.TSR.BIT.OVF == 0 )
13 {
14 u2_curBlankTime = u2_curTimeCont - tm_u2_lastTimeCount;
15 }
16 else
17 {
18 u2_curBlankTime = (U2)(0xFFFF - tm_u2_lastTimeCount) + u2_curTimeCont;
19 ITU0.TSR.BIT.OVF = 0;
20 }
21
22 if( u2_curBlankTime >= 0x7A12 )
23 {
24 break;
25 }
26
27 /* RAM CHECK */
28 }
29
30 tm_u2_lastTimeCount = u2_curTimeCont;
31
32 _EI();
33 }

 

 

(以上)

 

posted on 2009-12-18 15:38  西比爱斯  阅读(337)  评论(0)    收藏  举报