本帖最后由 youki12345 于 2015-9-20 17:47 编辑
讨论完了时钟我们再来看看R7F中一个非常重要的功能—12位间隔定时器。第一个问题就是这个定时器有什么?在数据手册开头就有非常醒目的一句话:按事先设定的任意时间间隔产生中断请求信号(INTIT),能用于STOP 模式、HALT 模式的唤醒触发。这说明12位间隔定时器的主要用途是在用于从各种模式下把MCU唤醒!那如果MCU不会进入HALT或STOP模式的话,该间隔定时器岂不是没用?我想用来作为操作系统的滴答定时器应该也是可以的。
首先,来看看该12位定时器的结构。如图所示,很多人说不知道如何看这个图,其实挺简单的。上方几个框框是12位定时器的内部结构图,里面写的就是和该定时有关系的寄存器名称,这些寄存器中最重要的就是ITMCH和ITMCL。当该模块中的“计数运行控制电路”控制12位计数器到达ITMCH和ITMCL所设定的值时中断触发,于是R7F就被唤醒!
为了控制这个12位定时器,我们必须了解下面4个寄存器的功能:
*运行速度模式控制寄存器(OSMC)
*外围允许寄存器0 (PER0)
*间隔定时器的控制寄存器H (ITMCH)
*间隔定时器的控制寄存器L (ITMCL)
1. 运行速度模式控制寄存器(OSMC)
这个寄存器比较简单,里面只有第4位是可用的,当该位为0时停止低速时钟运行,而当该位为1时位开始低速时钟。所以可以看做是12位间隔定时器的控制总开关。
2. 外围允许寄存器0 (PER0)
这个寄存器可用的位不少,但是仔细看数据手册会发现真正对12位间隔定时器有效的其实只有第七位TMKAEN,这个位为1时把低速时钟提供给12位间隔定时器使用,而当该位为0时不为12位间隔定时器提供时钟。不过值得注意的是,这位的设置必须在OSMC寄存器第4位已经设置为可用的前提下进行,否则是无效的。
3. 间隔定时器的控制寄存器H (ITMCH)
间隔定时器的控制寄存器L (ITMCL)
这两个寄存器的用途在前面已经说过了,就是为12位间隔时钟提供计算用的数的,由于是12位,所以要分为低8位和高4位。也就是说ITMCH中只有低4位可用做计数。这个12位的数应该是可以重复应用的,这点从上面的间隔定时器原理图中也能看出:R7F的定时计数并不是直接把ITMCx中的数减少或增加,而是有个专门的计数电路来和ITMCx进行比较!另外,ITMCH的最高位RINTE是控制定时器是否开始运行,为0停止,为1运行。下面这个例子说明了ITMCx在最大、最小情况下所得到的定时时间!
需要注意的是,在利用RINTE控制为选择停止或开启12位间隔定时器时,需要先操作TMKAMK和TMKAIF标记,奇怪的是这两个标记在整个文档中居然找不到。但从描述来看这两个寄存器应该和中断有关。应该是先把所有中断屏蔽,再把所有中断打开。至于为什么没找到这个寄存器的描述还要请瑞萨的工程师帮忙了!
最后一个问题,既然12位间隔定时器最长的间隔时间只有273Ms,那如果我需要更长时间的休眠怎么办呢?这个问题有个变通的方法,也就是可以每隔273ms把R7F唤醒1,2个时钟周期,然后又让他再度休眠!就像上面两个图所示!或者干脆不采用12位定时器进行唤醒,而采用外部中断的方法进行唤醒!